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

SSMS可正常运行的含{0}的SQL,在C# EF执行报错如何解决?

问题描述

在SSMS中执行以下SQL语句可正常运行:

INSERT INTO GenInfo
    (ParameterKey, Value, Description, Secured, BranchID, GroupID)
SELECT 
    'companyURLStem', 'http://dev-sql2019all/company/rdPage.aspx?rdSecureKey={0}', 
    'Main URL to access company reports', -1, BranchID, 4
FROM Branch

但在C#中通过EF调用dbServices.ApplyChangeToTarget(sql)执行该SQL字符串时,抛出错误:索引(从零开始)必须大于或等于零,且小于参数列表的大小。问题根源是SQL字符串中的{0}被EF的SQL执行方法当成了参数占位符,而非普通字符串内容。当前处于程序化数据库迁移场景,灵活性有限,需要让SQL在C#中执行效果与SSMS一致。

解决办法
  • 转义大括号:在C#字符串中,把单个{或}替换成两个{{或}},这样EF会将其解析为普通的大括号字符,而非格式化占位符。修改后的SQL字符串如下:
INSERT INTO GenInfo
    (ParameterKey, Value, Description, Secured, BranchID, GroupID)
SELECT 
    'companyURLStem', 'http://dev-sql2019all/company/rdPage.aspx?rdSecureKey={{0}}', 
    'Main URL to access company reports', -1, BranchID, 4
FROM Branch
  • 使用参数化查询(更安全):如果场景允许,将{0}对应的内容作为SQL参数传入,既避免字符串解析问题,又能提升SQL安全性。示例代码大致如下:
var urlTemplate = "http://dev-sql2019all/company/rdPage.aspx?rdSecureKey={0}";
var sql = @"INSERT INTO GenInfo
    (ParameterKey, Value, Description, Secured, BranchID, GroupID)
SELECT 
    'companyURLStem', @UrlTemplate, 
    'Main URL to access company reports', -1, BranchID, 4
FROM Branch";
dbServices.ApplyChangeToTarget(sql, new SqlParameter("@UrlTemplate", urlTemplate));

注:具体参数传递方式需根据dbServices.ApplyChangeToTarget的实际重载调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:42:35