2010-01-25 3 views
1

this question을 참조하십시오. 강력하게 형식화 된 데이터 집합을 사용하여 SQLIte 데이터베이스에 대해 실행하는 다음 코드가 있습니다.강력한 형식의 TableAdapter의 업데이트/삽입 명령에 명령/SQL 문을 추가하는 방법은 무엇입니까?

 messagesAdapter.Update(messages);//messages is a DataTable 
     var connection = messagesAdapter.Connection; 
     var retrieveIndexCommand= connection.CreateCommand(); 
     retrieveIndexCommand.CommandText = @"Select last_insert_rowid()"; 
     connection.Open(); 
     var index = retrieveIndexCommand.ExecuteScalar(); 
     connection.Close(); 

last_inser_rowid()는 항상 0을 반환하므로이 방법은 작동하지 않습니다. 이 오류는 TableAdapter의 Update 명령에서 사용하는 동일한 연결 중에 호출해야하기 때문에 발생합니다. TableAdapter의 Insert 또는 Update 명령을 변경하여 인덱스를 반환하려면 어떻게합니까?

답변

3

단일 행을 삽입하는 경우, 당신은이를 사용할 수 있습니다

// cast if necessary 
using (var insert = (SQLiteCommand)this.Adapter.InsertCommand.Clone()) { 
    insert.CommandText += "; SELECT last_insert_rowid()"; 
    foreach (SQLiteParameter parameter in insert.Parameters) { 
     parameter.Value = row[parameter.SourceColumn]; 
    } 
} 
var index = Convert.ToInt32(insert.ExecuteScalar()); 

또한 여러 행을 삽입하고 각각에 ID를 할당하는 데 사용할 수 있습니다 :

using (var insert = (SQLiteCommand)this.Adapter.InsertCommand.Clone()) 
{ 
    insert.CommandText += "; SELECT last_insert_rowid()"; 
    // this filter only added rows 
    foreach (MyDataSet.MessageRow row in messages.GetChanges(DataRowState.Added)) 
    { 
     foreach (SQLiteParameter parameter in insert.Parameters) 
     { 
      parameter.Value = row[parameter.SourceColumn]; 
     } 
     // use the name of your rowid column 
     row.ID = Convert.ToInt32(insert.ExecuteScalar()); 
     row.AcceptChanges(); 
    } 
} 
// then you can perfom the other updates 
messagesAdapter.Update(messages); 

참고 : 연결을 열거 나 닫으십시오.

+0

한 행 접근법 만 시도했는데 작동했습니다! 데이터 세트 디자이너에서 코드를 더블 클릭하여 편집 할 수있는 부분적인 MessagesTableAdapter 클래스에 코드를 추가해야했습니다. 그리고 당신은 객체를 반환하기 때문에 복제 작업 후에 SQLiteCommand에 캐스트를 추가하는 것을 잊었습니다. 아마도 당신의 대답이이 의견을 반영하도록 만들 수 있습니까? 고마워요! – Dabblernl

+0

일부 공급자는 올바른 형식을 반환하는 Clone 메서드를 가지고 있습니다. –