我目前正在面临一个烦人的问题,很乐意获得一些见解。
我正在开发一个简单的应用程序,该应用程序从Oracle 11g db中重述一些记录并显示它们。
我正在使用asp.net core 2和system.data.oracleclient软件包来执行与DB的连接。
但是,当我做一个简单的选择和retreive varchar2字段时,如以下片段:
// Init connection
var connection = new OracleConnection(connectionString);
// Create query command
OracleCommand cmd = connection.CreateCommand();
cmd.CommandText = "select * from mytable";
// Execute query
var reader = cmd.ExecuteReader();
// Go through all retreived raw and display only the string fields
while (reader.Read()) {
object[] rawRow = new object[reader.FieldCount];
foreach(var o in rawRow) {
if( o is string ){
// Display the string
}
}
}
我用一个额外的拖尾垃圾来重述字符串,例如:" myvalue翙"翙确实是一个额外的字符,它不存在于DB中存储的字段中。当我使用SQL 客户端时,我不会得到此字符。
如果第一次怀疑一个字符集问题,但是作为char i额外的一个,价值字段仅包含ascii char,则不应是...
敲响任何人吗?
dbmOracle 11G
NLS_NCHAR_CHARACTERSET AL16UTF16
nls_characterset WE8MSWIN1252
预先感谢
编辑:
客户端:Oracle 12c在路径和reg中(32位或64位):
nls_lang french_france.we8mswin1252
编辑2:
额外的角色可以改变,得到ꌽ,⌴和其他一些。它看起来确实像是一个炭化转换问题,但在连接器级别:(。
编辑3:
我刚刚与非官方单声道的Oracle客户端(Mono.Data.oracleClientCore)进行了测试,并且得到了相同的结果。现在我怀疑这可能是连接器。也许基于OCI的客户不会阅读路径或注册表conf ...
oracle中的varchar2字段作为字节存储数据。因此,为了有效提取每个值,您可以使用以下数据类型:
1-字节
2 -char
3- char []
4 -int
您可以看到此Oracle文档的每个Oracle数据类型的映射到.NET