我将Access数据库用于一个系统,而SQL服务器用于另一个系统。数据在这两个系统之间同步。 问题是Access数据库表中的一个字段是备注字段,其格式为双字节。当我在Windows窗体中使用DataGridView读取此数据时,文本显示为???。 此外,当来自此字段的数据插入sql server数据库nvarchar(max)字段时,非英语字符将插入为???。
如何从备注字段中获取数据,将其编码转换为Unicode,以便它在SQL Server数据库中也能正确显示?
请帮助!!!
答案 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;
谢谢大家投球!