使用FireDAC连接(Delphi Xe6)时,在MS ACCESS中创建表时出错。
创建一个新的数据库文件,并使用TFDCommand或TFDQuery创建3个表,这些表确实已创建,但我总是收到错误'表已经存在'。任何阻止提出错误的建议
我确实包含了代码......除了常规。
代码:
FDCommand1.CommandText.Text := 'CREATE Table [SampleData] ' +
'([SampleID] INTEGER Primary Key NOT NULL, ' +
' [RiskIDX] INTEGER NULL,' +
' [RefSampleID] Char(10) NULL,' +
' [SerialNumber] Char(60) NULL,' +
' [TestDate] DateTime NULL,' +
' [ResampleDate] DateTime NULL,' +
' [SampleDate] DateTime NULL,' +
' [SamplingPoint] Char(60) NULL,' +
' [LabTech] Char(60) NULL, SampledBy Char(60) NULL,' +
' [Status] Char(60) NULL,' +
' [Source] Char(60) NULL,' +
' [Condition] Char(60) NULL,' +
' [PlotPnt] YESNO,' +
' [Comments] Memo' +
' CONSTRAINT FKSampleId Foreign Key SerialNumber
References AssetInfo SerialNo);';
OR
FDQuery1.SQL.Text := Memo1.text; //Create table SQL command
FDQuery1.Prepare;
FDQuery1.Execute(200,0);
通过一些实验,我发现FDCommand和FDQuery组件在这种情况下不起作用;即使您事先检查表格不存在也不行。 (我不太清楚为什么 - 但在我看来,SQL命令被发送两次,因此表存在错误)。但是,FDConnection.ExecSQL确实有效。尝试和测试(根据需要创建3个带有CONSTRAINTS的表)。
此致 TomD
答案 0 :(得分:0)
我没有测试过这段代码,但它应该适用于你的porpouse。
function tableExists(TableName:String;Connection:TFDConnection):Boolean;
var
str: TStringList;
begin
str := TStringList.Create;
try
Connection.GetTableNames('','','',str);
result := str.IndexOf(TableName) <> -1;
finally
str.Free;
end;
end;
用法:
procedure TForm2.Button1Click(Sender: TObject);
begin
if not tableExists('SampleData',FDConnection1) then
begin
//create table here
end;
end;
答案 1 :(得分:0)
您正在调用Execute并将 ATimes 参数设置为200.这意味着您希望在阵列DML模式下执行命令,并且您有200个行参数值。并且由于您没有参数,它只执行DBMS拒绝创建已创建的表时第二次尝试失败的次数的命令。
您可以通过这种方式拨打Execute(无需显式调用Prepare):
FDQuery1.SQL.Text := Memo1.Text; // Create table SQL command
FDQuery1.Execute;
FDQuery1.SQL.Text := Memo1.Text; // Create table SQL command
FDQuery1.ExecSQL;