2011-11-28 70 views
3

我在C#中有一個連接到MySQL數據庫的WinForms項目。我試圖計算結果中的行數,我不能使用RecordsAffected,因爲這個屬性只有在讀取完成後才具有正確的值,並且您可以從下面的代碼中看到我以前需要它。任何想法如何做到這一點?在c中使用mysql計數受影響的行數

string sql = "SELECT * FROM Tigers WHERE Link='" + link + "'"; 

MySqlCommand cmd = new MySqlCommand(sql, conn); 
MySqlDataReader rdr = cmd.ExecuteReader(); 

while (rdr.Read()) 
{ 
    if (rdr.RecordsAffected == 0) 
    { 
     //can't find in db    
    } 
    else 
    { 
     //found at least 1 result 
    } 

回答

7

您可以使用HasRows代替:

string sql = "SELECT * FROM Tigers WHERE Link='" + link + "'"; 

MySqlCommand cmd = new MySqlCommand(sql, conn); 
MySqlDataReader rdr = cmd.ExecuteReader(); 

if(rdr.HasRows){ 
    while (rdr.Read()) 
    { 
      //do stuff here 
    } 
} else { 
    //nothing found 
} 

編輯:,如果你不需要看到你從數據庫中檢索數據,只想伯爵您可以使用:

cmd.CommandText = "SELECT COUNT(*) FROM Tigers WHERE Link='" + link + "'"; 
Int32 count = (Int32) cmd.ExecuteScalar(); 
+2

謝謝您的回答,我結束了使用hasrow和它出色的作品。再次感謝! – Nathan

1

你不影響多在數據庫中當您執行SELECT查詢。您正在檢索與您的查詢匹配的記錄。如果要計算與查詢匹配的記錄數,可以使用count以及cmd.ExecuteScalar()

1

可以使用ExecuteScalar方法,像這樣:

MySqlCommand cmd = new MySqlCommand(sql, conn); 
int rowCount = cmd.ExecuteScalar(); 

順便說一句你當前的查詢可能容易受到Sql Injection attack。你應該考慮參數化查詢,像這樣:

string sql = "SELECT * FROM Tigers WHERE Link=?link"; 

IDbDataParameter param = cmd.CreateParameter(); 
param.ParameterName = "?link"; 
param.Value = link; 
cmd.Parameters.Add(param); 

int rowCount = cmd.ExecuteScalar(); 
0

通過使用IDataReader(其中MySqlDataReader imple ),但不能保證服務器知道有多少行受到影響,直到讀取完成。

我會組織你的代碼略有不同:

string sql = "SELECT * FROM Tigers WHERE Link='" + link + "'"; 

using(MySqlCommand cmd = new MySqlCommand(sql, conn)) 
{ 
    using(MySqlDataReader rdr = cmd.ExecuteReader()) 
    { 
     while (rdr.Read()) 
     { 
      //found at least 1 result 
     } 

     if (rdr.RecordsAffected == 0) 
     { 
      //can't find in db 
     } 
    } 
}