我有两个收音机。一个是真的,另一个是假的。我挂了一面旗子,但没起作用。这是我现在的代码
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();我得到的错误是:
“索引(以零为基础)必须大于或等于零,并且小于参数列表的大小。”
发布于 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值是什么。
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();}
发布于 2018-03-29 13:56:49
您的Where ResultsId = '{4}'当前没有插入任何值。
在txtWinnings.txt之后添加另一个参数,提供ResultsId,并在(rdoDidFinish.Checked ? 1 : 0)之前用,替换+,以便将其识别为自己的参数。
正确的语句应该如下所示,其中resultId是您想要搜索的任何内容:
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);最后一个注意事项,根据对你问题的评论,你应该始终准备好你的参数。因此,您的最终结果应该是这样的:
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);发布于 2018-03-29 14:09:47
请在准备好的语句中使用参数!
示例:
var myParam = new SqlParameter();
myParam.ParameterName = "@myParam";
myParam.Value = 1;
comm.Parameters.Add(myParam);可以在SQL-语句中使用参数,如下所示
Select * from table where abc = @myparamhttps://stackoverflow.com/questions/49557813
复制相似问题