我正在使用Delphi Seattle在全新的SQLite文件中创建全新的表,并且仅使用FieldDefs和非可视代码。我可以使用ExecSQL('CREATE TABLE ....')语法创建一个表,但是不能如下所示(我执行'CreateDataSet'调用时会得到'No such table'MyTable')。我想要一些允许我与FieldDefs一起使用的解决方案。此代码以此处的示例为模型。不过,我注意到,有关CreateDataSet的说明仅适用于TFDMemTable。有没有在不使用ExecSQL的情况下创建SQLite表的运行时方法?
procedure Test;
const
MyDBFile = 'c:\scratch\hope.db';
var
Connection : TFDConnection;
DriverLink : TFDPhysSQLiteDriverLink;
Table : TFDTable;
begin
DeleteFile( MyDBFile );
DriverLink := TFDPhysSQLiteDriverLink.Create( nil );
Connection := TFDConnection.Create( nil );
try
Connection.Params.Values['DriverID'] := 'SQLite';
Connection.Params.Values['Database'] := MyDBFile;
Connection.Connected := True;
Table := TFDTable.Create( nil );
try
Table.TableName := 'MyTable';
Table.Connection := Connection;
Table.FieldDefs.Add( 'one', ftString, 20 );
Table.FieldDefs.Add( 'two', ftString, 20 );
Table.CreateDataSet;
// I would add records here....
finally
Table.Free;
end;
finally
Connection.Free;
DriverLink.Free;
end;
end;
CreateDataSet通常是用于将客户端数据集初始化为空状态的本地操作。如果要使用TClientDataSet,则无法使用它创建服务器端表。
要创建实际的服务器表,我希望必须构造DDL SQL来创建表,然后使用ExecSQL在(客户端)数据集上执行该表,就像您已经尝试过的那样。
更新
尽管使用了不显示FieldDefs的TFDTable组件,但以下内容似乎满足了您在代码中进行所有操作的要求,因此我改用了代码创建的TFields。在D10西雅图测试。
procedure TForm3.CreateDatabaseAndTable;
const
DBName = 'd:\delphi\code\sqlite\atest.sqlite';
var
AField : TField;
begin
if FileExists(DBName) then
DeleteFile(DBName);
AField := TLargeIntField.Create(Self);
AField.Name := 'IDField';
AField.FieldName := 'ID';
AField.DataSet := FDTable1;
AField := TWideStringField.Create(Self);
AField.Size := 80;
AField.Name := 'NameField';
AField.FieldName := 'Name';
AField.DataSet := FDTable1;
FDConnection1.Params.Values['database'] := DBName;
FDConnection1.Connected:= True;
FDTable1.TableName := 'MyTable';
FDTable1.CreateTable(False, [tpTable]);
FDTable1.Open();
FDTable1.InsertRecord([1, 'First']);
FDConnection1.Commit;
FDConnection1.Connected:= False;
end;
我希望,如果有人通过FDTableAdaptor正确地将其连接到服务器端组件(FDCommand?),则可以使用TFDMemTable的FieldDefs做一个比我熟悉的人做类似的事情。
首先,我使用了LargeInt ID字段和WideString Name字段,因为前一段时间尝试将Sqlite与D7一起使用,尝试使用Integer和string字段没有麻烦。
顺便说一句,如果您知道部署前需要的结构,则可能会发现,只要将空的数据库+表复制到适当的位置,而不是尝试就地创建表,就可以得到更可预测/更可靠的结果。Ymmv,当然。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句