如何解决.NET/Dapper操作Oracle时Unicode字符无法插入的问题?
Dapper操作Oracle插入Unicode字符的解决方案
显式指定OracleDbType为NVarchar2
依赖IDbParameter时,Dapper默认会把DBType.String映射成Oracle的varchar,无法存储Unicode字符。直接使用OracleParameter并指定OracleDbType.NVarchar2就能解决问题:var param = new OracleParameter { ParameterName = ":UnicodeContent", OracleDbType = OracleDbType.NVarchar2, Value = "包含中文、日文等的Unicode文本" }; connection.Execute("INSERT INTO TestTable (UnicodeCol) VALUES (:UnicodeContent)", param);用Dapper动态参数时也可以这么写:
connection.Execute( "INSERT INTO TestTable (UnicodeCol) VALUES (:UnicodeContent)", new { UnicodeContent = new OracleParameter(":UnicodeContent", OracleDbType.NVarchar2) { Value = "Unicode内容" } } );全局自定义Dapper类型映射
如果项目中大部分字符串都需要存储Unicode,可以全局配置Dapper,让所有字符串参数默认映射到NVarchar2,无需每次手动设置:// 全局初始化阶段配置 SqlMapper.AddTypeMap(typeof(string), DbType.String); SqlMapper.AddTypeHandler(new UnicodeStringHandler()); public class UnicodeStringHandler : SqlMapper.TypeHandler<string> { public override void SetValue(IDbDataParameter parameter, string value) { if (parameter is OracleParameter oracleParam) { oracleParam.OracleDbType = OracleDbType.NVarchar2; } parameter.Value = value ?? DBNull.Value; } public override string Parse(object value) { return value?.ToString() ?? string.Empty; } }配置完成后,普通的Dapper调用(比如使用匿名参数)都会自动使用NVarchar2类型,无需额外处理。
可选:SQL语句中指定参数类型
可以在SQL语句里给参数加上NVarchar2类型提示,不过该方式依赖Oracle的解析逻辑,稳定性不如前两种方法,适合临时场景:INSERT INTO TestTable (UnicodeCol) VALUES (:UnicodeContent NVARCHAR2(500))
内容的提问来源于stack exchange,提问作者Serg Shevchenko
相关产品推荐
相关产品推荐

