怎样用ADO把一个dbf文件里的内容导入到另一个dbf文件里?
解决方案 »
- 怎么表示adoquery找到的记录的下一个记录?急……
- 怎么样才能实现vs.net的效果
- 一个关于Variant和CopyMemory 的问题,标题中很难说明白,进来就知道了.
- 请问用DELPHI连接的数据库怎么发布?
- 一个关于接口(双机通信)的小问题,大家进来看看。
- 各位高手帮忙!!!!谢谢了!!小弟做的东西很简单的!!!谢谢了!
- 创建唯一的 MDIChild 窗体
- 如何屏蔽鼠标按键
- socket 怎么传送和接受自定义结构体:Type userinfo=record name:string; end;
- 光纤问题
- 我想截取“.”号后的所有字符,该如何制作,请高手帮忙。
- 想在网上有偿发布自己的软件,征求一下方案
用别一个ADOQuery2存入另一个DBF文件中
//功能: 将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;
用sql语句老报语法错