c# – 如何将unicode数据保存到oracle?

c# – 如何将unicode数据保存到oracle?,第1张

概述我想在oracle数据库(10 g)中保存unicode数据(希腊语).我创建了一个简单的表: alt text http://i25.tinypic.com/dvpqnk.png 我知道NVARCHAR2总是使用UTF-16编码,所以它必须适用于所有(人类)语言. 然后我试图在数据库中插入一个字符串.我在代码中硬编码了字符串(“你好吗?”).然后我尝试从数据库中恢复并显示它. class Pro 我想在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},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;    }}

以下是不同的输出:

在消息框中发送到数据库之前的文本:
alt text http://i31.tinypic.com/2ymdo2u.png

从消息框中的数据库获取后的文本:
alt text http://i28.tinypic.com/2wmq9a0.png

控制台输出:
alt text http://i29.tinypic.com/6xz3px.png

请问你能告诉我这里可能做错了什么吗?

解决方法 我可以看到五个潜在的问题领域:

>您如何实际将文本添加到.NET应用程序中?如果它是在字符串文字中硬编码的,您确定编译器正在为您的源文件采用正确的编码吗?
>您将如何将其发送到数据库可能存在问题.
>如何将其存储在数据库中可能存在问题.
>如何在数据库中获取它可能存在问题.
>之后再次显示它可能会有问题.

现在区域2-4听起来比1和5更不可能是一个问题.之后你如何显示文本?你实际上是从.NET中的数据库中取出它,还是使用Toad或类似的东西试图看到它?

如果你再次从.NET写出来,我建议你完全跳过数据库 – 如果你只是显示字符串本身,你看到了什么?

我有一篇文章,您可能会发现在debugging Unicode problems上有用.特别是,请专注于编码可能出错的每个地方,并确保无论何时“显示”字符串,您都会转出精确的Unicode字符(作为整数),以便您可以检查那些而不仅仅是你当前字体想要显示的内容.

编辑:好的,所以数据库涉及问题的某个地方.

我强烈建议你删除ASP和HTML之类的东西.编写一个简单的控制台应用程序,除了插入字符串并再次获取它之外什么也不做.使其在之前和之后转储单个Unicode字符(作为整数).然后尝试查看数据库中的内容(例如使用Toad).我不知道Oracle函数将字符串转换为单个Unicode字符的序列,然后将这些字符转换为整数,但这很可能是我接下来要尝试的.

编辑:另外两个建议(很高兴看到控制台应用程序,顺便说一句).

>指定参数的数据类型,而不是仅为其指定对象.例如:

command.Parameters.Add (":UnicodeString",OracleType.NVarChar).Value = stringToSave;

>考虑使用Oracle自己的驱动程序而不是.NET内置的驱动程序.无论如何,你可能希望这样做,因为我认为它通常被认为更快更可靠.

总结

以上是内存溢出为你收集整理的c# – 如何将unicode数据保存到oracle?全部内容,希望文章能够帮你解决c# – 如何将unicode数据保存到oracle?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1263666.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存