使用 ExecuteReader 而不是 ExecuteNonQuery

本文关键字:ExecuteNonQuery ExecuteReader 使用 | 更新日期: 2023-09-27 18:07:00

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

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

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

我通常在这些上使用ExecuteNonQuery()

使用 ExecuteReader 而不是 ExecuteNonQuery

你可以很好地将额外的 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/final块(或者优先使用using块(,如下所示:

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 记录。

使用:当数据库查询将提供一组记录时。它可能会 是搜索还是报告。

执行非查询

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

执行标量

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

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

参考

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

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