繁体   English   中英

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

[英]Counting number of affected rows when using mysql in c#

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

您可以改用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();

执行SELECT查询时,对数据库的影响不大。 您正在检索与您的查询匹配的记录。 如果要计算与查询匹配的记录数,可以使用countcmd.ExecuteScalar()

您可以像这样使用ExecuteScalar方法:

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

另外,您当前的查询可能容易受到Sql Injection攻击 您应该考虑对查询进行参数化,如下所示:

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();

通过使用IDataReaderMySqlDataReader实现),无法保证服务器在读取完成之前知道受影响的行数。

我的代码结构略有不同:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM