System.ArgumentException报错,求将eixample从ProgressSql切换至SQLSERVER方案
Keyword not supported: data source错误及完整迁移指南 首先明确回答:从ProgressSQL切换到SQL Server完全可行,.NET生态对SQL Server的支持非常成熟,只要调整几个核心配置并适配少量细节即可完成迁移。下面一步步帮你解决问题:
错误原因分析
你遇到的System.ArgumentException: 'Keyword not supported: data source Parameter name: keyword',本质是因为应用当前使用的是ProgressSQL的数据驱动/连接字符串格式,而SQL Server的连接协议和关键字规则和Progress不一样——要么是你用了Progress的驱动去连接SQL Server,要么是连接字符串里混杂了Progress特有的关键字,导致驱动无法识别。
具体迁移步骤
1. 更换SQL Server数据驱动
首先移除项目中ProgressSQL相关的NuGet包(比如Progress.Data.Client之类的),添加SQL Server官方驱动:
- 推荐使用
Microsoft.Data.SqlClient(.NET Core/.NET 5+首选) - 如果是传统.NET Framework,也可以用
System.Data.SqlClient
2. 修改连接字符串
ProgressSQL的连接字符串通常是类似这样的Progress专属格式:
Host=my-progress-server;Database=my-db;User ID=my-user;Password=my-pass;
替换为SQL Server兼容的连接字符串格式,两种常见场景:
- SQL Server身份验证:
Data Source=my-sql-server;Initial Catalog=my-db;User ID=my-user;Password=my-pass;TrustServerCertificate=True; - Windows集成身份验证:
Data Source=my-sql-server;Initial Catalog=my-db;Integrated Security=True;TrustServerCertificate=True;
提示:
TrustServerCertificate=True是用于开发/测试环境跳过证书验证,生产环境建议配置合法证书后移除该参数。
3. 替换数据提供工厂(如果用了DbProviderFactory)
如果你的代码中使用了通用的DbProviderFactory来创建连接,需要把Progress的工厂替换为SQL Server的:
原来的ProgressSQL代码:
using System.Data.Common; using Progress.Data; var providerFactory = DbProviderFactories.GetFactory("Progress.Data.ProgressDbProviderFactory"); using var connection = providerFactory.CreateConnection(); connection.ConnectionString = "Host=my-progress-server;Database=my-db;User ID=my-user;Password=my-pass;"; connection.Open();
修改为SQL Server的代码:
using System.Data.Common; using Microsoft.Data.SqlClient; // 方式1:通过DbProviderFactories获取 var providerFactory = DbProviderFactories.GetFactory("Microsoft.Data.SqlClient"); // 方式2:直接实例化(更简单) // var providerFactory = SqlClientFactory.Instance; using var connection = providerFactory.CreateConnection(); connection.ConnectionString = "Data Source=my-sql-server;Initial Catalog=my-db;User ID=my-user;Password=my-pass;TrustServerCertificate=True;"; connection.Open();
4. 适配SQL语法差异(必要时)
虽然大部分标准SQL是通用的,但ProgressSQL和SQL Server有一些语法细节差异,需要检查并替换:
- 字符串连接:Progress用
||或+,SQL Server推荐用CONCAT()函数(避免NULL导致结果为NULL) - 日期函数:Progress的
CURRENT_DATE→ SQL Server的GETDATE()/SYSDATETIME() - 分页:Progress的
SKIP 10 FIRST 20→ SQL Server的OFFSET 10 ROWS FETCH NEXT 20 ROWS ONLY - 特殊函数:比如Progress的
SUBSTRING参数顺序可能和SQL Server不同,需要核对
5. ORM框架调整(如果用了EF等)
如果项目用Entity Framework,需要修改DbContext的配置:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 替换原来的ProgressSQL配置,改用UseSqlServer optionsBuilder.UseSqlServer("Data Source=my-sql-server;Initial Catalog=my-db;User ID=my-user;Password=my-pass;TrustServerCertificate=True;"); }
总结
只要完成以上几步,就能顺利从ProgressSQL迁移到SQL Server。核心是替换数据驱动、修正连接字符串,然后适配少量SQL语法差异——整个过程是完全可行的,没有技术上的障碍。
内容的提问来源于stack exchange,提问作者MrD

