【问题标题】:convert memo field in Access database from double byte to Unicode将 Access 数据库中的备注字段从双字节转换为 Unicode
【发布时间】:2011-10-03 06:37:46
【问题描述】:

我在一个系统上使用 Access 数据库,在另一个系统上使用 SQL Server。数据在这两个系统之间同步。 问题是 Access 数据库中的一个表中的字段之一是 双字节 格式的 Memo 字段。当我在 Windows 窗体中使用 DataGridView 读取此数据时,文本显示为 ???。 另外,当该字段的数据插入到 sql server 数据库的 nvarchar(max) 字段时,非英文字符插入为???。

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

请帮忙!!!

【问题讨论】:

  • 这里有任何帮助stackoverflow.com/questions/727583/… 吗?
  • 您真的需要通过数据网格步骤,还是可以将数据直接从 ms-access 移动到 SQL?
  • 嗨 Philippe...主要目的是将 Unicode 格式的数据移动到 SQL 服务器。我使用 DataGridView 作为一个简单的查看器。我可以跳过这一步。

标签: sql-server ms-access encoding memo


【解决方案1】:

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

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

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

以下是访问帮助关于此问题的说明:

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

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

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

  • SQL 服务器

    "SELECT convert(nvarchar(36),myIdField) as myIdField, .... FROM ...."

  • MS-Access

    "SELECT stringFromGUID(myIdField) as myIdField, .... FROM ...."

【讨论】:

  • 感谢您回复菲利普。我尝试了您在答案末尾指定的两个查询。他们都没有工作。我不关心查看 Access 数据库中的数据。我要做的就是将 Access 数据库文件的备注字段中的注释插入到 Sql Server 表的 nvarchar(max) 中。我面临的问题是 Memo 不理解 Unicode,而 nvarchar 可以。如何传输数据,以便也以正确的格式插入非英文字符?
  • 忘了说Access版本是97。
  • 我的 stringFromGUID 示例只是我用于将“唯一标识符”字节数据转换为文本的示例。它不适用于备注字段。 Yuor 的问题是找到将备注字段数据转换为“标准”文本数据的正确方法。如果这不能在 Access 端完成,那么 (1) 在 SQL 端填充 text 或 ntext 字段然后 (2) 使用 SQL convert 函数将数据从 text\ntext 字段传输到 nvarchar(max)领域?
  • 我没有 Access 97 来测试我的建议,所以我认为你必须测试这个解决方案!
  • 嗨菲利普,我实施了你的建议。我用备注字段数据填充了临时表的 nText 字段,然后使用转换函数并将数据插入到最终表的 nvarchar 字段中。但它没有用。还有其他想法吗?
【解决方案2】:

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

        //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;

感谢大家的参与!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多