使用ExecuteReader而不是ExecuteNonQuery

时间:2011-08-31 02:13:03

标签: c# mysql

MySqlCommand cmd = new MySqlCommand
                    (@"INSERT INTO Table(field) VALUES('somevalue');" +
                    "SELECT * FROM table",cn);

这对我来说很好,因为我只是将这些语句传递给我的MySQL服务器。

插入&时可以使用ExecuteReader()吗?更新&删除?

我通常会使用ExecuteNonQuery()

3 个答案:

答案 0 :(得分:8)

您可以将额外的INSERT与SELECT与ExecuteReader()捆绑在一起。这没关系。

我确实看到两件可能不合适的东西......代码本身没什么,但是你展示的内容是简化的,简化的代码暗示了一些潜在的不良做法:

第一个不合适的是你的代码看起来像可能使用字符串连接来将值替换为你的查询。像这样:

MySqlCommand cmd = new MySqlCommand
                (@"INSERT INTO Table(field) VALUES('" + somevariable + "');" +
                "SELECT * FROM table",cn);

这是一个巨大的问题,因为它会在您的应用程序中打开一个巨大的安全漏洞。相反,您需要使用查询参数,因此代码看起来更像是这样:

MySqlCommand cmd = new MySqlCommand
                (@"INSERT INTO Table(field) VALUES(@somevalue);" +
                "SELECT * FROM table",cn);
cmd.Parameters.Add("@somevalue", SqlDbType.VarChar, 50).Value = somevariable;

另一个潜在的问题是你的命令,更重要的是你的连接应该包含在try / finally块中(或者首选使用块),如下所示:

using (var cn = new MySqlConnection("..."))
using (var cmd = new MySqlCommand("@INSERT INTO Table(field).... ", cn))
{
    cmd.Parameters.Add(...);
    cn.Open();
    using (var rdr = cmd.ExecuteReader())
    {
        while (rdr.Read())
        {
            //...
        }
    }
}

答案 1 :(得分:4)

  

<强>的ExecuteReader

     

不要使用:当数据库查询确定提供1时   记录。

     

使用:当数据库查询要提供一组记录时。有可能   搜索或报告。

     

<强>的ExecuteNonQuery

     

使用:当我们谈论单个数据库记录时 - 在更新中,   按ID插入,删除和获取。

     

<强>的ExecuteScalar

     

不要使用:当数据库查询返回单个值和此值时   可以在T-SQL中定义为参数。带输出的ExecuteNonQuery   在这种情况下,参数总是优选的,因为它更多   灵活,明天将有2个值因此具有   ExecuteNonQuery我们不需要更改方法签名。

     

使用:当数据库查询返回单个值时,此值不能   被定义为输出参数,因为T-SQL类型限制   变量

Reference

答案 2 :(得分:1)

如果为了构造,你必须使用ExecuteReader然后继续,只需记住之后处理(关闭)读者。它对程序有一点影响,但很可能只限于.Net部分,主要是附加类实例的内存消耗。事实上,某些ADO.Net提供商在内部ExecuteReader后面使用ExecuteNonQuery

这里更大的问题是插入查询后的SELECT * FROM table部分。即使您没有使用阅读器来读取数据,它仍然会消耗更多资源来执行选择查询。在这里,MySQL方面应该没有区别,无论你使用ExecuteReader还是ExecuteNonQuery(当然,除非你从读者那里读到)