我需要一种使用SqlDataAdapter插入后检索标识值的方法。
我测试了以下情况:
如果我在插入后运行select @@ identity,则如果还有其他执行插入操作的触发器,返回的值也不正确。
如果我在插入后运行select scope_identity(),则该批处理不是同一批,因此标识为空
解决方案是在同一批次中运行select scope_identity(),因此我修改了适配器的InsertCommand(请参见下面的代码)
这时,我遇到了另一个问题:adapter.Update重置insert命令,因此它不运行第二个选择(scope_identity())。 如果构建器使用builder.RefreshSchema()清除命令,则此问题得以解决,因为insert命令保持不变。另一方面, 如果插入的是:
adapter.InsertCommand.CommandText = "INSERT INTO [clinics].[InstutionContracts] ( [DateStart], [DateEnd], [ContractType], [DataDeTest]) VALUES (@p1, @p2, @p3, @p4);SELECT SCOPE_IDENTITY() as SkunkIdReturn"
SQL Server列DataDeTest不允许为空,但是它具有默认值getdate(),因此会引发插入的NULL值的异常(@ p4为NULL)。 请记住,在这种情况下,我在builder.RefreshSchema()之前运行。如果我没有运行它,适配器将仅更新前三列, 该行将被完全插入,但是我没有在table.Rows [0]中获得标识。这是我的代码:
DbCommand command = null;
DbDataAdapter adapter = null;
command = new SqlCommand();
adapter = new SqlDataAdapter();
var factory = bProviderFactories.GetFactory("system.data.sqlclient");
var builder = factory.CreateCommandBuilder();
builder.DataAdapter = adapter;
DbCommand command2 = null;
command2 = new SqlCommand();
command2 = builder.GetInsertCommand();
builder.RefreshSchema();
command2.CommandText += ";SELECT SCOPE_IDENTITY() as SkunkIdReturn"; // get id
adapter.InsertCommand = command2;
var table = new DataTable(tableName);
retSupd.rows = new List<row>();
var lrv = new List<row>();
....
var identity = "";
if (isSqlServerConnection && curRow.status == Status.Nou)
{
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.Both;
adapter.Update(table);
identity = table.Rows[0][table.Rows[0].ItemArray.Length - 1].ToString(); // is retrieved only if there are not null values on default columns
// otherwise, it returns "cannot insert NULL value in not NULL columns" because the insert command is not adapted
}
else
{
adapter.Update(table); // it works (even on default value columns), but I don't get the identity
}
那么,如何在没有默认值的列上出现NULL值错误的情况下检索身份?通过摆脱修改插入是不合适的 每个不允许为NULL但具有默认值属性的列。
答案 0 :(得分:0)
以下是代码段:
USE AdventureWorks2012;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO