使用单个OleDbCommand类型执行SELECT,UPDATE,INSERT和DELETE查询

时间:2015-05-20 10:44:26

标签: c# .net

我有一个界面,用户提供SQL查询,我的服务器执行它。

我正在使用OleDbCommand,希望您使用ExecuteReader()ExecuteNonQuery()ExecuteScalar,具体取决于查询是返回多行,操纵数据库还是检索一个单一的价值。

对于所有类型的查询,有没有办法使用上述任何一种?

3 个答案:

答案 0 :(得分:2)

其中最常见的是ExecuteReader

ExecuteScalar只读取结果集中的第一个值(第一行的第一列)。因此,将其转换为ExecuteReader是微不足道的 - 它已在内部使用ExecuteReader:)

ExecuteNonQuery可能无法打开阅读器,但您仍然可以使用ExecuteReader模拟相同的行为 - DbDataReader.RecordsAffected属性为您提供完全相同的值。拥有阅读器的开销可以忽略不计,特别是在GUI应用程序的上下文中。

在最简单的情况下,区分您想要的输出很容易:

  • ExecuteNonQuery根本就没有行。因此DbDataReader.HasRows为false(并且DbDataReader.Read返回false) - 这意味着您知道您只想返回DbDataReader.RecordsAffected
  • 当您有一行和一列时,通常会使用
  • ExecuteScalar。您可以使用FieldCount作为列,行更复杂(您需要阅读第一行以查明是否还有行)。
  • ExecuteReader很简单。

但关键是每个都可以用于任何查询。重要的部分不是查询正在做什么,而是您的应用程序想要对结果做什么。您总是可以在选择真实数据的查询上调用ExecuteNonQuery - 但这有点挫败了目的。如果您确实关心这些区别,只需让用户选择他是否想要受影响的记录计数,第一个值或整个结果集。

所以不要考虑你正在运行什么样的查询,这并不重要。您可以使用ExecuteReader进行delete查询,并且可以将ExecuteNonQuery用于返回结果的查询。想想你想用查询的结果做什么。

答案 1 :(得分:0)

简短回答是否定,你无法同时使用其中的三个

ExecuteReader:此成员已超载。有关此成员的完整信息,包括语法,用法和示例,请单击重载列表中的名称Reference

ExecuteNonQuery:对连接执行Transact-SQL语句并返回受影响的行数。 Reference

ExecuteScalar:执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。 Reference

正如您所看到的,每一个都有自己的用法,无法将它们全部组合

您可以制作一个解决方法,尝试使用enum三个值并让用户传递值,然后从您这边可以switch case来检查{{1}值和激发正确的函数

希望这有帮助

答案 2 :(得分:0)

您可以分析查询的文本,并且根据这一点,您的代码可以选择要使用的Execute方法。

这比让用户在GUI上选择一些内容更好。