【问题标题】:C# Update Bool value to DatabaseC# 将 Bool 值更新到数据库
【发布时间】:2023-03-29 23:33:01
【问题描述】:

我有两个收音机盒子。一个是真的,另一个是假的。我立了一个flag 但它没有用。这是我现在的代码

string sqlStatement;
SqlConnection cnn = new SqlConnection(Properties.Settings.Default.cnnString);

cnn.Open();
SqlCommand cmd = cnn.CreateCommand(); 
cmd.CommandType = CommandType.Text;
sqlStatement = string.Format("UPDATE Results SET Finish = '{0}', Place = '{1}', FinishTime = {2}, Winnings = '{3}' Where ResultsId = '{4}' " + (rdoDidFinish.Checked ? 1 : 0), txtPlace.Text, txtTime.Text, txtWinnings.Text);

cmd.CommandText = sqlStatement;
cmd.ExecuteNonQuery();
cnn.Close();

我得到的错误是:

“索引(从零开始)必须大于或等于零且小于参数列表的大小。”

【问题讨论】:

  • 请在准备好的语句中使用参数!
  • 你是什么意思@juergend
  • String.Format() 调用中有 5 个占位符,但只传递了 3 个参数。此外,正如所指出的,您应该真正使用参数,而不是像那样构建 SQL 语句,因为您会让自己受到 SQL 注入攻击。
  • 这不是 SQL 错误,这是 string.format 错误。您有五个参数,但在您的语句中只提供了 3 个。

标签: c# sql boolean sql-update sql-insert


【解决方案1】:

您的Where ResultsId = '{4}' 目前没有插入任何值。

txtWinnings.txt 之后添加另一个参数,提供ResultsId,并在(rdoDidFinish.Checked ? 1 : 0) 之前将+ 替换为,,以便将其识别为自己的参数。

正确的语句应该如下所示,其中resultId 是您要搜索的任何 id:

sqlStatement = string.Format("UPDATE Results SET Finish = '{0}', Place = '{1}', FinishTime = {2}, Winnings = '{3}' Where ResultsId = '{4}' ", (rdoDidFinish.Checked ? 1 : 0), txtPlace.Text, txtTime.Text, txtWinnings.Text, resultId);

最后一点,根据您问题中的 cmets,您应该始终准备好参数。所以你的最终结果应该是这样的:

cmd.CommandText = @"UPDATE Results SET Finish = @finished, Place = @place, FinishTime = @time, Winnings = @winnings Where ResultsId = @resultId ";
cmd.Parameters.Add(new SqlParameter("@finished", System.Data.SqlDbType.Bit).Value = rdoDidFinish.Checked);
cmd.Parameters.Add(new SqlParameter("@place", System.Data.SqlDbType.VarChar).Value = txtPlace.Text);
cmd.Parameters.Add(new SqlParameter("@time", System.Data.SqlDbType.VarChar).Value = txtTime.Text);
cmd.Parameters.Add(new SqlParameter("@winnings", System.Data.SqlDbType.VarChar).Value = txtWinnings.Text);
cmd.Parameters.Add(new SqlParameter("@resultId", System.Data.SqlDbType.Int).Value = resultId);

【讨论】:

  • 仔细看; rdoDidFinish 值实际上将连接到字符串。它不是用逗号分隔的
  • 谢谢,当我注意到它时,我只是在编辑我的答案以解决这个问题。 :)
【解决方案2】:

我发现这里有一些问题。

永远不要通过将字符串和值拼凑在一起来构建 SQL 语句,不管它是 stringbuilder 还是 string.format,或者不是什么。这与语言无关;不要使用任何语言。有关危险的更多信息,请谷歌“SQL注入” 最好的办法是使用参数化查询。示例将随之而来。

您的问题实际上出在您的 string.Format 行中。这里有2个错误

错误 1:我认为 + 应该是 , 这里:'{4}' " + (rdoDidFinish.Checked ? 1 : 0)

错误 2 您有 5 个占位符,只有 3 个值。 4 如果上述(Err 1)语句被更正

这是一个假设 Err 1 已修复的简单模型。需要知道 ResultID 值是什么。

string sqlStatement = "UPDATE Results SET Finish = @Finish, Place = @Place, FinishTime = @FinishTime, Winnings = @Winnings WHERE ResultsId = @ResultID";

using (SqlConnection cnn = new SqlConnection(Properties.Settings.Default.cnnString)) {
    SqlCommand cmd = cnn.CreateCommand(sqlStatement, cnn);
    cmd.CommandType = CommandType.Text;

    cmd.Parameters.AddWithValue("@Finish", (rdoDidFinish.Checked ? 1 : 0));     // I think this belongs here.
    cmd.Parameters.AddWithValue("@Place", txtPlace.Text);
    cmd.Parameters.AddWithValue("@FinishTime", txtTime.Text);
    cmd.Parameters.AddWithValue("@Winnings", txtWinnings.Text);
    // cmd.Parameters.AddWithValue("@ResultID", );                                ? What belongs here ?

    cnn.Open();
    cmd.ExecuteNonQuery();
    cnn.Close();

}

【讨论】:

    【解决方案3】:

    请在准备好的语句中使用参数!

    例子:

    var myParam = new SqlParameter();
    myParam.ParameterName = "@myParam";
    myParam.Value = 1;
    comm.Parameters.Add(myParam);
    

    您可以在 SQL 语句中使用该参数,例如

    Select * from table where abc = @myparam
    

    【讨论】:

    • 这应该是一个评论 - 它不回答 OP 的问题。
    猜你喜欢
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多