2015-07-28 89 views
2

使用FireDAC连接(Delphi Xe6)时,在MS ACCESS中创建表时出现错误。
创建了一个新的数据库文件,并使用TFDCommand或TFDQuery创建了3个表,这些表确实已创建,但我总是收到“表已存在”错误。任何建议来阻止错误被提出。
我确实包含了一个尝试中的代码...除了例程。使用FIREDAC创建表MS ACCESS

代码:

 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确实有效。试过并测试过(根据需要用CONSTRAINTS创建3个表格)。

问候 TomD

+1

相关的http:/ /stackoverflow.com/q/909371/960757。 – TLama

+0

@ kobik是的,当然,今天不是我的一天:)谢谢。 –

回答

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

检查['GetTableNames'](http://docwiki.embarcadero.com/Libraries/XE8/en/FireDAC.Comp.Client.TFDCustomConnection.GetTableNames)方法参数。 – TLama

+0

@TLama对不起,你是对的。我有时间来测试它。 ;) –

+0

大家好,FDCommand进程无法在创建表中使用;即使你检查表不存在!出于某种原因,在我看来,组件发送了两次SQL,因此返回表存在的错误。 –

0

要调用ExecuteATimes参数设置为200。这意味着,要在数组DML模式下执行命令,你必须200 参数值。而且由于你没有参数,它只是在DBMS拒绝创建已经创建的表时执行第二次尝试失败次数的命令。

您可以拨打Execute这样(没有必要的Prepare显式调用):

FDQuery1.SQL.Text := Memo1.Text; // Create table SQL command 
FDQuery1.Execute; 

或者ExecSQL其内部调用上面显示Execute方式:

FDQuery1.SQL.Text := Memo1.Text; // Create table SQL command 
FDQuery1.ExecSQL;