C# 在c中使用mysql时计算受影响的行数

C# 在c中使用mysql时计算受影响的行数,c#,mysql,C#,Mysql,我有一个C语言的WinForms项目,它连接到一个MySQL数据库。我正在尝试计算结果中的行数,我不能使用RecordsAffected,因为此属性只有在读取完成后才具有正确的值,正如您从下面的代码中看到的,我以前需要它。你知道怎么做吗 string sql = "SELECT * FROM Tigers WHERE Link='" + link + "'"; MySqlCommand cmd = new MySqlCommand(sql, conn); MySqlDataReader rdr

我有一个C语言的WinForms项目,它连接到一个MySQL数据库。我正在尝试计算结果中的行数,我不能使用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
    }

在执行SELECT查询时,不会对数据库中的数据产生太大影响。您正在检索与查询匹配的记录。如果要计算与查询匹配的记录数,可以将count与cmd.ExecuteScalar一起使用。

可以使用ExecuteScalar方法,如下所示:

MySqlCommand cmd = new MySqlCommand(sql, conn);
int rowCount = cmd.ExecuteScalar();
另外,您当前的查询可能容易受到攻击。您应该考虑参数化查询,例如:

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();
您可以改为使用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();
通过使用MySqlDataReader实现的IDataReader,在读取完成之前,无法保证服务器知道有多少行受到影响

我将以稍微不同的方式构造您的代码:

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
        }
    }
}

谢谢你的回答,我最终使用了hasrow,它工作得非常出色。再次感谢!