我目前正在开发一个C#项目,我正在尝试从MySQL Data Reader返回的行数。
我知道没有直接的功能,所以我想写自己的。在函数中,我将MySQLDataReader
对象传递给它,然后遍历MySQL数据读取器并递增计数器并返回计数器的值。
这似乎锁定了程序,我想是因为在我得到计数之后我已经Reader.read()
我已经结束了。相反,我尝试创建一个阅读器的副本,然后循环临时版本,但我得到相同的结果。
下面是我执行查询并调用函数的代码。
string query = "SELECT * FROM reports, software, platforms, versions "
+ "WHERE EmailVerified = @verified AND reports.SoftwareID = software.id AND reports.PlatformID = platforms.id "
+ "AND reports.VersionID = versions.id AND BugReportAcceptedNotificationSent = @notificationSent";
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;
}
}
答案 0 :(得分:5)
为了避免多次查询,如何在选择本身中包含总数?
SELECT COUNT(*) AS TotalNORows, * FROM reports, software, platforms, versions etc
答案 1 :(得分:3)
使用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语句。
答案 2 :(得分:1)
我认为不执行另一个命令就不可能......因为读者类中没有可用于计数的方法
你可以尝试这个......如果它有效..
string query = "SELECT * FROM reports, software, platforms, versions "
+ "WHERE EmailVerified=@verified AND reports.SoftwareID=software.id AND reports.PlatformID=platforms.id "
+ "AND reports.VersionID=versions.id AND BugReportAcceptedNotificationSent=@notificationSent";
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......
}
答案 3 :(得分:1)
正在解决同样的问题。如果方法已经可用,我讨厌必须迭代,但这是我能提出的最短的一点:
MySqlCommand cmd = new MySqlCommand(query, connection);
MySqlDataReader reader = cmd.ExecuteReader();
int rowcount = 0;
while(reader.Read()){
rowcount++;
}
答案 4 :(得分:0)
也许你可以反过来看待事情
或
答案 5 :(得分:0)
来自Jan Van @Herck的不幸解决方案只返回一行,所以如果您有兴趣将所有行及其编号放在一个选择中,这不是您所需要的。
在这种情况下,我建议你试试这个: select *,(从my_table中选择count(*))来自my_table的AS numRow;
或读到这个: Getting total mysql results returned from query with a limit: FOUND_ROWS error
答案 6 :(得分:0)
首先,创建此类:
public static class Extensions
{
public static int Count(this MySqlDataReader dr)
{
int count = 0;
while(dr.Read())
count++;
return count;
}
}
这将在MySqlDataReader上实现.Count()。
int count = reader.Count();
示例:
string sql= "SELECT * FROM TABLE";
MySqlCommand cmd = new MySqlCommand(sql, connection);
MySqlDataReader reader = cmd.ExecuteReader();
int count = reader.Count();
答案 7 :(得分:-1)
您可以使用以下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)
答案 8 :(得分:-1)
OleDbDataReader dbreader = new OleDbDataReader();
int intcount = 0;
if (dbreader.HasRows == true)
{
if (dbreader.Read())
{
intcount = dbreader.RecordsAffected;
}
}
“dbreader.RecordsAffected”将为您提供由SQL的最后一个语句更改,插入或删除的行数