我在这个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(" 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');
如何解决这个问题?
你能帮助我吗?
提前感谢您的帮助,非常感谢。
答案 0 :(得分:4)
假设你真的看到了:
未处理的异常: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);"
在命令中添加适当的ADO.NET参数,注意IN
通常不喜欢参数,除非您的数据库有某种" split"功能,以及不同的服务器有不同的表达参数的方式 - 而不是@foo
它可能是:foo
,或只是?
等。
答案 1 :(得分:0)
您必须为每个单独的string.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查询中直接添加网页中的值时应该非常小心。如果您打算直接在数据库上执行这些查询,则应始终对输入进行编码。