Xamarin项目连接SQL Server时遇Encoding 1252未找到错误求助
看起来你碰到了Xamarin跨平台连接SQL Server时常见的编码依赖问题,结合你提供的异常追踪信息,我整理了几个经过验证的解决步骤:
1. 显式注册编码程序集
你已经引用了I18N.dll和I18N.West.dll,但关键是要在应用启动时强制初始化编码支持。在Android的MainActivity的OnCreate方法,或者iOS的AppDelegate的FinishedLaunching方法中添加以下代码:
using I18N.West; using System.Text; // 放在初始化逻辑最前面 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // 提前加载1252编码,避免运行时延迟加载失败 Encoding.GetEncoding(1252);
这一步会让Mono运行时主动加载对应的编码实现,而不是等到SQL连接时才尝试加载。
2. 修改SQL Server连接字符串
在连接字符串中添加Unicode=True参数,强制客户端与服务器使用Unicode编码通信,绕过对Windows-1252编码的依赖:
Server=你的服务器地址;Database=你的数据库名;User ID=账号;Password=密码;Unicode=True;
如果你的数据库使用特定排序规则,可以额外添加Collation=SQL_Latin1_General_CP1_CI_AS(替换为你的数据库实际排序规则),进一步明确编码交互规则。
3. 确认程序集复制属性
确保I18N.dll和I18N.West.dll的Copy Local属性设置为True:
- 在Visual Studio中右键点击项目引用的这两个程序集 → 打开属性面板 → 找到
Copy Local选项,设置为True。
这能保证这两个编码支持程序集被打包到移动应用安装包中,不会在真机上缺失。
4. 迁移到官方SQL客户端库(推荐)
旧的System.Data.SqlClient在Mono环境下的编码支持有限,建议替换为微软官方维护的Microsoft.Data.SqlClient:
- 通过NuGet包管理器搜索
Microsoft.Data.SqlClient并安装到你的Xamarin项目; - 修改代码中的命名空间引用:将
using System.Data.SqlClient;替换为using Microsoft.Data.SqlClient;。
这个库对跨平台场景的编码兼容性做了优化,能从根源减少这类问题。
问题根源说明
从你的异常栈可以看到,错误发生在Mono.Data.Tds.TdsCharset.GetEncodingFromSortOrder方法中——SQL Server返回的排序规则信息触发Mono尝试加载Windows-1252编码,但默认情况下移动设备上的Mono运行时不会自动加载所有编码实现,必须通过显式注册和引用I18N程序集来提供支持。
内容的提问来源于stack exchange,提问作者A.Vital

