0

我有一个通用的更新函数,它接受一个数据表,选择查询并使用它来更新数据库表。它工作正常。我需要知道有没有办法通过更改以下代码中的某些内容来取回插入行的 ID(身份字段)。

Public Function UpdateDataTable_GetID(ByVal dt As DataTable, ByVal SQL As String, ByVal connString As String) As Integer

        Dim conn As SqlConnection = Nothing
        Dim cmd As SqlCommand
        Dim adp As SqlDataAdapter = Nothing
        Dim cmdBuilder As SqlCommandBuilder = Nothing
        Dim UpdatedID As Integer
        If SQL.Length <= 0 Then
            Return False
        End If

        conn = New Data.SqlClient.SqlConnection(connString)
        cmd = New Data.SqlClient.SqlCommand
        cmd.Connection = conn
        cmd.CommandText = SQL
        cmd.CommandType = CommandType.Text
        adp = New Data.SqlClient.SqlDataAdapter(cmd)
        cmdBuilder = New Data.SqlClient.SqlCommandBuilder(adp)

        Try
            UpdatedID = Convert.ToInt32(adp.Update(dt)) ' What to do here to get the just inserted ID instead of number of records updated
            adp.Dispose()
            cmdBuilder.Dispose()
            Return UpdatedID

        Catch ex As System.Data.SqlClient.SqlException
            ' Closing connection
            Return -1
        Finally
End try
End function

我知道可以select scope_identity()使用设计器将“”附加到数据适配器查询的插入命令以及编辑适配器的插入命令文本然后执行 ExecuteScalar() 的解决方案。我想知道是否.Update()可以调整通用适配器以获取插入行的 ID。

4

1 回答 1

0

你可以用这样的代码订阅这个事件:(C#我不知道VB)

adp.RowUpdated += adapter_RowUpdated;

并自己编写事件:

void adapter_RowUpdated(object sender, SqlRowUpdatedEventArgs e)
{
   if (e.StatementType == StatementType.Insert)
   {
       object id = e.Command.Parameters["@ID"].Value;
       e.Row[_identityFieldName] = id;
   }
}

在此示例中,首先将以下内容添加到命令文本中:

 SET @ID = SCOPE_IDENTITY()  

并且已填充私有变量 _identityFieldName。

也许这可以帮助你。

编辑:我注意到您还使用了 SqlCommandBuilder ,它可以更轻松地添加 Scope 身份:

SqlCommand inserter = new SqlCommand();
inserter = cmdBuilder.GetInsertCommand(true).Clone();
inserter.CommandText += " SET @ID = SCOPE_IDENTITY()";
SqlParameter param = new SqlParameter();
param.Direction = ParameterDirection.Output;
param.Size = 4;
param.DbType = DbType.Int32;
param.ParameterName = "@ID";
inserter.Parameters.Add(param);

adp.InsertCommand = inserter;
于 2016-08-29T13:35:33.130 回答