如何解决C#代码中发送包含GO命令的SQL请求时的语法错误问题
解决C#执行带GO的SQL更新语句报错问题
你遇到的问题主要来自两个核心点:GO不是T-SQL的合法语句,以及JSON字符串在C#中的转义冲突,我来一步步帮你解决:
1. 移除SQL中的GO关键字
GO是SSMS、sqlcmd这类SQL Server工具的批处理分隔符,并不是T-SQL语言本身的语法。当你用DbCommand执行SQL时,SQL Server引擎无法识别GO,这会直接触发语法错误。
修改后的SQL应该去掉所有go行,示例如下:
Update dbo.Parameter set ValueAsStr = '{ "CreateDepoUrl": "https://sandbox.sg...../", "CheckDepoStatusUrl": "https://sandbox.sg..../", "CreatePayoutUrl": "https://sandbox.sg....../", "CheckPayoutStatusUrl": "https://sandbox.sg..../", "PayoutTerminalIds": { .... } }'
2. 正确处理JSON字符串的转义
你要写入的ValueAsStr是JSON格式字符串,在C#中直接拼接时,JSON里的双引号会和C#字符串的双引号边界冲突,导致实际发送给SQL Server的语句不完整——这就是你去掉dbo.后仍报错的原因。
推荐两种解决方式:
方式一:手动转义双引号
使用C#逐字字符串(@开头),并将JSON中的每个"替换为"":
string queryString = @"Update dbo.Parameter set ValueAsStr = '{ ""CreateDepoUrl"": ""https://sandbox.sg...../"", ""CheckDepoStatusUrl"": ""https://sandbox.sg..../"", ""CreatePayoutUrl"": ""https://sandbox.sg....../"", ""CheckPayoutStatusUrl"": ""https://sandbox.sg..../"", ""PayoutTerminalIds"": { .... } }'";
方式二:用C#对象序列化生成JSON(更可靠)
如果JSON结构复杂,手动转义容易出错,建议先定义对应类,序列化后再拼入SQL:
// 定义对应JSON结构的类 public class ParameterConfig { public string CreateDepoUrl { get; set; } public string CheckDepoStatusUrl { get; set; } public string CreatePayoutUrl { get; set; } public string CheckPayoutStatusUrl { get; set; } public Dictionary<string, object> PayoutTerminalIds { get; set; } // 根据实际结构调整 } // 生成JSON字符串 var config = new ParameterConfig { CreateDepoUrl = "https://sandbox.sg...../", CheckDepoStatusUrl = "https://sandbox.sg..../", // 其他属性赋值 }; string jsonValue = Newtonsoft.Json.JsonConvert.SerializeObject(config);
3. 更安全的方案:使用参数化查询
直接拼接SQL存在SQL注入风险,还容易出现语法问题,建议改用参数化查询:
用EF Core的ExecuteSqlRaw(简洁高效)
public static void SendToMainSqlRequest(MainDbContext mainDbContext, string jsonValue) { var sql = "Update dbo.Parameter set ValueAsStr = @JsonValue"; int updateCount = mainDbContext.Database.ExecuteSqlRaw(sql, new SqlParameter("@JsonValue", jsonValue)); Console.WriteLine("count of updates: {0}", updateCount); }
用DbCommand实现参数化
如果坚持使用原有DbCommand方式,也可以添加参数:
public static void SendToMainSqlRequest(MainDbContext mainDbContext, string jsonValue) { using (var conn = mainDbContext.Database.GetDbConnection()) { conn.Open(); using (var command = conn.CreateCommand()) { command.CommandText = "Update dbo.Parameter set ValueAsStr = @JsonValue"; command.CommandType = CommandType.Text; var param = command.CreateParameter(); param.ParameterName = "@JsonValue"; param.Value = jsonValue; command.Parameters.Add(param); int updateCount = command.ExecuteNonQuery(); Console.WriteLine("count of updates: {0}", updateCount); } // using块会自动关闭连接,无需手动调用Close() } }
总结
- 彻底移除SQL中的
GO语句; - 确保JSON字符串在C#中正确转义,或通过序列化生成;
- 优先使用参数化查询,既避免语法错误,又防范SQL注入风险。
内容的提问来源于stack exchange,提问作者Ruslan F
相关产品推荐
相关产品推荐

