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

PostgreSQL ODBC报错:'on'附近语法错误,C#执行UPSERT遇问题

问题根源与解决方案

首先看你的错误提示:[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'on'——这说明你的C#代码正在使用SQL Server的ODBC驱动连接数据库,而不是PostgreSQL的驱动!这才是导致报错的核心原因:SQL Server不支持PostgreSQL特有的ON CONFLICT语法,自然会报语法错误。

解决步骤

1. 更换为PostgreSQL官方.NET驱动

放弃SQL Server的ODBC驱动,使用Npgsql(PostgreSQL官方推荐的.NET数据提供程序),可以通过NuGet安装:

Install-Package Npgsql

或者在.NET Core/.NET 5+环境中使用:

dotnet add package Npgsql

2. 修正C#代码的连接与执行逻辑

确保使用Npgsql的连接类和命令类,而非SQL Server的SqlConnection/SqlCommand。示例代码如下:

using Npgsql;
// 引入你的重试逻辑相关命名空间

var connString = "Host=你的PostgreSQL主机;Port=5432;Database=你的数据库名;Username=用户名;Password=密码";

using (var conn = new NpgsqlConnection(connString))
{
    conn.Open();
    // 去掉之前错误的[ON]括号,使用标准的PostgreSQL语法
    var sql = @"INSERT INTO ""UsageTable"" (""ID"", ""Name"", ""Count"", ""Start"", ""End"", ""Offset"")
                VALUES('test account' , 'test name' , '30' , '2018-05-17 00:00:00' , '2018-05-18 00:00:00' , '0')
                ON CONFLICT (""ID"", ""Name"", ""Start"", ""End"") 
                DO UPDATE SET ""Count"" = Excluded.""Count"" + ""UsageTable"".""Count"";";

    MakeRetriableOperation().Invoke(cmd => 
    {
        cmd = new NpgsqlCommand(sql, conn);
        cmd.ExecuteNonQuery();
    });
}

3. 优化日期格式(可选但推荐)

PostgreSQL对ISO标准日期格式(YYYY-MM-DD HH:MI:SS)的解析更稳定,建议替换原语句中的美式日期格式,避免因数据库本地化设置导致的日期解析错误。

为什么之前的尝试无效?

你去掉[ON]括号后仍然报错,是因为驱动还是SQL Server的——它根本不认识ON CONFLICT这个PostgreSQL专属语法,只有切换到正确的PostgreSQL驱动,这个语法才能被正常识别执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:20:39