2013-10-15 10 views
1

리소스 제한 장치 인 Unitech PA690에서 Windows Mobile 6.5 용 응용 프로그램을 작성하고 SQL Server Compact Edition 데이터베이스에 레코드를 삽입 할 때 속도 문제가 있습니다 ... 누구든지 컴팩트 데이터베이스에 값을 삽입하는 가장 빠르고 가장 빠른 방법을 알고 있습니까?C#, SQL Server Compact - 레코드 삽입 속도 최적화

private void button1_Click(object sender, EventArgs e) 
    { 
     Stopwatch stopwatch = new Stopwatch(); 
     stopwatch.Start(); 
     string conn = "Data Source=" + (System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)) + "\\AppDatabase1.sdf;Persist Security Info=False"; 
     SqlCeConnection connection = new SqlCeConnection(conn); 
     connection.Open(); 
     int z = 0; 
     string name = "stack"; 
     string surname = "overflow"; 
     progressBar1.Maximum = 2000; 
     while (z<2000) 
      { 
       try 
       { 
        SqlCeCommand cmd = new SqlCeCommand("Insert into test (id,name,surname) values (@id, @name, @surname)", connection); 
        cmd.Parameters.AddWithValue("@id", z); 
        cmd.Parameters.AddWithValue("@name", name); 
        cmd.Parameters.AddWithValue("@surname", surname); 
        cmd.CommandType = System.Data.CommandType.Text; 
        cmd.ExecuteNonQuery(); 
        z++; 
        progressBar1.Value = z; 

       } 
       catch (SqlCeException) 
       { 
        MessageBox.Show("!!!","exception"); 
       } 
       finally 
       { 

       } 
      } 
     stopwatch.Stop(); 
     MessageBox.Show("Time: {0}" + stopwatch.Elapsed); 
     connection.Close(); 

    } 

경과 시간은 다음과 같습니다 : 96 초 21 행/초의 삽입 속도를하게 여기에 직접 삽입을 사용하여 내 삽입 테스트 코드, i'am입니다. 누구든지 여기에 삽입 속도를 향상시키는 가장 좋은 방법을 알고 있습니까? 나는이 모바일 장치가 더 느리다는 것을 알고 있지만 삽입 속도는이 링크에 따라 초당 400 행 이상이어야한다고 생각합니다. SQL CE slow insert, 아니면 제가 잘못 됐습니까? 매우 자주 삽입 할 약 20 000 행의 파일이 있으므로 도움을주십시오 ... 고마워,

+1

이 질문에 대한 답변이 있습니까? http://stackoverflow.com/questions/1606487/sqlbulkcopy-using-sql-ce – BlueMonkMN

+0

거래는 어떨까요? 하나의 트랜잭션으로 처리가 완료되면 더 빠를 것입니다. var transaction = connection.BeginTransaction(); // while code transaction.Commit(); –

+0

귀하의 링크에 대해 감사합니다 BlueMonkMN, 나는 귀하의 방법에서 약간의 속도 향상 있어요. 이제는 프로세서가있는 초당 29 행/초가 100 %로 증가했습니다 ... 블라디미르, 거래에 대해 더 구체적으로 설명해 주시겠습니까? 감사... –

답변

0

특정 성능 시간은 확실하지 않지만 while 루프를 사용하여 SQL 서버에 전달할 단일 쿼리 문자열? 이것은 2000 개의 개별 실행 명령 대신 데이터베이스를 한 번 호출하기 때문에 시간을 절약 할 수 있습니다. 같은

뭔가 :

private void button1_Click(object sender, EventArgs e) 
{ 
    Stopwatch stopwatch = new Stopwatch(); 
    stopwatch.Start(); 
    string conn = "Data Source=" + (System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)) + "\\AppDatabase1.sdf;Persist Security Info=False"; 
    SqlCeConnection connection = new SqlCeConnection(conn); 
    int z = 1; 
    string name = "stack"; 
    string surname = "overflow"; 
    progressBar1.Maximum = 2001; 

String query = "Insert into test (id,name,surname) values (0, name, surname)" 
while (z<2000) 
    { 
    query = query + ", ("+z+", "+name+", "+surname+")" 
    z++; 
      progressBar1.Value = z; 
    } 
    try 
     { 
      connection.Open(); 
      SqlCeCommand cmd = new SqlCeCommand(query, connection); 
      cmd.CommandType = System.Data.CommandType.Text; 
      cmd.ExecuteNonQuery(); 
      z++; 
      progressBar1.Value = z; 

     } 
     catch (SqlCeException) 
     { 
      MessageBox.Show("!!!","exception"); 
     } 
     finally 
     { 

     } 

    stopwatch.Stop(); 
    MessageBox.Show("Time: {0}" + stopwatch.Elapsed); 
    connection.Close(); 

} 

그것은이되지 않은 매개 변수를 가지고 좋은 건 아니지만,이 병목 여러 데이터베이스 호출을 만들기에 있는지 여부를 표시 할 수 있습니다.

루프를 사용하여 큰 문자열을 작성하는 대신 쿼리에 더 많은 매개 변수를 추가한다고 가정합니다.