我有一个现有的C#项目,它使用System.Data.OleDb作为提供程序读取文本文件并将其加载到Oracle DB中。问题是,如果文件具有上部ascii字符(例如ÀÑÓ,非中断空格),它在尝试将其加载到Oracle时总是会生成错误:
错误是: OLEDBConnection命令由于符号不匹配或数据溢出以外的原因,无法转换参数数据值。
我们的Oracle可以接受上面的ascii字符(通过SQL * PLUS插入工作正常),它是有问题的System.Data.OleDb。
有人知道是否有更改此设置?不敢相信那只接受A-Z-0-9。通过ll文档查看但找不到任何内容。
如果不能,你怎么让OLEDB知道逃避这个角色。在特殊字符之前将文件放在文件中,但它仍然存在相同消息的错误。
答案 0 :(得分:3)
通常情况下这是可能的,没有任何问题...因为你没有提供太多细节,只提供一些一般性的指示:
SELECT parameter, value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
OLEDB.NET=True
要检查的其他要点可能是操作系统和客户端以及OLEDB版本......有些还有错误或奇怪的行为......
答案 1 :(得分:2)
您可能必须使用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;
}
答案 2 :(得分:1)
您的数据类型和参数类型是nvarchar2吗?