Delphi .DBF文件中的数据未复制到SQLite文件

Delphi .DBF文件中的数据未复制到SQLite文件,delphi,sqlite,delphi-xe5,Delphi,Sqlite,Delphi Xe5,我在Windows7操作系统上使用DelphiXe5 我有.dbf文件和这个文件数据,我需要移动到SQLite文件 观察:当我在NaviCat for SQLite中导入这个文件时,我看到了ASCII格式的数据。从ADODataset(保存.dbf文件中的数据)复制数据时,我看到了ftWideString和ftWideMemo,为类型为TFDQuery的“查询”组件指定适当的数据类型时是否出错?但情况并非总是如此,即dbf文件也可能包含正常的字母数字字符。目的是将任何类型的数据从.dbf文件发布

我在Windows7操作系统上使用DelphiXe5

我有.dbf文件和这个文件数据,我需要移动到SQLite文件

观察:当我在NaviCat for SQLite中导入这个文件时,我看到了ASCII格式的数据。从ADODataset(保存.dbf文件中的数据)复制数据时,我看到了ftWideString和ftWideMemo,为类型为TFDQuery的“查询”组件指定适当的数据类型时是否出错?但情况并非总是如此,即dbf文件也可能包含正常的字母数字字符。目的是将任何类型的数据从.dbf文件发布到SQLite文件

下面的过程将数据发布到SQLite文件中,我在发布数据时没有收到任何错误,但当我在NaviCat中打开SQLite文件时,我没有看到空白记录

procedure TfrmMainForm.InsertDatabtnClick(Sender: TObject);
我正在使用以下代码进行尝试:

代码:

const
MyDBFile='C:\TempDB\mysqllightdb.db';
类型
TfrmMainForm=类(TForm)
ADO连接1:TADOConnection;
CreateTablebtn:TButton;
ADODataSet1:TADODataSet;
数据源1:TDataSource;
FDGUIxWaitCursor1:TFDGUIxWaitCursor;
InsertDatabtn:t按钮;
FDQuery1:TFDQuery;
SQLConnection1:TSQLConnection;
ADODataSet2:TADODataSet;
过程CreateTableBtclick(发送方:ToObject);
程序表单显示(发送方:TObject);
过程FormClose(发送方:ToObject;var操作:TCloseAction);
过程InsertDatabtnClick(发送方:TObject);
私有的
{私有声明}
连接:TFD连接;
DriverLink:TFDPhysSQLiteDriverLink;
表:TFDTable;
查询:TFDQuery;
公众的
{公开声明}
结束;
变量
frmanotify:tfrmmain表单;
实施
{$R*.dfm}
程序TfrmMainForm.FormShow(发送方:TObject);
开始
创建组件;
结束;
过程TfrmMainForm.CreateTablebtnClick(发送方:TObject);
开始
连接到数据库文件;
结束;
过程TfrmMainForm.ConnectTodatabaseFile;
变量
dbf_文件夹:字符串;
开始
dbf_文件夹:='C:\TempDB'//在此处设置dbf文件夹位置
ADOConnection1.LoginPrompt:=false;
ADOConnection1.ConnectionString:=Format('Provider=Microsoft.JET.OLEDB.4.0;数据源=%s;扩展属性=dBase IV;',[dbf_folder]);
ADODataSet1.ConnectionString:=Format('Provider=Microsoft.JET.OLEDB.4.0;数据源=%s;扩展属性=dBase IV;',[dbf_folder]);
尝试
ADOConnection1.Connected:=True;
ADODataSet1.CommandText:=“从MyFileName.dbf中选择*”//使用dbf文件名进行SQL查询
ADODataSet1.Open;
CreateSQLiteTable;
ShowMessage(“已成功创建表”);
除了
关于E:Exception-do
ShowMessage(E.Message);
结束;
结束;
程序TfrmMainForm.CreateSQLiteTable;
变量
FFieldName,FCreateSQL:字符串;
FColumnCount:整数;
开始
FCreateSQL:=“创建表MyTable1(”;
对于FColumnCount:=0到ADODataSet1.FieldCount-1 do
开始
FFieldName:=ADODataSet1.Fields[FColumnCount].FieldName;
FCreateSQL:=FCreateSQL+FFieldName+“”+FieldTypeToSQLString(ADODataSet1.Fields[FColumnCount].DataType,ADODataSet1.Fields[FColumnCount].DataSize);
如果FColumnCount ADODataSet1.FieldCount-1,则
FCreateSQL:=FCreateSQL+',';
结束;
FCreateSQL:=FCreateSQL+');
查询。关闭;
Query.SQL.Clear;
Query.SQL.Add(FCreateSQL);
Query.ExecSQL;
结束;
过程TfrmMainForm.InsertDatabtnClick(发送方:TObject);
变量
FSQLString:String;
FColumnCount:整数;
开始
查询。关闭;
Query.CachedUpdates:=True;
Query.SQL.Clear;
Query.SQL.Add('从MyTable1中选择*,其中1=2');
Query.Active:=True;
ADODataSet1.首先;
而不是ADODataSet1.eof do
开始
查询.插入;
对于FColumnCount:=0到ADODataSet1.FieldCount-1 do
开始
Query.Fields[FColumnCount]。值:=ADODataSet1.Fields[FColumnCount]。值;
结束;
ADODataSet1.Next;
结束;
查询、编辑;
查询、邮寄;
查询提交日期;
ShowMessage(“插入数据”);
结束;
程序TfrmMainForm.CreateComponents;
开始
DriverLink:=tfdphysqlitedriverlink.Create(Self);
连接:=TFDConnection.Create(self);
Connection.Params.Values['DriverID']:='SQLite';
Connection.Params.Values['Database']:=MyDBFile;
Connection.Connected:=True;
Table:=TFDTable.Create(self);
查询:=TFDQuery.Create(self);
Query.Connection:=连接;
表.连接:=连接;
结束;
过程TfrmMainForm.FormClose(发送方:TObject;var操作:TCloseAction);
开始
删除组件;
结束;
程序TfrmMainForm.DeleteComponents;
开始
连接。免费;
DriverLink.Free;
表1.免费;
免费查询;
结束;
函数TfrmMainForm.FieldTypeToSQLString(T:TFieldType;L:Longint):字符串;
开始
案例T
ftString:Result:='VARCHAR('+IntToStr(L)+');
ftSmallint:Result:=“SMALLINT”;
ftInteger:结果:='整数';
ftWord:Result:=“SMALLINT”;
ftBoolean:结果:='BOOLEAN';
ftFloat:结果:='FLOAT';
ftCurrency:结果:=‘MONEY’;
ftBCD:结果:='DECIMAL';
ftDate:结果:='DATE';
ftTime:结果:='时间';
ftDateTime:结果:='时间戳';
ftBytes:Result:='BLOB('+IntToStr(L)+',2';
ftVarBytes:Result:='BLOB('+IntToStr(L)+',2';
ftAutoInc:结果:='AUTOINC';
ftBlob:Result:='BLOB('+IntToStr(L)+',1';
ftMemo:Result:='BLOB('+IntToStr(L)+',1';
ftGraphic:Result:='BLOB('+IntToStr(L)+',5';
ftFmtMemo:Result:='BLOB('+IntToStr(L)+',3';
ftParadoxOle:结果:='BLOB('+IntToStr(L)+',4';
ftdbasole:Result:='BLOB('+IntToStr(L)+',4';
ftTypedBinary:Result:='BLOB('+IntToStr(L)+',2';
ftFixedChar:Result:='CHAR('+IntToStr(L)+');
ftWideString:Result:='VARCHAR('+IntToStr(L)+');
ftWideMemo:Result:=“NTEXT”;
ftLargeInt:结果:='INTEGER'
其他的
结果:=“未知!”;
结束;
结束;
结束。

在下面的循环中,您应该为插入的每一行调用Query.Post,正如您已经调用Query.insert一样,您应该
const
  MyDBFile = 'C:\TempDB\MYSQLightDB.db';

type
  TfrmMainForm = class(TForm)
    ADOConnection1: TADOConnection;
    CreateTablebtn: TButton;
    ADODataSet1: TADODataSet;
    DataSource1: TDataSource;
    FDGUIxWaitCursor1: TFDGUIxWaitCursor;
    InsertDatabtn: TButton;
    FDQuery1: TFDQuery;
    SQLConnection1: TSQLConnection;
    ADODataSet2: TADODataSet;

    procedure CreateTablebtnClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure InsertDatabtnClick(Sender: TObject);
  private
    { Private declarations }
    Connection : TFDConnection;
    DriverLink : TFDPhysSQLiteDriverLink;
    Table : TFDTable;
    Query : TFDQuery;
  public
    { Public declarations }
  end;

var
  frmMainForm: TfrmMainForm;

implementation

{$R *.dfm}


procedure TfrmMainForm.FormShow(Sender: TObject);
begin
  CreateComponents;
end;

procedure TfrmMainForm.CreateTablebtnClick(Sender: TObject);
begin
  ConnectTodatabaseFile;
end;

procedure TfrmMainForm.ConnectTodatabaseFile;
var
  dbf_folder : string;
begin
  dbf_folder:='C:\TempDB';//set your dbf folder location here
  ADOConnection1.LoginPrompt:=false;
  ADOConnection1.ConnectionString:=Format('Provider=Microsoft.JET.OLEDB.4.0;Data Source=%s;Extended Properties=dBase IV;',[dbf_folder]);
  ADODataSet1.ConnectionString:=Format('Provider=Microsoft.JET.OLEDB.4.0;Data Source=%s;Extended Properties=dBase IV;',[dbf_folder]);
  try
    ADOConnection1.Connected:=True;
    ADODataSet1.CommandText:='Select * from MyFileName.dbf'; //make your SQL query using the name of the dbf file
    ADODataSet1.Open;

    CreateSQLiteTable;

    ShowMessage('Table created successfully');
  except
    on E : Exception do
      ShowMessage(E.Message);
  end;
end;

procedure TfrmMainForm.CreateSQLiteTable;
var
  FFieldName, FCreateSQL : string;
  FColumnCount : Integer;
begin
  FCreateSQL := 'Create Table MyTable1 (';
  for FColumnCount := 0 to ADODataSet1.FieldCount - 1 do
  begin
    FFieldName := ADODataSet1.Fields[FColumnCount].FieldName;
    FCreateSQL := FCreateSQL + FFieldName + ' ' + FieldTypeToSQLString(ADODataSet1.Fields[FColumnCount].DataType, ADODataSet1.Fields[FColumnCount].DataSize);

    if FColumnCount <> ADODataSet1.FieldCount - 1 then
      FCreateSQL := FCreateSQL + ', ';
  end;

  FCreateSQL := FCreateSQL + ')';

  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Add(FCreateSQL);
  Query.ExecSQL;
end;

procedure TfrmMainForm.InsertDatabtnClick(Sender: TObject);
var
  FSQLString : String;
  FColumnCount : Integer;
begin
  Query.Close;
  Query.CachedUpdates := True;
  Query.SQL.Clear;
  Query.SQL.Add('Select * from MyTable1 where 1 = 2');
  Query.Active := True;

  ADODataSet1.First;
  while not ADODataSet1.eof do
  begin
    Query.Insert;

    for FColumnCount := 0 to ADODataSet1.FieldCount - 1 do
    begin
      Query.Fields[FColumnCount].Value := ADODataSet1.Fields[FColumnCount].Value;
    end;

    ADODataSet1.Next;
  end;

  Query.Edit;
  Query.Post;
  Query.CommitUpdates;

  ShowMessage('Data Inserted');
end;

procedure TfrmMainForm.CreateComponents;
begin
  DriverLink := TFDPhysSQLiteDriverLink.Create(Self);
  Connection := TFDConnection.Create(self);

  Connection.Params.Values['DriverID'] := 'SQLite';
  Connection.Params.Values['Database'] := MyDBFile;
  Connection.Connected := True;

  Table := TFDTable.Create(self);
  Query := TFDQuery.Create(self);

  Query.Connection := Connection;
  Table.Connection := Connection;
end;

procedure TfrmMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DeleteComponents;
end;

procedure TfrmMainForm.DeleteComponents;
begin
  Connection.Free;
  DriverLink.Free;
  Table.Free;
  Query.Free;
end;

Function TfrmMainForm.FieldTypeToSQLString(T : TFieldType; L : Longint) : String;
Begin
  case T of
    ftString : Result := 'VARCHAR('+IntToStr(L)+')';
    ftSmallint : Result := 'SMALLINT';
    ftInteger : Result := 'INTEGER';
    ftWord : Result := 'SMALLINT';
    ftBoolean : Result := 'BOOLEAN';
    ftFloat : Result := 'FLOAT';
    ftCurrency : Result := 'MONEY';
    ftBCD : Result := 'DECIMAL';
    ftDate : Result := 'DATE';
    ftTime : Result := 'TIME';
    ftDateTime : Result := 'TIMESTAMP';
    ftBytes : Result := 'BLOB('+IntToStr(L)+',2)';
    ftVarBytes : Result := 'BLOB('+IntToStr(L)+',2)';
    ftAutoInc : Result := 'AUTOINC';
    ftBlob : Result := 'BLOB('+IntToStr(L)+',1)';
    ftMemo : Result := 'BLOB('+IntToStr(L)+',1)';
    ftGraphic : Result := 'BLOB('+IntToStr(L)+',5)';
    ftFmtMemo : Result := 'BLOB('+IntToStr(L)+',3)';
    ftParadoxOle : Result := 'BLOB('+IntToStr(L)+',4)';
    ftDBaseOle : Result := 'BLOB('+IntToStr(L)+',4)';
    ftTypedBinary : Result := 'BLOB('+IntToStr(L)+',2)';
    ftFixedChar : Result := 'CHAR('+IntToStr(L)+')';
    ftWideString : Result := 'VARCHAR('+IntToStr(L)+')';
    ftWideMemo : Result := 'NTEXT';
    ftLargeInt : Result := 'INTEGER'
  else
    Result := 'UNKNOWN!';
  end;
End;

end.
  while not ADODataSet1.eof do
  begin
    Query.Insert;

    for FColumnCount := 0 to ADODataSet1.FieldCount - 1 do
    begin
      Query.Fields[FColumnCount].Value := ADODataSet1.Fields[FColumnCount].Value;
    end;

    //Query.Edit;
    Query.Post;
    ADODataSet1.Next;
  end;

  Query.CommitUpdates;

  ShowMessage('Data Inserted');
procedure TfrmMainForm.InsertDatabtnClick(Sender: TObject);
var
  FSQLString : WideString;
  FColumnCount : Integer;
  FSQLPrepared : Boolean;
begin
  FSQLPrepared := False;
  Query.Close;
  Query.CachedUpdates := True;

  if not ADODataSet1.Active then
    ADODataSet1.Active := True;

  ADODataSet1.First;
  while not ADODataSet1.eof do
  begin
    //Also script component could be used to execute bulk amount of insert SQL
    FSQLString := 'Insert Into MyTable1 Values(';

    for FColumnCount := 0 to ADODataSet1.FieldCount - 1 do
    begin
      //Query.Fields[FColumnCount].Value := ADODataSet1.Fields[FColumnCount].Value;
      FSQLString := FSQLString + QuotedStr(ADODataSet1.Fields[FColumnCount].AsString);

      if FColumnCount <> ADODataSet1.FieldCount - 1 then
        FSQLString := FSQLString + ', ';
    end;

    FSQLString := FSQLString + ')';

    Query.Close;
    Query.SQL.Clear;
    Query.SQL.Add(FSQLString);

    if not FSQLPrepared then
    begin
      Query.Prepared := True;
      FSQLPrepared := True;
    end;

    Query.ExecSQL;

    ADODataSet1.Next;
  end;

  ShowMessage('Data Inserted');
end;
Query.ApplyUpdates(0);
procedure TfrmMainForm.InsertDatabtnClick(Sender: TObject);
var
  FSQLString : String;
  FColumnCount : Integer;
begin
  Query.Close;
  Query.CachedUpdates := True;
  Query.SQL.Clear;
  Query.SQL.Add('Select * from MyTable1 where 1 = 2');
  Query.Active := True;

  ADODataSet1.First;
  while not ADODataSet1.eof do
  begin
    Query.Insert;

    for FColumnCount := 0 to ADODataSet1.FieldCount - 1 do
    begin
      Query.Fields[FColumnCount].Value := ADODataSet1.Fields[FColumnCount].Value;
    end;

    ADODataSet1.Next;
  end;

  Query.ApplyUpdates(0);
  Query.CommitUpdates;

  ShowMessage('Data Inserted');
end;