我在C#中有一个连接到MySQL数据库的WinForms项目。我正在尝试计算结果中的行数,我不能使用RecordsAffected
,因为此属性在读取完成后只有正确的值,您可以从下面的代码中看到我之前需要它。有什么想法如何做到这一点?
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
}
答案 0 :(得分: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();
答案 1 :(得分:1)
执行SELECT
查询时,数据库中的影响很多。您正在检索与您的查询匹配的记录。如果您想计算与您的查询匹配的记录数,可以使用count
和cmd.ExecuteScalar()
。
答案 2 :(得分: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();
答案 3 :(得分:0)
通过使用IDataReader
(MySqlDataReader
实现),无法保证服务器在读取完成之前知道有多少行受影响。
我的代码结构略有不同:
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
}
}
}