2014-02-17 70 views
1

我目前正在研究一個C#項目,並試圖從MySQL數據讀取器返回的行數。檢查從MySQL數據讀取器返回的行數

我知道沒有直接的功能,所以我試圖寫我自己的。在函數中,我將它傳遞給MySQLDataReader對象,然後循環訪問MySQL Data Reader並遞增計數器並返回計數器的值。

然後這似乎鎖定了程序,我猜是因爲我是Reader.read()之後,我已經計數了我已經在最後。相反,我已經嘗試創建閱讀器的副本,然後循環通過臨時版本,但我得到了相同的結果。

下面是我的代碼,我正在執行查詢並調用函數。

string query = "SELECT * FROM reports, software, platforms, versions " 
         + "WHERE [email protected] AND reports.SoftwareID=software.id AND reports.PlatformID=platforms.id " 
         + "AND reports.VersionID=versions.id AND [email protected]"; 
        using (MySqlCommand cmd = new MySqlCommand(query, db.conn)) 
        { 
         cmd.Parameters.AddWithValue("@verified", "1"); 
         cmd.Parameters.AddWithValue("@notificationSent", "0"); 
         using (MySqlDataReader reader = cmd.ExecuteReader()) 
         { 
          totalEmails = HelperClass.totalRowsInMySQLDataReader(reader); 
          while (reader.Read()) 
          { 
           currentEmailCount++; 
           EmailNotifications emailNotification = new EmailNotifications(reader); 
           emailNotification.sendNewBugReportAfterVerificationEmail(currentEmailCount, totalEmails); 
          } 
         } 

下面是我的函數獲得的行數

public static int totalRowsInMySQLDataReader(MySqlDataReader reader) 
     { 
      MySqlDataReader tempReader = reader; 
      ILibraryInterface library = GeneralTasks.returnBitsLibrary(Configuration.databaseSettings, Configuration.engineConfig.logFile); 
      string methodInfo = classDetails + MethodInfo.GetCurrentMethod().Name; 
      try 
      { 
       int count = 0; 
       while (tempReader.Read()) 
       { 
        count++; 
       } 
       tempReader = null; 
       return count; 
      } 
      catch (Exception ex) 
      { 
       string error = string.Format("Failed to get total rows in MySQL Database. Exception: {0}", ex.Message); 
       library.logging(methodInfo, error); 
       library.setAlarm(error, CommonTasks.AlarmStatus.Medium, methodInfo); 
       return -1; 
      } 
     } 

感謝您的幫助,您可以提供

回答

3

爲了避免多個查詢,如何將總數包含在select中?

SELECT COUNT(*) AS TotalNORows, * FROM reports, software, platforms, versions etc 
+0

感謝您的幫助。很好的解決方案 – Boardy

+0

這不適用於*;你必須指定列。即使如此,彼得的下面的觀點是正確的 - 這將只返回一行。 - 編輯:或將*放在計數(*)之前。 –

+0

儘管聽起來很愚蠢,但這並不能回答這個問題。 – cybermonkey

-1

您可以使用follwoing SQL查詢得到總的行數。

SELECT COUNT(*) FROM [MYTABLE] 

從代碼可以使用ExecuteScalar()方法來獲得由QUERY返回的行的總數。

試試這個:

int GetRowsCount(MySqlCommand command) 
{  
int rowsCount=Convert.ToIn32(command.ExecuteScalar()); 
return rowsCount;  
} 

使用上述功能如下:

MySqlCommand command=new MySlCommand("Select count(*) from MyTable",connectionObj); 
int totalRows = GetRowsCount(command) 
+0

感謝我試圖避免做多個查詢,即一個SELECT COUNT(*)然後我的實際SELECT – Boardy

+0

這不是他們問的。 – cybermonkey

0

也許你可以看看周圍的事物,你可能只是做一個選擇計數的其他方式

  • ( *)並得到行數

  • 使用數據適配器來填充的容器(如一個DataTable)和計數行
+0

謝謝我試圖避免做多個查詢,即,一個SELECT COUNT(*)然後我的實際SELECT,我會給DataTable一個試試 – Boardy

2

。利用一個DataTable的加載你的結果,例如

DataTable dt = new DataTable(); 
dt.Load(reader); 
int numberOfResults = dt.Rows.Count; 

然後,您也可以遍歷行以讀取值,例如,

foreach(DataRow dr in dt.Rows) 
{ 
    var value = dr["SomeResultingColumn"] 
} 

的另一種選擇是發出兩個單獨的SQL語句,但是你需要保證雙方發了一個事務中裝入用Serializable隔離級別,這是需要確保記錄的之間不插入執行兩條SQL語句。

+0

應該是'dt.Rows.Count'。 – cybermonkey

-1
OleDbDataReader dbreader = new OleDbDataReader(); 
int intcount = 0; 
if (dbreader.HasRows == true) 
{ 
    if (dbreader.Read()) 
    { 
    intcount = dbreader.RecordsAffected; 
    } 
} 

「dbreader.RecordsAffected」會給你行更改,插入或SQL

+0

這不回答我的問題,我正在做一個SELECT,並需要得到返回的行數,正如你所說這是數據庫修改查詢 – Boardy

+0

感謝您的反饋...我只是試圖幫助你... – AzelMalaysia

+0

我想我看到RecordsAffected只在結果集關閉後才更新 - 除了只對行進行更改之外,還有一個問題。 –

1

我認爲的最後一條語句刪除,而不執行另一個命令是不可能的數量......因爲有在讀取器類可用於計數沒有方法

你可以試試這個...如果它的工作原理..

string query = "SELECT * FROM reports, software, platforms, versions " 
        + "WHERE [email protected] AND reports.SoftwareID=software.id AND reports.PlatformID=platforms.id " 
        + "AND reports.VersionID=versions.id AND [email protected]"; 
       using (MySqlCommand cmd = new MySqlCommand(query, db.conn)) 
       { 
        cmd.Parameters.AddWithValue("@verified", "1"); 
        cmd.Parameters.AddWithValue("@notificationSent", "0"); 


        using (MySqlDataReader reader = cmd.ExecuteReader()) 
        { 


        // create a new connection db.conn2 then 
        MySqlCommand cmd2 = new MySqlCommand(query, db.conn2)) 
        cmd2.Parameters.AddWithValue("@verified", "1"); 
        cmd2.Parameters.AddWithValue("@notificationSent", "0"); 
        MySqlDataReader reader2 = cmd2.ExecuteReader(); 
        int numberofrow=0; 
        while(reader2.Read()) 
        numberofrow++; 


         //your codes...... 







        } 
0

Jan Van @Herck的不幸解決方案將僅返回一行,因此如果您有興趣在一次選擇中獲取所有行和它們的編號,則這不是您需要的。在這種情況下,我建議你試試這個: select *,(select my_table中的count(*))從my_table中獲取num numRow;

或閱讀: Getting total mysql results returned from query with a limit: FOUND_ROWS error

+0

只是注意到由於某些原因,計數工作前的*,而計數失敗後的*,儘管您可以在那裏指定列。 –

0

是在同一個問題的工作。我討厭不得不遍歷如果一個方法是已經上市,但是這是我能想出的最短位:

MySqlCommand cmd = new MySqlCommand(query, connection); 
MySqlDataReader reader = cmd.ExecuteReader(); 

int rowcount = 0; 
while(reader.Read()){ 
rowcount++; 
}