使用FIREDAC创建表MS ACCESS

时间:2015-07-28 08:51:02

标签: delphi ms-access firedac

使用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

2 个答案:

答案 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;

ExecSQL内部按上述方式调用Execute

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