2012-06-28 2 views
0

배경 :SQLite DataAdapter UpdateBatchSize 오류

SQLite 데이터베이스로 DataTable을 복사하려고합니다. SQLServer 데이터베이스에서 실행되는 동등한 데이터 세트와 비교할 때 SQLite 버전은 약 5 배 더 오래 걸립니다. 이를 간소화하기 위해 일괄 처리를 사용하도록 설정하는 SQLiteDataAdapter의 UpdateBatchSize 속성을 사용하려고합니다.

문제점 :

그러나 System.NotSupportedException의 값 결과를 설정하려는 시도. 그 값을 어떻게 적절하게 설정합니까? 코드 참조 :

public int InsertDataTable(DataTable dt, string selectCommand) 
{ 
    SQLiteDataAdapter myAdapter = new SQLiteDataAdapter(selectCommand, m_conn); 
    myAdapter.UpdateBatchSize = 0; 
    int rowsAffected = myAdapter.Update(dt.Select()); 
    return rowsAffected; 
} 
+0

기타 : 이것은 내 첫 번째 질문이기 때문에 서식/질문에 대한 비판/권장 사항은 높이 평가됩니다. – Jared275

+0

은 어디서 시작된 연결 m_conn입니까? –

+0

예, 초기화가 빠릅니다. 초기화 라인은 다음과 같습니다 : using (SQLiteConnection conn = new SQLiteConnection (string.Format ("Data Source = {0}", file))) init 라인에 설정해야 할 트리거가 있습니까? – Jared275

답변

0

동일한 성능 향상은 다른 방법을 통해 수행 할 수 있습니다. UpdateBatchSize를 수정하는 대신 업데이트를 포함하는 SQLiteTransaction을 만듭니다.

public int InsertDataTable(DataTable dt, string selectCommand) 
    { 
     SQLiteDataAdapter adapter = new SQLiteDataAdapter(selectCommand, m_conn); 
     SQLiteCommandBuilder builder = new SQLiteCommandBuilder(adapter); 
     SQLiteTransaction transaction = m_conn.BeginTransaction(); 
     builder.GetInsertCommand().Transaction = transaction; 
     int rowsAffected = adapter.Update(dt.Select()); 
     transaction.Commit();    
     return rowsAffected; 
    } 

출처 : 그들은 데이터베이스 서버에 와이어를 전송되기 전에

SQLiteTransction

+0

누군가 다른 방법이 작동하지 않는 이유에 대한 정보가 있다면 크게 환영 할 것이다. – Jared275

+0

트랜잭션 내에서 sqlite 연산을 수행하지 않으면 SQL 문마다 암시 적으로 하나씩 생성됩니다. 이것은 훨씬 오래 걸릴 것입니다, 나는 그것이 각 문장에 대해 여러 가지 파일 잠금 작업을 수행해야한다고 생각합니다. 따라서 SQLite로 작업 할 때는 항상 명시 적으로 트랜잭션을 생성해야합니다. – Rory

1

대한 UpdateBatchSize의 포인트가 그룹 함께 SQL 문이다. SQLite에서는 네트워크 연결이 없기 때문에 직접 파일 액세스를 사용하고 있으므로이 작업을 수행 할 필요가 없습니다. 아마 오류가 발생하는 이유 일 수 있습니다. 아마도 드라이버는 설정에서 아무 것도하지 않으므로 오류가 있음을 알 수 있습니다.

SQL Server를 사용하는 경우 해당 설정을 2로 늘리면 두 번 UPDATE 문을 그룹화하여 한 번에 하나씩 보내지 않고 보냅니다. 큰 숫자로 설정하면 서버 왕복 횟수가 줄어 듭니다. 따라서 SQL Server를 사용하는 경우 네트워크 대기 시간의 영향을 줄이려면 SQL Server를 더 크게 설정하십시오. 이 값을 0으로 설정하면 배치 당 구문 수가 제한되지 않지만 배치가 어리석게 커질 수 있습니다.

명백한 트랜잭션을 생성하는 이유는 트랜잭션 내에서 sqlite 작업을 수행하지 않으면 SQL 문당 하나가 암시 적으로 생성된다는 것입니다. 이로 인해 파일 잠금 및 저널링 및 각 명령문에 대한 다양한 작업을 수행해야하는 데 시간이 오래 걸릴 수 있습니다. 따라서 SQLite로 작업 할 때 항상 명시 적으로 트랜잭션을 생성해야하며 이렇게하지 않으면 SQLite를 사용하지 않을 때보 다 훨씬 더 발전 할 것입니다.