C# 使用ExecuteReader代替ExecuteOnQuery

C# 使用ExecuteReader代替ExecuteOnQuery,c#,mysql,C#,Mysql,这对我来说很好,因为我只将这些语句传递给我的MySQL服务器 插入、更新和删除时是否可以使用ExecuteReader() 我通常在这些问题上使用ExecuteNonQuery() ExecuteReader 不使用:当数据库查询将要确保正好提供1时 记录 用法:当数据库查询要提供一组记录时。可能 搜索或报告 执行查询 用法:当我们讨论单个数据库记录更新时, 插入、删除和按Id获取 ExecuteScalar 不使用:当数据库查询返回单个值和此值时 可以在T-SQL中定义为参数。带输出的Exec

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

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

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

ExecuteReader

不使用:当数据库查询将要确保正好提供1时 记录

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

执行查询

用法:当我们讨论单个数据库记录更新时, 插入、删除和按Id获取

ExecuteScalar

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

用法:当数据库查询返回一个值而该值不能 由于的T-SQL类型限制,被定义为输出参数 变量


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

我确实看到了两件可能不好的事情。。。代码中没有任何内容,但您展示的内容是简化的,简化的代码暗示了一些潜在的不良做法:

第一个问题是,您的代码看起来像是在使用字符串连接来将值替换到查询中。大概是这样的:

MySqlCommand cmd = new MySqlCommand
                    (@"INSERT INTO Table(field) VALUES('somevalue');" +
                    "SELECT * FROM table",cn);
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;
这是一个巨大的问题,因为它在应用程序中打开了一个巨大的安全漏洞。相反,您需要使用查询参数,因此代码看起来更像这样:

MySqlCommand cmd = new MySqlCommand
                    (@"INSERT INTO Table(field) VALUES('somevalue');" +
                    "SELECT * FROM table",cn);
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块)中,如下所示:

MySqlCommand cmd = new MySqlCommand
                    (@"INSERT INTO Table(field) VALUES('somevalue');" +
                    "SELECT * FROM table",cn);
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;

如果为了结构化,您必须使用
ExecuteReader
,那么请继续,只需记住在之后处理(关闭)读卡器即可。它对程序的影响很小,但很可能仅限于.Net部分,主要是额外类实例的内存消耗。事实上,某些ADO.Net提供程序在内部使用
ExecuteReader
隐藏
ExecuteOnQuery


这里更大的问题是插入查询后的
SELECT*fromtable
部分。即使不使用读取器读取数据,执行select查询仍会消耗更多资源。在这里,无论您使用
ExecuteReader
还是
ExecuteNonQuery
(当然,除非您从读者那里阅读)

在MySQL端,都应该没有区别。希望您真正的代码不会在每次插入时实际选择表中的所有行。如果我试图从整个表中进行“选择”,那么它的性能将受到严重影响。我刚刚设置了一个例子,OP的可能重复引用的是MySQL的
MySqlCommand
类,而不是SQL Server。可疑的建议:“选择一条记录时使用带有输出参数的ExecuteOnQuery”?等等,等等。您实际上是建议我们为给定的单个结果行中的每列声明n个输出参数?我总是在参数处传递“用户”输入,以避免SQL注入,并练习异常处理。我只是举这个例子。因为,可以向我的服务器抛出批处理查询。谢谢你的启发。