2016-08-29 13 views
0

データベーステーブルを更新するためにdatatable、selectクエリを使用する汎用更新機能があります。正常に動作しています。私は、下のコードで何かを変更することによって、挿入された行のID(アイデンティティフィールド)を取得する方法があるかどうかを知る必要があります。ADO.Netデザイナウィザードなしで行のROW 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 

I)は、(私はデザイナーを使用してだけでなく、アダプタのInsertCommandはテキストを編集してからは、ExecuteScalarをやっデータアダプターのクエリのINSERTコマンドに「select scope_identity()」を追加することができますここでの解決策を知っています。私は汎用アダプタ.Update()が挿入された行のIDを取得するために調整できるかどうかを知りたい。

+0

:私はあなたにもスコープIDを追加する事が容易になりSqlCommandBuilderを使用して気づきました。そこでは、e.StatementType == StatementType.Insertを調べることができます。そうであれば、そこに新しいIDが存在する可能性があります。私はこれを好きでしたが、最初にselect scope_identityを追加しましたので、それがなくても動作するかどうかわかりません。 – GuidoG

+0

@GuidoGこの関数はクラスライブラリの一部であり、フォームではないため、イベントを購読できません。ここでコマンドオブジェクトを編集してscope_identityを得る方法はありますか?誰も私はデザイナーベースのソリューションではなく、コード内のアダプタの挿入コマンドを更新する方法を提案することができます。 –

答えて

0

あなたは、このようなコードでは、このイベントをサブスクライブすることができます(私はVBを知らないC#の)

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が入力されました。

これはおそらくあなたを助けることができます。

EDIT:あなたは、イベントをRowUpdatedアダプタを購読する場合はたぶん

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; 
関連する問題