Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新通过DataAdapter InsertCommand上的存储过程插入的行上的ID_C#_Sql Server - Fatal编程技术网

C# 更新通过DataAdapter InsertCommand上的存储过程插入的行上的ID

C# 更新通过DataAdapter InsertCommand上的存储过程插入的行上的ID,c#,sql-server,C#,Sql Server,存储过程代码: ALTER PROCEDURE [dbo].[procInsertComputer] @pName NVARCHAR(128), @pDomain NVARCHAR(25) = NULL, @pStatus NCHAR(2) = NULL, @pNotes NVarChar(2000) = NULL AS SET NOCOUNT ON DECLARE @NewID [int] IF NOT EXISTS (SELECT 1

存储过程代码:

ALTER PROCEDURE [dbo].[procInsertComputer]
    @pName NVARCHAR(128),
    @pDomain NVARCHAR(25) = NULL,
    @pStatus NCHAR(2) = NULL,
    @pNotes NVarChar(2000) = NULL
AS
    SET NOCOUNT ON
    DECLARE @NewID [int]

    IF NOT EXISTS (SELECT 1 FROM tbComputers WHERE Name=@pName)
    BEGIN
        INSERT INTO tbComputers (Name, Domain, Status, Notes)
        VALUES (@pName, @pDomain, @pStatus, @pNotes)

        SET @NewID = SCOPE_IDENTITY()
    END
    ELSE
    BEGIN
        SET @NewID = -1
    END

RETURN @NewID
插入触发代码:

ALTER TRIGGER [dbo].[tr_tbComputer_Insert] 
ON [dbo].[tbComputers] 
FOR INSERT 
AS
    INSERT INTO tbComputers_Audit(id, Name, Domain, Status, Notes, AuditAction)
        SELECT 
            id, Name, Domain, Status, Notes, 'I' 
        FROM 
            Inserted
CreateAdapter代码:

测试代码:

// Create objects
var databaseConnection = "my connection string"
var adapter = CreateAdapter(databaseConnection)
var dataSet = new Dataset();

// Fill data
adapter.Fill(dataSet, "Table");

// Create new row
var newRow = dataSet.Tables[0].NewRow();
dataSet.Tables[0].Rows.Add(newRow);

// Populate columns
newRow.Name = "TestServer01"
newRow.Status = "BU"
newRow.Domain = "TestLab01.test.au"
newRow.Notes = "test creation via C#"

// Accept changes
adapter.Update(dataSet.Tables[0]);
问题:insert工作得很好,它使用自己唯一生成的ID将新行添加到表中,但我在C中使用的DataRow对象获取触发器insert的ID

问题:当更新新的数据行时,是否有一种简单的方法从InsertCommand的返回更新ID


研究:我找到的答案中有很多人建议选择SCOPE_IDENTITY,这让我更接近它,因为它现在正在更新ID,只是没有更新到正确的ID。

我没有看到定义dataRowanywhere@MarkC. 已修复,应该是newRow而不是dataRow:存储过程中的SCOPE_标识和C中另一个查询中的SCOPE_标识是具有不同作用域的不同标识。返回正确的结果作为过程结果,因此从C读取过程结果,而不是调用SCOPE_IDENTITY。@GSerg当我调用adapter.UpdatedataSet.Tables[0]时,适配器会自动使用InsertCommand;是否有一种方法可以查询存储过程的返回值,或者必须手动处理插入?并且不要使用InsertCommand返回输出参数中的值或从存储过程中选择这些值,然后InsertCommand将显示。或者,让SqlCommandBuilder为您执行此操作,
// Create objects
var databaseConnection = "my connection string"
var adapter = CreateAdapter(databaseConnection)
var dataSet = new Dataset();

// Fill data
adapter.Fill(dataSet, "Table");

// Create new row
var newRow = dataSet.Tables[0].NewRow();
dataSet.Tables[0].Rows.Add(newRow);

// Populate columns
newRow.Name = "TestServer01"
newRow.Status = "BU"
newRow.Domain = "TestLab01.test.au"
newRow.Notes = "test creation via C#"

// Accept changes
adapter.Update(dataSet.Tables[0]);