将Access数据库中的memo字段从双字节转换为Unicode

时间:2011-10-03 06:37:47

标签: sql-server ms-access encoding memo

我将Access数据库用于一个系统,而SQL服务器用于另一个系统。数据在这两个系统之间同步。 问题是Access数据库表中的一个字段是备注字段,其格式为双字节。当我在Windows窗体中使用DataGridView读取此数据时,文本显示为???。 此外,当来自此字段的数据插入sql server数据库nvarchar(max)字段时,非英语字符将插入为???。

如何从备注字段中获取数据,将其编码转换为Unicode,以便它在SQL Server数据库中也能正确显示?

请帮助!!!

2 个答案:

答案 0 :(得分:0)

我对数据网格控件没有直接经验,但我已经注意到某些数据库值未通过MS-Access控件正确显示。例如,Uniqueidentifiers被设置为'?????'表单上显示的值。您可以在调试窗口中尝试此操作,其中“myIdField”控件绑定到基础记录集中的“myIdField”字段(唯一标识符类型字段):

? screen.activeForm.recordset.fields("myIdField")
{F0E3C822-BEE9-474F-8A4D-445A33F363EE}

? screen.activeForm.controls("myIdField")
????

以下是Access Help在此问题上所说的内容:

  

Microsoft Jet数据库引擎将GUID存储为   Byte类型的数组。但是,Microsoft Access无法返回字节数据   来自表单或报告的控件。为了返回a的值   来自控件的GUID,您必须将其转换为字符串。转换一个   GUID到字符串,使用StringFromGUID函数。转换字符串   回到GUID,使用GUIDFromString函数。

因此,如果您要从控件中提取值以更新表(直接或通过记录集),您可能会面临类似的问题......

一种解决方案是直接从记录集原始值更新数据。另一种选择是使用包含必要转换指令的查询打开原始记录集,以便通过控件正确显示该字段。 我通常在类似的情况下做的,我必须从多个数据源(例如MS-Access和SQL Server)操作uniqueIdentifier字段,将这些字段“标准化”为记录集中的文本。然后使用以下查询构建记录集:

  • SQL Server

    “SELECT convert(nvarchar(36),myIdField)as myddField,.... FROM ....”

  • MS-访问

    “SELECT stringFromGUID(myIdField)as myIdField,.... FROM ....”

答案 1 :(得分:0)

我通过转换编码解决了这个问题,如下所示:

        //Define Windows 1252, Big5 and Unicode encodings
        System.Text.Encoding enc1252 = System.Text.Encoding.GetEncoding(1252);
        System.Text.Encoding encBig5 = System.Text.Encoding.GetEncoding(950);
        System.Text.Encoding encUTF16 = System.Text.Encoding.Unicode;

        byte[] arrByte1 = enc1252.GetBytes(note);  //string to be converted
        byte[] arrByte2 = System.Text.Encoding.Convert(encBig5, encUTF16, arrByte1);
        string convertedText = encUTF16.GetString(arrByte2);
        return convertedText;

谢谢大家投球!