请问在delphi中如何操作dbf数据表? 请问在delphi中如何操作dbf数据表,尤其是带有索引的dbf文件,我用query,table操作都提示“could not find language driver”,换成没有索引的dbf 文件一切正常,请问如何解决呀,有没有这方面的书籍,多谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用ODBC来访问就可以了,做好了ODBC后,在ADOconnection中选择你那个驱动,然后就可能在Query中写SQL了, 楼上的讲得到,建立ODBC,要注意SQL的使用 你要建立相应的odbc连接,并选择正确的驱动。 --/* dBase IV文件select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]')--*/--/* dBase III文件select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]')--*/--/* FoxPro 数据库select * from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\','select * from [aa.DBF]')--*//**************导入DBF文件****************/select * from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceDB=e:\VFP98\data;SourceType=DBF','select * from customer where country != "USA" order by country')go/***************** 导出到DBF ***************/如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句insert into openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\','select * from [aa.DBF]')select * from 表说明:SourceDB=c:\ 指定foxpro表所在的文件夹aa.DBF 指定foxpro表的文件名. //**************************************************************//功能: 将Dbf文件中的数据导入到SQL Server数据库中//說明://输入://输出: true 导出成功 false 导出失败//作者: 侯磊峰//日期: 2005-7-15//备注://*******************************************************************function TDbfDTS.FileToDB1: Boolean;type //dbf文件头结构 Tdbf_head = record Vers : char ; //版本标志 yy,mm,dd :Byte; // 最后更新年、月、日 No_Recs : Longword ; // 文件包含的总记录数; Head_Len,Rec_Len : word; //文件头长度,记录长度 Reserved : array[0..19] of char ; end; //dbf字段描述结构 Tdbf_field = record Field_Name : array[0..10] of char ; //字段名称; Field_Type : char; //字段类型 Offset : longword; //偏移量 Field_Length : byte; //字段长度 Field_Decimal : byte ; //浮点数整数部分长度 Reserved1 : array[0..1] of char; //保留 Dbaseiv_id : char; //DBASE IV work area id Reserved2 : array[0..9] of char; // Production_index : char ; // end; //dbf字段值 TDBFField = record Name : String[10]; First : Integer; Len : Integer; FieldType : String[1]; Value : String; end;var f : File; Dbf_head : Tdbf_head; Dbf_Field : Tdbf_field ; Rec_Count : Integer; Buf : pchar; i,j : Integer; DbfField : Array of TDbfField ; LenCount : Integer; RecordValue : String; Ads : TADODataSet ; Field,SqlStr : String; StepValue : Integer;begin Result := False ; if not FileExists(ReadyDTS.FileName) then begin MessageBox(0,Pchar('文件'+ReadyDTS.FileName+'不存在!!'),'提示',MB_ICONINFORMATION+MB_OK); exit; end; // 1 获得Field,执行ADS; Field := Trim(ReadyDTS.Field) ; if (Length(Field) = 0) or (Field = '*') then //所有字段 SqlStr := 'Select * From '+ReadyDTS.TableName+' Where 0=1' else SqlStr := 'Select '+Field+ ' From '+ReadyDTS.TableName+' Where 0=1' ; // 2 创建Ads Ads := TADODataSet.Create(nil); Ads.Connection := ReadyDTS.ADOCon; //关闭数据感知空间,可加快速度; Ads.DisableControls ; try ADS.Close; ADS.CommandText := SqlStr; ADS.Open; except on E:Exception do begin writeLog('TDbfDTS.FileToDB',E.Message); MessageBox(0,pchar('字段名'+Field+'有错!!'),'错误',MB_ICONERROR+MB_OK); Ads.Free; exit; end; end; AssignFile(f,ReadyDTS.FileName); Reset(f,1); try BlockRead(f,Dbf_head,Sizeof(dbf_head)); //记录总数 //头文件长度; //记录长度; //计算字段总数; Rec_Count := (Dbf_Head.Head_Len -296) div 32 ; SetLength(DBFField,Ads.Fields.Count); LenCount := 1; Seek(f,Sizeof(dbf_head)); for i := 0 to Rec_Count-1 do begin BlockRead(f,Dbf_Field,sizeof(Dbf_Field)); Field := Dbf_Field.Field_Name ; for j:=0 to Ads.Fields.Count - 1 do begin if UpperCase(Field)=UpperCase(Ads.Fields[j].FieldName) then begin DBFField[j].First := LenCount ; DBFField[j].Name := Dbf_Field.field_name; DBFField[j].Len := Dbf_Field.field_length ; DBFField[j].FieldType := Dbf_Field.field_type ;// DbfField[j].First := Dbf_Field.Offset ; Break; end; end; Seek(f,(i+1)*Sizeof(Dbf_Field)+Sizeof(Dbf_head)); LenCount := LenCount + Dbf_Field.field_length ; end; ProgressBarShow('从Dbf转换数据至Sql Server,请稍候...'); ReadyDTS.ADOCon.BeginTrans; try Seek(f,Dbf_head.head_len); buf := AllocMem(DBF_Head.Rec_Len); for i:=0 to Dbf_Head.No_Recs - 1 do begin // 如CancelDTS为true 则中断数据转换; if CancelDTS = true then begin ReadyDTS.ADOCon.RollbackTrans; exit ; end; BlockRead(f,Buf^,Dbf_Head.Rec_Len); RecordValue := Buf ; RecordValue := Trim(RecordValue); Ads.Append; for j:=0 to Ads.Fields.Count-1 do begin Dbffield[j].Value :=Copy(RecordValue,DBFField[j].First,DBFField[j].Len); Ads.FieldValues[DbfField[j].Name] := DbfField[j].Value; end; Ads.Post; Seek(f,(i+1)*Dbf_Head.Rec_Len+Dbf_Head.head_len); if i mod Con_RefreshRecord = 0 then begin StepValue := (i*100) div Dbf_Head.No_Recs ; ProgressBarStep( StepValue ,i); Application.ProcessMessages; end; end; ReadyDTS.ADOCon.CommitTrans; FreeMem(buf); Result := true ; except On e : Exception do begin ReadyDTS.ADOCon.RollbackTrans; WriteLog('TDbfDTS.FileToDB',E.Message); MessageBox(0,'读Dbf数据或存Sql Server数据库错误!!','错误',MB_ICONERROR+MB_OK); end; end; finally ProgressBarClose; CloseFile(f); end;end; //*******************************************************//创建一个ODBC系统数据源(DSN),//数据源名称:MyDbf//数据库驱动文件:System32/vfpodbc.dll//数据库类型: DBF//数据存放目录:DbfFilePath//*******************************************************}procedure TDbfDTS.CreateDbfOdbc(DbfFilePath:String);var registerTemp : TRegistry; Sysdir : array[0..256] of char ; SystemName,DriverFileName : String;begin //获得系统目录;驱动文件; GetSystemDirectory(SysDir,256); SystemName := SysDir ; DriverFileName := SystemName + '/' + 'vfpodbc.dll'; registerTemp := TRegistry.Create; //建立一个Registry实例 try with registerTemp do begin RootKey:=HKEY_LOCAL_MACHINE;//设置根键值为HKEY_LOCAL_MACHINE //找到Software\ODBC\ODBC.INI\ODBC Data Sources if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then begin //注册一个DSN名称 WriteString( 'MyDbf', 'Microsoft Visual FoxPro Driver' ); end else begin//创建键值失败 MessageBox(0,'增加ODBC数据源失败','错误',MB_OK+MB_ICONERROR); exit; end; CloseKey; //找到或创建Software\ODBC\ODBC.INI\MyAccess,写入DSN配置信息 if OpenKey('Software\ODBC\ODBC.INI\MyDbf',True) then begin WriteString( 'SourceDB', DbfFilePath );//DBF目录 WriteString( 'SourceType', 'DBF' );//数据类型 WriteString( 'Driver', DriverFileName );//驱动程序DLL文件 end else//创建键值失败 begin MessageBox(0,'增加ODBC数据源失败','错误',MB_OK+MB_ICONERROR); exit; end; CloseKey; end; finally registerTemp.Free; end;end; 怎么把查询出来的结果生成XML形式的文件? 要如何计算一个DBGrid中字段所占的宽度?谢谢! Delphi中可以处理的流的最大长度是多少? 如何在运行时《调出控件属性窗口》设置控件的属性? 请问如何获得一个Agent角色所支持的动作? !!!!··字体问题··解决者高分赠送!!!!!!! 我用的字符串里有一个单引号字符,该怎么转意呢? copy,cut,paste的疑惑? 各位大哥,有什么高招清出消息队列? 有关外观 用adoquery多表查询和删除数据的问题 高手,请教啊
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]')
--*/--/* dBase III文件
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]')
--*/--/* FoxPro 数据库
select * from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')
--*//**************导入DBF文件****************/
select * from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;
SourceDB=e:\VFP98\data;
SourceType=DBF',
'select * from customer where country != "USA" order by country')
go
/***************** 导出到DBF ***************/
如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句insert into openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')
select * from 表说明:
SourceDB=c:\ 指定foxpro表所在的文件夹
aa.DBF 指定foxpro表的文件名.
//功能: 将Dbf文件中的数据导入到SQL Server数据库中
//說明:
//输入:
//输出: true 导出成功 false 导出失败
//作者: 侯磊峰
//日期: 2005-7-15
//备注:
//*******************************************************************
function TDbfDTS.FileToDB1: Boolean;
type
//dbf文件头结构
Tdbf_head = record
Vers : char ; //版本标志
yy,mm,dd :Byte; // 最后更新年、月、日
No_Recs : Longword ; // 文件包含的总记录数;
Head_Len,Rec_Len : word; //文件头长度,记录长度
Reserved : array[0..19] of char ;
end;
//dbf字段描述结构
Tdbf_field = record
Field_Name : array[0..10] of char ; //字段名称;
Field_Type : char; //字段类型
Offset : longword; //偏移量
Field_Length : byte; //字段长度
Field_Decimal : byte ; //浮点数整数部分长度
Reserved1 : array[0..1] of char; //保留
Dbaseiv_id : char; //DBASE IV work area id
Reserved2 : array[0..9] of char; //
Production_index : char ; //
end;
//dbf字段值
TDBFField = record
Name : String[10];
First : Integer;
Len : Integer;
FieldType : String[1];
Value : String;
end;
var
f : File;
Dbf_head : Tdbf_head;
Dbf_Field : Tdbf_field ;
Rec_Count : Integer;
Buf : pchar;
i,j : Integer;
DbfField : Array of TDbfField ;
LenCount : Integer;
RecordValue : String; Ads : TADODataSet ;
Field,SqlStr : String; StepValue : Integer;
begin
Result := False ; if not FileExists(ReadyDTS.FileName) then
begin
MessageBox(0,Pchar('文件'+ReadyDTS.FileName+'不存在!!'),'提示',MB_ICONINFORMATION+MB_OK);
exit;
end; // 1 获得Field,执行ADS;
Field := Trim(ReadyDTS.Field) ;
if (Length(Field) = 0) or (Field = '*') then //所有字段
SqlStr := 'Select * From '+ReadyDTS.TableName+' Where 0=1'
else
SqlStr := 'Select '+Field+ ' From '+ReadyDTS.TableName+' Where 0=1' ; // 2 创建Ads
Ads := TADODataSet.Create(nil);
Ads.Connection := ReadyDTS.ADOCon;
//关闭数据感知空间,可加快速度;
Ads.DisableControls ;
try
ADS.Close;
ADS.CommandText := SqlStr;
ADS.Open;
except
on E:Exception do
begin
writeLog('TDbfDTS.FileToDB',E.Message);
MessageBox(0,pchar('字段名'+Field+'有错!!'),'错误',MB_ICONERROR+MB_OK);
Ads.Free;
exit;
end;
end; AssignFile(f,ReadyDTS.FileName);
Reset(f,1);
try
BlockRead(f,Dbf_head,Sizeof(dbf_head));
//记录总数
//头文件长度;
//记录长度;
//计算字段总数;
Rec_Count := (Dbf_Head.Head_Len -296) div 32 ; SetLength(DBFField,Ads.Fields.Count);
LenCount := 1;
Seek(f,Sizeof(dbf_head));
for i := 0 to Rec_Count-1 do
begin
BlockRead(f,Dbf_Field,sizeof(Dbf_Field)); Field := Dbf_Field.Field_Name ;
for j:=0 to Ads.Fields.Count - 1 do
begin
if UpperCase(Field)=UpperCase(Ads.Fields[j].FieldName) then
begin
DBFField[j].First := LenCount ;
DBFField[j].Name := Dbf_Field.field_name;
DBFField[j].Len := Dbf_Field.field_length ;
DBFField[j].FieldType := Dbf_Field.field_type ;
// DbfField[j].First := Dbf_Field.Offset ;
Break;
end;
end; Seek(f,(i+1)*Sizeof(Dbf_Field)+Sizeof(Dbf_head));
LenCount := LenCount + Dbf_Field.field_length ;
end; ProgressBarShow('从Dbf转换数据至Sql Server,请稍候...'); ReadyDTS.ADOCon.BeginTrans;
try
Seek(f,Dbf_head.head_len);
buf := AllocMem(DBF_Head.Rec_Len);
for i:=0 to Dbf_Head.No_Recs - 1 do
begin
// 如CancelDTS为true 则中断数据转换;
if CancelDTS = true then
begin
ReadyDTS.ADOCon.RollbackTrans;
exit ;
end; BlockRead(f,Buf^,Dbf_Head.Rec_Len);
RecordValue := Buf ;
RecordValue := Trim(RecordValue);
Ads.Append;
for j:=0 to Ads.Fields.Count-1 do
begin
Dbffield[j].Value :=Copy(RecordValue,DBFField[j].First,DBFField[j].Len);
Ads.FieldValues[DbfField[j].Name] := DbfField[j].Value;
end;
Ads.Post;
Seek(f,(i+1)*Dbf_Head.Rec_Len+Dbf_Head.head_len);
if i mod Con_RefreshRecord = 0 then
begin
StepValue := (i*100) div Dbf_Head.No_Recs ;
ProgressBarStep( StepValue ,i);
Application.ProcessMessages;
end;
end;
ReadyDTS.ADOCon.CommitTrans;
FreeMem(buf);
Result := true ;
except
On e : Exception do
begin
ReadyDTS.ADOCon.RollbackTrans;
WriteLog('TDbfDTS.FileToDB',E.Message);
MessageBox(0,'读Dbf数据或存Sql Server数据库错误!!','错误',MB_ICONERROR+MB_OK);
end;
end;
finally
ProgressBarClose;
CloseFile(f);
end;
end;
//创建一个ODBC系统数据源(DSN),
//数据源名称:MyDbf
//数据库驱动文件:System32/vfpodbc.dll
//数据库类型: DBF
//数据存放目录:DbfFilePath
//*******************************************************}
procedure TDbfDTS.CreateDbfOdbc(DbfFilePath:String);
var
registerTemp : TRegistry;
Sysdir : array[0..256] of char ;
SystemName,DriverFileName : String;
begin
//获得系统目录;驱动文件;
GetSystemDirectory(SysDir,256);
SystemName := SysDir ;
DriverFileName := SystemName + '/' + 'vfpodbc.dll'; registerTemp := TRegistry.Create; //建立一个Registry实例
try
with registerTemp do
begin
RootKey:=HKEY_LOCAL_MACHINE;//设置根键值为HKEY_LOCAL_MACHINE //找到Software\ODBC\ODBC.INI\ODBC Data Sources
if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then
begin //注册一个DSN名称
WriteString( 'MyDbf', 'Microsoft Visual FoxPro Driver' );
end
else
begin//创建键值失败
MessageBox(0,'增加ODBC数据源失败','错误',MB_OK+MB_ICONERROR);
exit;
end;
CloseKey; //找到或创建Software\ODBC\ODBC.INI\MyAccess,写入DSN配置信息
if OpenKey('Software\ODBC\ODBC.INI\MyDbf',True) then
begin
WriteString( 'SourceDB', DbfFilePath );//DBF目录
WriteString( 'SourceType', 'DBF' );//数据类型
WriteString( 'Driver', DriverFileName );//驱动程序DLL文件
end
else//创建键值失败
begin
MessageBox(0,'增加ODBC数据源失败','错误',MB_OK+MB_ICONERROR);
exit;
end;
CloseKey;
end;
finally
registerTemp.Free;
end;
end;