使用c#,可以让System.Data.OleDb处理特殊字符吗?
本文关键字:处理 OleDb 特殊字符 Data System 使用 | 更新日期: 2023-09-27 18:08:35
我有一个现有的c#项目,读取文本文件,并使用System.Data.OleDb作为提供者将其加载到Oracle数据库中。问题是,如果文件有大写ascii字符(例如ÀÑÓ,非换行空格),它总是产生一个错误,当它试图加载到Oracle:
错误是:OLEDBConnection命令参数数据值由于符号不匹配或数据溢出以外的原因无法转换。
我们的Oracle可以接受大写ascii字符(通过SQL*PLUS插入工作正常),它是有问题的System.Data.OleDb。
有人知道是否有一个设置来改变这个吗?真不敢相信那只接受az -0-9。查看了所有文档,但没有找到任何内容。
如果不能,您如何让OLEDB知道转义字符。累了把'放在文件的特殊字符前,但它仍然错误的消息相同。
通常这是可能的,没有任何问题…因为你没有提供太多的细节,只有一些一般的指针:
- 数据库字符集应设置为AL32UTF8
你可以通过执行SELECT parameter, value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
来检查。 - 客户端字符集应设置为AL32UTF8
查看NLS_LANG 的注册表设置 - 列应为VARCHAR2
- 连接字符串应该包含
OLEDB.NET=True
更多参考参见http://download.oracle.com/docs/cd/B28359_01/win.111/b28431/using.htm#i1017221
其他检查点可以是操作系统和客户端和OLEDB版本…
您可能必须使用HEX转换。例如%c4为Ä。
试一下,让我知道是否有效。以下是您可以使用的转换函数。
internal String convertAsciiTextToHex(String asciiText)
{
StringBuilder sBuffer = new StringBuilder();
for (int i = 0; i < asciiText.Length; i++)
{
sBuffer.Append(Convert.ToInt32(asciiText[i]).ToString("x"));
}
return sBuffer.ToString().ToUpper();
}
internal String convertHexToAsciiText(String hexString)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hexString.Length; i += 2)
{
string hs = hexString.Substring(i, 2);
sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16)));
}
String ascii = sb.ToString();
return ascii;
}
您的数据类型和参数类型是nvarchar2吗?