.Net SqlDataAdapter在列上插入默认值后检索身份

时间:2018-07-09 12:11:49

标签: c# .net sql-server identity sqldataadapter

我需要一种使用SqlDataAdapter插入后检索标识值的方法。

我测试了以下情况:

  1. 如果我在插入后运行select @@ identity,则如果还有其他执行插入操作的触发器,返回的值也不正确。

  2. 如果我在插入后运行select scope_identity(),则该批处理不是同一批,因此标识为空

  3. 解决方案是在同一批次中运行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但具有默认值属性的列。

1 个答案:

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

来自Microsoft docs