2010-05-14 5 views
0

최근 SqlDataReader와 함께 sqlcmd 명령 줄 유틸리티를 사용하는 일부 C# 코드를 대체 할 것을 동료에게 맹세했습니다. 이전 코드에서는 다음을 사용합니다. System.Diagnostics.ProcessStartInfo procStartInfo = 새 System.Diagnostics.ProcessStartInfo ("cmd", "/ c"+ sqlCmd); wher sqlCmd는 다음과 같습니다 "sqlcmd -S"+ serverName + "-y 0 -h-1 -Q"+ "\" "+"USE [ "+ database +"] "+"; + txtQuery.Text + 그 결과는 정규 표현식을 사용하여 구문 분석됩니다. SQLDataReader를 사용하면 업계 관행에 더 부합하고, 디버그 및 유지 관리가 쉬우 며, 빠를 것입니다. 그러나 SQLDataReader 접근 방식은 적어도 . 같은 속도는 꽤 가능성이 느린 내가 SqlDataReader를 제대로 모든 것을하고 있어요 믿는 코드는 다음과 같습니다.SQLDataReader는 명령 줄 유틸리티 sqlcmd를 사용하는 것보다 속도가 느립니까?

using (SqlConnection connection = 
     new SqlConnection()) 
     { 
      try 
      { 
       SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString); 
       connection.ConnectionString = builder.ToString(); ; 
       SqlCommand command = 
        new SqlCommand(queryString, connection); 

       connection.Open(); 



       SqlDataReader reader = command.ExecuteReader(); 

    // do stuff w/ reader 
       reader.Close(); 

      } 
      catch (Exception ex) 
      { 
       outputMessage += (ex.Message); 
      } 
     } 

나는 시간 System.Diagnostics.Stopwatch에게 두 가지 접근 방식과라는 명령 줄 유틸리티 (사용했습니다 C# 코드에서) 빠른 것 같습니다 (20-40 %?). SqlDataReader에는 똑같은 코드가 다시 호출 될 때 번개가 빨리 나타나지만이 응용 프로그램에서는 예상하지 못하는 깔끔한 기능이 있습니다.

나는이 문제에 대해 이미 연구를 해왔다. 명령 줄 유틸리티 인 sqlcmd는 OLE DB 기술을 사용하여 데이터베이스를 조회합니다. ADO.NET보다 빠릅니다. 특히 커맨드 라인 유틸리티 접근법은 프로세스를 시작하기 때문에 정말 놀랍습니다. 나는 그것이 정말로 느릴 것이라고 생각했다.

의견이 있으십니까?

덕분에, 데이브

+0

'// 읽는 사람이 많다 '는 것이 중요 할 수 있습니다. 거기에 뭐가 들어 있니? –

+0

20-40 %가 중요합니까? 한 번의 작업으로 500ms, 다른 작업에서 600ms가 소요되는 프로세스에 대해 이야기하고 있습니까? 또는 몇 초 또는 그 이상입니까? –

+0

샘, 350 대 600의 차이 (누가 테스트를하고 있는지에 따라 다르다.) 나는 인간이 200 밀리 초 미만을 인식 할 수 없으므로 약간의 우려가 있다는 것을 읽는다 고 믿는다. 이 데이터는 사용자가 "결과 표시"버튼을 클릭 할 때까지 기다려야합니다. 그 전에는 데이터를 가져올 수 없으므로 마지막 순간까지 데이터를 가져올 수 없으므로 솔직히 SQLDataReader가 빠르거나 빠르다고 놀랍습니다. , TimLi의 대답 (DataReader도 스키마 정보를 얻음)을 참조하십시오. do stuff/w reader는 매우 빠릅니다 (<15 밀리 초). Thanks – Dave

답변

0

나는 SqlDataReader 개체를 만드는 것은 데이터를 가져 오는뿐만 아니라 데이터베이스 스키마 정보를 얻을 수 및 SQLCMD는 데이터를 얻을뿐만 아니라 때문에 SqlDataReader 개체가 SQLCMD보다 느린 생각합니다. 당신은이 같은 DataReader를 함께 열 이름을 얻을 수 있습니다 :

for (int i = 0; i < reader.FieldCount; i++) 
{ 
    Console.WriteLine(reader.GetName(i)); 
} 

때로는 성능이 중요하지 않습니다, 보안이 더 중요하다. 그러나 어느 것이 더 안전한지 알지 못합니다. 아마도 SqlDataReader가 아마 있습니다.

나는 중국인이기 때문에 어쩌면 내 말은 문법에 맞지 않을 수 있습니다. 죄송합니다.

관련 문제