2009-11-14 4 views
4

odbc.datareader에서 mysql.datareader로 프로젝트를 성공적으로 전환했습니다. 문제는 첫 번째/odbc 데이터웨어 하우스에서) AffectedRows 속성은 순수한 쿼리 일 때에도 행의 개수를 올바르게 검색합니다. 하지만 그것은 -1 mysql.datareader와 함께 작동하지 않습니다. 그래서 행 수, 즉 "결과보기"를 검색하는 방법을 볼 수 없습니다. EDIT : 전방 독자 만 알고 있지만 다음과 같습니다. DBreader = command.ExecuteRader() 줄에 중단 점을 배치하면 DBreader의 결과보기에 많은 개체가 있음을 알 수 있습니다. 행이 있어야합니다. 달리기 직후에 그게 어떻게 알려졌습니까? 감사합니다.MySqlDataReader에서 행 수를 계산하는 방법은 무엇입니까?

답변

3

DataReader에 행 개수가 포함되지 않은 이유는 계산하는 데 비용이 많이 듭니다. 예를 들어, 올해 입력 및 삭제되지 않은 구매 주문 반환하는 쿼리 실행 말 :

SELECT * FROM PurchaseOrders 
WHERE PurchaseDt > '2009-01-01' 
AND IsDeleted = 0 

을 그리고 당신은 DataReader를 함께이 쿼리를 사용하여 처음 10 개 행을 읽습니다. SQL Server는 클라이언트가 요청할 때 행을 "스트림"합니다. 다른 행을 요청할 때마다 SQL Server는 쿼리의 다음 단계를 실행합니다. SQL Server조차 실제로 모든 행을 읽기 전에 총 행 수를 알지 못합니다.

+0

어떻게하면 10 행만 요청할 수 있습니까? SELECT *를 실행하면 ... C# 데이터 판독기를 한 번에 모두 수행한다고 가정 할 때까지는 쿼리가 완료되지 않을 때까지 앱이 고정됩니다. – Petr

+0

10 행을 요청하는 한 가지 방법은 Read()를 10 회만 호출하는 것입니다. 또 하나는 MySQL 질의 끝에 'LIMIT 10'을 덧붙이는 것입니다. – Andomar

+0

네,하지만 그렇게하고 싶지는 않습니다 :) 간단한 SELECT를 모든 쿼리에 보내면 DB 연결이 모든 읽기와 함께 작동하는지 묻고있었습니다. 그 폐쇄? – Petr

0

다음은 내가 사용하는 기능입니다. 부담없이 조정하십시오.

/// <summary> 
    /// Counts the number of rows in a given table. 
    /// </summary> 
    /// <param name="tableName">The name of the table to query.</param> 
    /// <param name="closeConnectionWhenDone">A flag indicating whether the connection should be closed once the query is executed.</param> 
    /// <returns>The number of rows in the table.</returns> 
    private static int GetNumRowsInTable(string tableName, bool closeConnectionWhenDone = false) 
    { 
     string selectQueryString = String.Format("select 1 from {0};", tableName); 
     int numRows = 0; 
     CommandBehavior behavior = closeConnectionWhenDone ? CommandBehavior.CloseConnection : CommandBehavior.Default; 
     using (var command = new OdbcCommand(selectQueryString, ODBCHelper.Connection)) 
     using (var reader = command.ExecuteReader(behavior)) 
     { 
      while (reader.Read()) 
      { 
       numRows++; 
      } 
     } 

     return numRows; 
    } 
2

는 먼저 내가 SQL 문 다음 사용 (이름이 studentTable입니다 예를 들어) 얼마나 많은 행 테이블의 계산 :

SELECT COUNT(*) FROM studentTable 

나는 MySqlCommand 개체에 대한 명령 텍스트로 그 문을 사용 .

: 아래
reader.GetString(0); 

내가 사용하는 코드입니다 :

그런 다음 MySqlDataReader의 객체를 사용하여 값 (행 수)를 알고 난 다음 코드를 사용하여 (예를 들어 이름이 독자입니다)

...    
MySqlConnection conn = new MySqlConnection(connString); 
MySqlCommand command = conn.CreateCommand(); 
command.CommandText = "SELECT COUNT(*) FROM studentTable"; 
try 
{ 
    conn.Open(); 
} 
catch (Exception ex) 
{ 
    label1.Content = ex.Message; 
} 

reader = command.ExecuteReader(); 
while (reader.Read()) 
{ 
    label1.Content = ""; 
    label1.Content = reader.GetString(0); 
} 

reader.Close(); 
conn.Close(); 
0

간단한, 엘 리더가 아닌 사용자가 원하는 정보를 얻을 수있는 데이터 테이블 서비스. 자료 열람실에 기록 된 일람표는 열람 할 수있는 일람표와 함께 열람 할 수 있습니다 (열람 할 수있는 열람실, 열람실, 열람실 등).

String consulta = "SELECT * FROM xxx"; 
conexion.Open(); 
comando.CommandText = consulta; 

reader = command.ExecuteReader(); 

DataTable dt = new DataTable(); 
dt.Load(reader); 

int nrofilas = dt.Rows.Count; 

foreach (DataRow dr in dt.Rows) 
{ 
    var value = dr["nameField"]; 
} 
+0

스택 오버플로에 오신 것을 환영합니다. 코드에 몇 가지 설명을 포함하십시오 (무엇을 수정 했습니까? 원래의 질문은 어디에서 잘못 되었습니까?). 주석 처리되지 않은 코드 만 사용하는 응답은 품질이 낮고 삭제 될 수 있습니다. – Graham

관련 문제