使用 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的主要内容,如果未能解决你的问题,请参考以下文章