我有一个通用更新函数,它接受一个数据表,选择查询并使用它来更新数据库表。它工作正常。我需要知道有没有办法通过更改以下代码中的内容来取回插入行的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()
”附加到数据适配器查询的insert命令,以及编辑适配器的insertcommand文本然后执行ExecuteScalar()。我想知道是否可以调整通用适配器.Update()
来获取插入行的ID。
答案 0 :(得分:0)
你可以用这样的代码订阅这个事件:( C#我不懂VB)
<h3>Empty</h3>
<ul></ul>
<h3>Not Empty</h3>
<ul><li>li</li></ul>
自己写下活动:
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;
}
}
并且已填充私有变量_identityFieldName。
也许这可以帮到你。
编辑:我注意到你也使用了一个SqlCommandBuilder,它可以更容易地添加Scope标识: SET @ID = SCOPE_IDENTITY()