C# c中sql查询中的索引(从零开始)#
我不理解这个sql查询中的错误 错误是 索引(从零开始)必须大于或等于零 我的代码c#出错,这是:C# c中sql查询中的索引(从零开始)#,c#,mysql,C#,Mysql,我不理解这个sql查询中的错误 错误是 索引(从零开始)必须大于或等于零 我的代码c#出错,这是: sql = @String.Format(" UPDATE `tbl_csv` "); sql += String.Format(" SET "); sql += String.Format(" xAAA = 1, "); sql += String.Format(" xBBB = {0}, ");
sql = @String.Format(" UPDATE `tbl_csv` ");
sql += String.Format(" SET ");
sql += String.Format(" xAAA = 1, ");
sql += String.Format(" xBBB = {0}, ");
sql += String.Format(" xCCC = {1}, ");
sql += String.Format(" xDDD = {2} ");
sql += String.Format(" WHERE Id IN ({3}); ",
ddlBBB.SelectedValue.ToString(),
ddlCCC.SelectedValue.ToString(),
ddlDDD.SelectedValue.ToString(),
Base64ForUrlDecode(Request.QueryString["sId"].ToString()));
但是,如果尝试此不同版本的sql查询,我没有错误,并且查询的输出是正确的:
sql = @String.Format(" UPDATE `tbl_csv` ");
sql += String.Format(" SET ");
sql += String.Format(" xAAA = 1, ");
sql += String.Format(" xBBB = '" + ddlBBB.SelectedValue.ToString() + "', ");
sql += String.Format(" xCCC = '" + ddlCCC.SelectedValue.ToString() + "', ");
sql += String.Format(" xDDD = '" + ddlDDD.SelectedValue.ToString() + "' ");
sql += String.Format(" WHERE Id IN (" + Base64ForUrlDecode(Request.QueryString["sId"].ToString()) + "); ",
ddlBBB.SelectedValue.ToString(),
ddlCCC.SelectedValue.ToString(),
ddlDDD.SelectedValue.ToString(),
Base64ForUrlDecode(Request.QueryString["sId"].ToString()));
输出:
UPDATE `tbl_csv`
SET xAAA = 1,
xBBB = 'N',
xCCC = 'N',
xDDD = 'N'
WHERE
Id IN ('2357');
如何解决这个问题
你能帮我吗
提前感谢您的帮助,非常感谢。假设您真的看到了: 未处理的异常:System.FormatException:索引(基于零)必须大于或等于零且小于参数列表的大小 这是因为您没有向
string.Format
-即提供任何值
string s = string.Format("add {0} and {1}", "foo", 123);
// s now == "add foo and 123"
然而!在您的情况下,添加值并不是一个好的解决方案-您应该使用SQL参数,而不是串联。坏的修复方法可能类似于:
string sql = string.Format(@"
UPDATE `tbl_csv`
SET xAAA = 1, xBBB = {0},
xCCC = {1}, xDDD = {2}
WHERE Id IN ({3});",
ddlBBB.SelectedValue.ToString(),
ddlCCC.SelectedValue.ToString(),
ddlDDD.SelectedValue.ToString(),
Base64ForUrlDecode(Request.QueryString["sId"].ToString()));
const string sql = @"
UPDATE `tbl_csv`
SET xAAA = 1, xBBB = @xBBB,
xCCC = @xCCC, xDDD = xDDD
WHERE Id IN (@Id);"
好的解决办法是:
string sql = string.Format(@"
UPDATE `tbl_csv`
SET xAAA = 1, xBBB = {0},
xCCC = {1}, xDDD = {2}
WHERE Id IN ({3});",
ddlBBB.SelectedValue.ToString(),
ddlCCC.SelectedValue.ToString(),
ddlDDD.SelectedValue.ToString(),
Base64ForUrlDecode(Request.QueryString["sId"].ToString()));
const string sql = @"
UPDATE `tbl_csv`
SET xAAA = 1, xBBB = @xBBB,
xCCC = @xCCC, xDDD = xDDD
WHERE Id IN (@Id);"
将适当的ADO.NET参数添加到命令中,请注意,中的
通常不喜欢参数,除非您的数据库具有某种“拆分”功能,并且不同的服务器有不同的参数表达方式-而不是@foo
,它可能是:foo
,或者干脆是?
,等等。假设你真的看到了:
未处理的异常:System.FormatException:索引(基于零)必须大于或等于零且小于参数列表的大小
这是因为您没有向string.Format
-即提供任何值
string s = string.Format("add {0} and {1}", "foo", 123);
// s now == "add foo and 123"
然而!在您的情况下,添加值并不是一个好的解决方案-您应该使用SQL参数,而不是串联。坏的修复方法可能类似于:
string sql = string.Format(@"
UPDATE `tbl_csv`
SET xAAA = 1, xBBB = {0},
xCCC = {1}, xDDD = {2}
WHERE Id IN ({3});",
ddlBBB.SelectedValue.ToString(),
ddlCCC.SelectedValue.ToString(),
ddlDDD.SelectedValue.ToString(),
Base64ForUrlDecode(Request.QueryString["sId"].ToString()));
const string sql = @"
UPDATE `tbl_csv`
SET xAAA = 1, xBBB = @xBBB,
xCCC = @xCCC, xDDD = xDDD
WHERE Id IN (@Id);"
好的解决办法是:
string sql = string.Format(@"
UPDATE `tbl_csv`
SET xAAA = 1, xBBB = {0},
xCCC = {1}, xDDD = {2}
WHERE Id IN ({3});",
ddlBBB.SelectedValue.ToString(),
ddlCCC.SelectedValue.ToString(),
ddlDDD.SelectedValue.ToString(),
Base64ForUrlDecode(Request.QueryString["sId"].ToString()));
const string sql = @"
UPDATE `tbl_csv`
SET xAAA = 1, xBBB = @xBBB,
xCCC = @xCCC, xDDD = xDDD
WHERE Id IN (@Id);"
将适当的ADO.NET参数添加到命令中,请注意,
中的通常不喜欢参数,除非您的数据库具有某种“拆分”功能,并且不同的服务器有不同的参数表达方式-而不是@foo
,它可能是:foo
,或者干脆是?
,等等。您必须为每个单独的字符串添加正确的参数。format
函数
sql += String.Format(" xBBB = {0},", ddlBBB.SelectedValue.ToString());
sql += String.Format(" xCCC = {0},", ddlCCC.SelectedValue.ToString());
sql += String.Format(" xDDD = {0} ", ddlCCC.SelectedValue.ToString());
sql += String.Format(" WHERE Id IN ({0}); ", Base64ForUrlDecode(Request.QueryString["sId"].ToString()));
不能只将参数添加到最后一个函数中。所有函数都会自行解析,然后添加到字符串中
另外,在sql查询中直接从网页添加值时,应该非常小心。如果要直接在数据库上执行这些查询,则应始终对输入进行编码。必须向每个单独的字符串.format
函数添加正确的参数
sql += String.Format(" xBBB = {0},", ddlBBB.SelectedValue.ToString());
sql += String.Format(" xCCC = {0},", ddlCCC.SelectedValue.ToString());
sql += String.Format(" xDDD = {0} ", ddlCCC.SelectedValue.ToString());
sql += String.Format(" WHERE Id IN ({0}); ", Base64ForUrlDecode(Request.QueryString["sId"].ToString()));
不能只将参数添加到最后一个函数中。所有函数都会自行解析,然后添加到字符串中
另外,在sql查询中直接从网页添加值时,应该非常小心。如果您打算直接在数据库上执行这些查询,则应始终对输入进行编码。参数化查询在5。。。4.3.2.1…@DavidPilkington只是为了让您高兴:“OP,请不要将输入连接到查询中-使用参数”-现在更好了?简单解释:String。格式
number占位符计数必须与传递给方法的总参数相同,从索引0开始。也。。。您应该知道如何在字符串连接上使用参数化查询。哪一行抛出该错误?所有的string.Format
调用看起来都是错误的,但这并不是它们会引发的错误…@MarcGravel很高兴我们能在5分钟内解决这一问题。。。4.3.2.1…@DavidPilkington只是为了让您高兴:“OP,请不要将输入连接到查询中-使用参数”-现在更好了?简单解释:String。格式
number占位符计数必须与传递给方法的总参数相同,从索引0开始。也。。。您应该知道如何在字符串连接上使用参数化查询。哪一行抛出该错误?所有的string.Format
调用看起来都是错误的,但这并不是它们会引发的错误…@MarcGravel很高兴我们能解决这个问题。哈哈,他不应该对输入进行编码,他应该使用参数。不要告诉人们如何实现一个好的设计,告诉他们如何实现一个好的设计。不,他不应该编码输入,他应该使用参数。不要告诉人们如何很好地实现坏的设计,告诉他们如何很好地实现好的设计。