使用 FIREDAC 创建表 MS ACCESS

Posted

技术标签:

【中文标题】使用 FIREDAC 创建表 MS ACCESS【英文标题】:Creating Tables MS ACCESS with FIREDAC 【发布时间】:2015-07-28 08:51:01 【问题描述】:

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

代码:

        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);';

FDQuery1.SQL.Text := Memo1.text; //Create table SQL command
FDQuery1.Prepare;
FDQuery1.Execute(200,0);

通过一些实验,我发现 FDCommand 和 FDQuery 组件在这种情况下不起作用;即使您事先检查表不存在,也不会。 (我不太清楚为什么 - 但在我看来 SQL 命令被发送了两次,因此表存在错误)。但是,FDConnection.ExecSQL 确实有效。尝试和测试(根据需要创建 3 个带有 CONSTRAINTS 的表)。

问候 汤姆德

【问题讨论】:

相关***.com/q/909371/960757. @kobik 是的,当然,今天不是我的日子:)谢谢。 【参考方案1】:

我没有测试此代码,但它应该可以在您的 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;

【讨论】:

检查GetTableNames方法参数。 @TLama 对不起,你是对的。我刚才有时间测试它。 ;) 大家好,FDCommand 进程在创建表时不起作用;即使您检查表不存在!出于某种原因,在我看来组件发送 SQL 两次,因此返回的错误表明该表存在。 你好,我刚习惯这个网站;所以哎呀,如果你按回车键添加评论。但是,起作用的是 FDConnection.ExecSQL (Create Table MyTable (Fielddef1, Fielddef2...)。这可以完成工作并且没有表存在的错误。【参考方案2】:

您正在调用 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;

【讨论】:

以上是关于使用 FIREDAC 创建表 MS ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

带有 MS Access 2010 数据库的 Delphi FireDAC。为啥它将 ACE 转换为 Jet?

msgpack配合FIREDAC传输多表数据

C#如何创建一张access 表格

使用 VBA 从 MS Access 表创建格式化文本文件

创建表 JDBC-MS-ACCESS

MS Access 创建表正在截断备注字段