使用ADO.NET调用SQL Server存储过程,如何判断数据库实际参数类型?
问题背景与实证验证方案
问题说明
在C#中通过ADO.NET调用SQL Server存储过程时,遇到参数类型匹配的疑问:已知存储过程的目标参数类型为VARCHAR(120),但使用AddWithValue方法添加参数时,C#会将该参数识别为SqlDbType.NVARCHAR。由于网上关于ADO.NET是否会自动适配服务器端正确参数类型的说法不一,因此计划通过实证测试确认服务器实际使用的参数类型是NVARCHAR还是VARCHAR。
测试方案与结论
- 选取
VARCHAR不支持的特殊字符,例如ǹ(带重音符的小写拉丁字母N) - 预先验证:在SQL Server中执行
SELECT ǹ,返回结果为? - 编写一个查询逻辑,当传入
?时会返回预设的特定结果 - 通过ADO.NET调用该查询,传入字符
ǹ - 观察结果:查询的执行表现与传入
?时完全一致 - 结论:尽管客户端通过
AddWithValue传入的是NVARCHAR类型参数,SQL Server实际处理时会按照存储过程定义的VARCHAR类型进行转换,导致特殊字符被替换为?
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

