Hem*_*ant 6 c# oracle unicode oracle10g
我想在oracle数据库(10 g)中保存unicode数据(希腊语).我创建了一个简单的表:
alt text http://i25.tinypic.com/dvpqnk.png
我知道NVARCHAR2总是使用UTF-16编码,所以它必须适用于所有(人类)语言.
然后我试图在数据库中插入一个字符串.我在代码中硬编码了字符串("你好吗?").然后我尝试从数据库中恢复并显示它.
class Program
{
static string connectionString = "<my connection string>";
static void Main (string[] args) {
string textBefore = "?? ??????;";
DeleteAll ();
SaveToDatabase (textBefore);
string textAfter = GetFromDatabase ();
string beforeData = String.Format ("Before: {0}, ({1})", textBefore, ToHex (textBefore));
string afterData = String.Format ("After: {0}, ({1})", textAfter, ToHex (textAfter));
Console.WriteLine (beforeData);
Console.WriteLine (afterData);
MessageBox.Show (beforeData);
MessageBox.Show (afterData);
Console.ReadLine ();
}
static void DeleteAll () {
using (var oraConnection = new OracleConnection (connectionString)) {
oraConnection.Open ();
var command = oraConnection.CreateCommand ();
command.CommandText = "delete from UNICODEDATA";
command.ExecuteNonQuery ();
}
}
static void SaveToDatabase (string stringToSave) {
using (var oraConnection = new OracleConnection (connectionString)) {
oraConnection.Open ();
var command = oraConnection.CreateCommand ();
command.CommandText = "INSERT into UNICODEDATA (ID, UNICODESTRING) Values (11, :UnicodeString)";
command.Parameters.Add (":UnicodeString", stringToSave);
command.ExecuteNonQuery ();
}
}
static string GetFromDatabase () {
using (var oraConnection = new OracleConnection (connectionString)) {
oraConnection.Open ();
var command = oraConnection.CreateCommand ();
command.CommandText = "Select * from UNICODEDATA";
var erpReader = command.ExecuteReader ();
string s = String.Empty;
while (erpReader.Read ()) {
string text = erpReader.GetString (1);
s += text + ", ";
}
return s;
}
}
static string ToHex (string input) {
string bytes = String.Empty;
foreach (var c in input)
bytes += ((int)c).ToString ("X4") + " ";
return bytes;
}
}
Run Code Online (Sandbox Code Playgroud)
以下是不同的输出:
在消息框中发送到数据库之前的文本: alt text http://i31.tinypic.com/2ymdo2u.png
从消息框中的数据库获取后的文本: 替代文本http://i28.tinypic.com/2wmq9a0.png
控制台输出: alt text http://i29.tinypic.com/6xz3px.png
请问你能告诉我这里可能做错了什么吗?
我可以看到五个潜在的问题领域:
你是如何实际将文本导入.NET应用程序的?如果它是在字符串文字中硬编码的,您确定编译器正在为您的源文件采用正确的编码吗?
您如何将其发送到数据库可能存在问题.
如何将其存储在数据库中可能存在问题.
如何在数据库中获取它可能存在问题.
之后如何重新显示它可能会有问题.
现在区域2-4听起来比1和5更不可能是一个问题.之后你如何显示文本?你实际上是从.NET中的数据库中取出它,还是使用Toad或类似的东西试图看到它?
如果你再次从.NET写出来,我建议你完全跳过数据库 - 如果你只是显示字符串本身,你看到了什么?
我有一篇文章,您可能会发现调试Unicode问题很有用.特别是,集中在编码可能出错的每个地方,并确保无论何时"显示"一个字符串,你都会转出精确的Unicode字符(整数),这样你就可以检查那些而不仅仅是当前字体想要的东西.显示.
编辑:好的,所以数据库的某处问题所涉及.
我强烈建议你删除ASP和HTML之类的东西.编写一个简单的控制台应用程序,除了插入字符串并再次获取它之外什么也不做.使其在之前和之后转储单个Unicode字符(作为整数).然后尝试查看数据库中的内容(例如使用Toad).我不知道Oracle函数将字符串转换为单个Unicode字符的序列,然后将这些字符转换为整数,但这很可能是我接下来要尝试的.
编辑:另外两个建议(很高兴看到控制台应用程序,顺便说一句).
指定参数的数据类型,而不是仅为其指定对象.例如:
command.Parameters.Add (":UnicodeString",
OracleType.NVarChar).Value = stringToSave;
Run Code Online (Sandbox Code Playgroud)考虑使用Oracle自己的驱动程序而不是.NET内置的驱动程序.无论如何,你可能希望这样做,因为我认为它通常被认为更快更可靠.
| 归档时间: |
|
| 查看次数: |
15578 次 |
| 最近记录: |