我有一个界面,用户提供SQL查询,我的服务器执行它。
我正在使用OleDbCommand,希望您使用ExecuteReader()
,ExecuteNonQuery()
或ExecuteScalar
,具体取决于查询是返回多行,操纵数据库还是检索一个单一的价值。
对于所有类型的查询,有没有办法使用上述任何一种?
答案 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上选择一些内容更好。