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]);