2016-08-29 6 views
0

datatable, select 쿼리를 사용하여 데이터베이스 테이블을 업데이트하는 데 사용하는 일반 업데이트 기능이 있습니다. 정상적으로 작동합니다. 거기에 삽입 된 행의 ID (ID 필드) 아래 코드에서 뭔가를 변경하여 얻을 수있는 방법이 있는지 알아야합니다. 나는 데이터 어댑터의 쿼리 수행 후 ExecuteScalar는()를 디자이너를 사용하여뿐만 아니라 어댑터에 InsertCommand 텍스트를 편집 및 삽입 명령에 "select scope_identity()"를 추가 할 수있어서,ADO.Net 디자이너 마법사없이 행의 행 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 

나는 해결책을 알고있다. 일반 어댑터 ​​.Update()을 삽입 된 행의 ID를 얻기 위해 조정할 수 있는지 알고 싶습니다. 추가 된 다음이 예에서는

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

: 이벤트 스스로 (C#을 내가 VB를 잘 모릅니다)

adp.RowUpdated += adapter_RowUpdated; 

및 쓰기 :

+0

: 난 당신이 또한 범위 ID를 추가하는 것이 더 쉽습니다 물건을 만드는 데 SqlCommandBuilder를 사용났습니다. 거기서 e.StatementType == StatementType.Insert를 검사 할 수 있습니다. 그렇다면 새 ID를 사용할 수 있습니다. 나는 이것을 좋아하지 만 select scope_identity를 먼저 추가했기 때문에 그것이 없으면 작동하지 않을지 확실하지 않다. – GuidoG

+0

@GuidoG이 함수는 클래스 라이브러리의 일부이며 양식이 아니기 때문에 이벤트를 구독 할 수 없다. 여기에서 command 객체를 편집하여 scope_identity를 얻을 수있는 방법이 있습니까? 아무도 디자이너 기반의 솔루션 대신 코드에서 어댑터의 삽입 명령을 업데이트 할 수있는 방법을 제안 할 수 있습니까? –

답변

0

는이 같은 코드에서이 이벤트를 구독 할 수 있습니다 명령문 우선 :

SET @ID = SCOPE_IDENTITY() 

개인 변수 _identityFieldName이 채워져 있습니다.

어쩌면 당신을 도울 수 있습니다.

편집 : 당신이 이벤트를 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;