You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中SQL查询报‘索引(从零开始)必须≥0’错误的解决求助

解决C#中String.Format生成SQL时的“Index (zero based) must be greater than or equal to zero”错误

问题根源

你遇到的这个错误,本质是错误地将带有占位符({0}、{1}等)的SQL片段拆分到了多个String.Format调用中,但只有最后一个String.Format传入了参数。前面那些包含占位符的String.Format调用(比如String.Format(" xBBB = {0}, "))没有传入对应的参数,系统找不到占位符对应的值,就会抛出索引越界的异常。

错误代码的问题点

看你这段代码:

sql += String.Format(" xBBB = {0}, ");
sql += String.Format(" xCCC = {1}, ");
sql += String.Format(" xDDD = {2} ");

每一行的String.Format都包含占位符,但你没有给它们传任何参数,这就是触发错误的直接原因。而你直接拼接字符串时没报错,是因为你把值直接硬编码进了字符串里,那些String.Format调用里已经没有占位符了,自然不会触发索引检查。

正确的修复方式

方式1:使用单个String.Format统一处理

把整个SQL语句放在一个String.Format调用里,一次性传入所有参数,这样占位符和参数能一一对应,代码也更整洁:

// 先把变量提取出来,提升可读性
var bbbVal = ddlBBB.SelectedValue.ToString();
var cccVal = ddlCCC.SelectedValue.ToString();
var dddVal = ddlDDD.SelectedValue.ToString();
var targetId = Base64ForUrlDecode(Request.QueryString["sId"].ToString());

// 用单个String.Format生成完整SQL
sql = String.Format(@"UPDATE `tbl_csv` 
SET xAAA = 1, 
    xBBB = '{0}', 
    xCCC = '{1}', 
    xDDD = '{2}' 
WHERE Id IN ('{3}');", 
    bbbVal, cccVal, dddVal, targetId);

方式2:强烈推荐——使用参数化查询(避免SQL注入)

注意:直接拼接字符串或用String.Format生成SQL存在严重的SQL注入风险,这是非常不安全的写法。正确的做法是使用参数化查询,让数据库来处理参数,既安全又能避免这类字符串拼接错误:

// 定义带参数占位符的SQL
string sql = @"UPDATE `tbl_csv` 
SET xAAA = 1, 
    xBBB = @BBB, 
    xCCC = @CCC, 
    xDDD = @DDD 
WHERE Id IN (@TargetId);";

// 使用SqlCommand执行参数化查询(假设你用的是SQL Server)
using (SqlCommand cmd = new SqlCommand(sql, yourDatabaseConnection))
{
    // 添加参数,自动处理类型和转义
    cmd.Parameters.AddWithValue("@BBB", ddlBBB.SelectedValue);
    cmd.Parameters.AddWithValue("@CCC", ddlCCC.SelectedValue);
    cmd.Parameters.AddWithValue("@DDD", ddlDDD.SelectedValue);
    cmd.Parameters.AddWithValue("@TargetId", Base64ForUrlDecode(Request.QueryString["sId"].ToString()));
    
    // 执行更新操作
    cmd.ExecuteNonQuery();
}

这种写法不仅彻底解决了你的占位符错误,还从根源上杜绝了SQL注入攻击,是生产环境的标准写法。

内容的提问来源于stack exchange,提问作者Antonio Mailtraq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:00:08