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

如何解决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()
    }
}

总结

  1. 彻底移除SQL中的GO语句;
  2. 确保JSON字符串在C#中正确转义,或通过序列化生成;
  3. 优先使用参数化查询,既避免语法错误,又防范SQL注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:37:48