FireDAC,阵列DML,SQL Server和IDENTITY_INSERT
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FireDAC,阵列DML,SQL Server和IDENTITY_INSERT相关的知识,希望对你有一定的参考价值。
我正在尝试使用Firedac阵列DML功能将数据导出到SQL Server。在目标表中,有一个IDENTITY列,我需要为其添加一个明确的值。
但是我的查询失败,并显示以下错误消息:
SQL状态:23000。本机代码:544。消息:[Microsoft] [SQL ServerNative Client 11.0] [SQL Server]无法为以下对象插入显式值IDENTITY_INSERT设置为时,表“ dic_cities”中的标识列关闭。
目标表定义如下:
CREATE TABLE dbo.dic_cities (
id int IDENTITY(1,1) PRIMARY KEY,
city_name varchar(50) NOT NULL
)
我的代码:
MyFDQuery.Connection.ExecSQL('SET IDENTITY_INSERT dbo.dic_cities ON');
MyFDQuery.SQL.Text := 'INSERT INTO dbo.dic_cities (id, city_name) VALUES (:id, :city_name)';
//Populating parameters and preparing the query
{...}
//Execute Array DML query with batch size of 100
MyFDQuery.Execute(100, 0);
//Finally, set IDENTITY_INSERT off for the destination table
MyFDQuery.Connection.ExecSQL('SET IDENTITY_INSERT dbo.dic_cities OFF');
[我必须注意,当我使用带有参数的常规TFDQuery时(即不使用Array DML功能时),一切工作正常。但是对于数组DML却失败。
多年来,我也像上面的代码一样,将Array DML用于其他几种DBMS,并获得了成功。
因此,如何使用数组DML功能向SQL Server IDENTITY列插入显式值?
[AFAICT,在FD的ArrayDML中没有魔力。我只是追溯到
FDQuery1.Execute(100, 0)
而且似乎要做的就是
for i := 0 to 99 do
FDQuery1.ExecSQL
所以,我重复我在评论中说的话:
让Insert语句在SSMS的Query实用程序中无投诉地执行。如果语法不能100%正确,请在Google周围搜索。
仅[[之后您在步骤1中成功完成,请尝试使用调用完全相同
语句FDQuery1.SQL.Text:= [在步骤1中起作用了];FDQuery1.Execute(1)
- 如果步骤2引发错误,请使用SSMS的探查器来监视您的应用程序发送到服务器的内容。也许它发送的不是您所想的完全。
- 如果第3步没有发现任何错误,请尝试使用IF修改IINSERT语句,以便仅在当前IDENTITY_INSERT值的测试不正确时才调用该语句。如有必要,请在TransactSQL文档中进行查找。
- 如果仍然不起作用,请添加语句以打开和关闭IDENTITY_INSERT作为FDQuery1的一部分。执行代码,即立即包围实际的INSERT语句。
- 询问MS
以上是关于FireDAC,阵列DML,SQL Server和IDENTITY_INSERT的主要内容,如果未能解决你的问题,请参考以下文章
firedac odbc sql server driver连接占线导致另一个hstmt
到T-SQL DML 三级的阶梯:在SQL server中实现关系模型