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
相关产品推荐
相关产品推荐

