我正在使用Delphi 7和ADO(TAdoTable组件)。
我需要使用ADO从“DBase IV”表(dbf / dbt)读取二进制数据。二进制数据存储在BLOB字段中。
此表先前由BDE以编程方式创建(使用了TTable组件)。 BLOB字段的“Transliterate”属性设置为false,因此该表中的二进制数据存储没有变化,“按原样”(我通过HexEdit检查)。
我所需要的只是通过NO TRANSLITERATION读取这个二进制数据。
我的步骤:
Source : TADOTable;
prepList : TBlobField;
str : string;
...
Source.Open; //Open table
prepList:=source.FieldByName('PREPLIST') as TBlobField; //Get BLOB field
prepList.Transliterate:=false; //No need to transliterate
...
str:=prepList.AsString; //Reading data
...
“str”中的数据有时与实际存储的数据不同。 例如,我得到:
$AF $67
而不是实际数据,因为它存储在表的DBT部分中:
$F4 $67
当我以完全相同的方式使用BDE和TTable组件时(Transliterate:= false),这没关系。但是对于ADO,尽管有音译价值,它总是音译数据。如果将Transliterate设置为true,也可以使用BDE获得相同的结果。
也许我需要在ConnectionString中设置一些参数?
我尝试了这些ConnectionStrings(%s - 表目录的路径):
//Using provider JET 4.0
cConnectionString=
'Provider=Microsoft.Jet.OLEDB.4.0;'+
'User ID=Admin;'+
'Data Source=%s;'+
'Mode=Share Deny None;'+
'Extended Properties=DBASE IV;'+
'Jet OLEDB:System database="";'+
'Jet OLEDB:Registry Path="";'+
'Jet OLEDB:Database Password="";'+
'Jet OLEDB:Engine Type=17;'+
'Jet OLEDB:Database Locking Mode=0;'+
'Jet OLEDB:Global Partial Bulk Ops=2;'+
'Jet OLEDB:Global Bulk Transactions=1;'+
'Jet OLEDB:New Database Password="";'+
'Jet OLEDB:Create System Database=False;'+
'Jet OLEDB:Encrypt Database=False;'+
'Jet OLEDB:Don''t Copy Locale on Compact=False;'+
'Jet OLEDB:Compact Without Replica Repair=False;'+
'Jet OLEDB:SFP=False;';
//Using ODBC driver
cConnectionString=
'Driver={Microsoft dBASE Driver (*.dbf)};'+
'DriverID=277;'+
'Dbq=%s;';
两种方式 - 结果相同。
如何让ADO不在BLOB字段中音译二进制数据?
更新: 我只能使用默认情况下可用的数据提供程序或ODBC驱动程序(程序将在虚拟用户计算机上运行)。所以我不能使用例如VFPOLEDB或其他需要安装的提供程序。另外,据我所知,VFPOLEDB仅适用于FoxPro,而不适用于DBase表。