首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#将Bool值更新为数据库

C#将Bool值更新为数据库
EN

Stack Overflow用户
提问于 2018-03-29 13:48:41
回答 3查看 1.5K关注 0票数 0

我有两个收音机。一个是真的,另一个是假的。我挂了一面旗子,但没起作用。这是我现在的代码

代码语言:javascript
复制
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();

我得到的错误是:

“索引(以零为基础)必须大于或等于零,并且小于参数列表的大小。”

EN

回答 3

Stack Overflow用户

发布于 2018-03-29 14:11:21

我在这里看到了一些问题。

永远不要通过拼凑字符串和值来构建SQL语句,不管它是字符串生成器还是string.format,或者什么都不重要。这是语言不可知论,不要用任何语言。有关危险的更多信息,请谷歌"SQL注入“最好的做法是使用参数化查询。样品会跟着。

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

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

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

下面是一个简单的假设错误1修复的模拟。需要知道ResultID值是什么。

代码语言:javascript
复制
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();

}

票数 2
EN

Stack Overflow用户

发布于 2018-03-29 13:56:49

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

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

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

代码语言:javascript
复制
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);

最后一个注意事项,根据对你问题的评论,你应该始终准备好你的参数。因此,您的最终结果应该是这样的:

代码语言:javascript
复制
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);
票数 0
EN

Stack Overflow用户

发布于 2018-03-29 14:09:47

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

示例:

代码语言:javascript
复制
var myParam = new SqlParameter();
myParam.ParameterName = "@myParam";
myParam.Value = 1;
comm.Parameters.Add(myParam);

可以在SQL-语句中使用参数,如下所示

代码语言:javascript
复制
Select * from table where abc = @myparam
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49557813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档