Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用单个OleDbCommand类型执行选择、更新、插入和删除查询_C#_.net - Fatal编程技术网

C# 使用单个OleDbCommand类型执行选择、更新、插入和删除查询

C# 使用单个OleDbCommand类型执行选择、更新、插入和删除查询,c#,.net,C#,.net,我有一个用户提供SQL查询并由我的服务器执行的界面 我使用的是,它希望您使用ExecuteReader()、ExecuteNonQuery()或ExecuteScalar,具体取决于查询是返回多行、操作数据库还是检索单个值 对于所有类型的查询,有没有办法使用上述任何一种方法?简短的回答是没有,您无法同时使用这三种方法 ExecuteReader:此成员已重载。有关此成员的完整信息,包括语法、用法和示例,请单击重载列表中的名称 ExecuteNonQuery:针对连接执行Transact-SQL语

我有一个用户提供SQL查询并由我的服务器执行的界面

我使用的是,它希望您使用
ExecuteReader()
ExecuteNonQuery()
ExecuteScalar
,具体取决于查询是返回多行、操作数据库还是检索单个值


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

简短的回答是没有,您无法同时使用这三种方法

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

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

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

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

您可以做一些变通,尝试将
enum
与三个值一起使用,并让用户传递值,您可以在您的身边制作
开关盒
,以检查
enum
值并启动适当的功能


希望这有助于您分析查询的文本,根据这一点,您的代码可以选择使用哪种执行方法


这比让用户在GUI上选择更好。

其中最常见的是
ExecuteReader

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

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

在最简单的情况下,区分所需的输出很容易:

  • ExecuteNonQuery
    将完全没有行。因此
    DbDataReader.HasRows
    为false(并且
    DbDataReader.Read
    返回false)-这意味着您知道您只想返回
    DbDataReader.RecordsAffected
  • ExecuteScalar
    通常在只有一行和一列的情况下使用。您可以对列使用
    FieldCount
    ,因为行比较复杂(您需要阅读第一行以确定是否还有行)
  • ExecuteReader
    是微不足道的
但关键的一点是,它们中的每一个都可以用于任何查询。重要的不是查询在做什么,而是应用程序想对结果做什么。对于选择真实数据的查询,始终可以调用
ExecuteNonQuery
,但这有点违背了目的。如果您确实关心这些区别,只需让用户选择他想要的是受影响的记录计数、第一个值还是整个结果集


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

我不明白为什么不能将
ExecuteReader
用于所有查询。当您实际上不需要设置和接收行集时,这就太麻烦了。因为在某个时候,您需要>1行,所以我认为您必须做出默认选择。@DonBoitnott:问题是,在我的GUI中,用户应该是输入查询的人。因为我不知道用户类型(选择、更新等)是什么,所以我需要“中立”的解决方案,这就是为什么我问这个问题。嗯,允许用户输入sql,听起来是个糟糕的主意。一种方法是查看他们想要执行的查询,如果它有select,那么使用
ExecuteReader
code。你也在为自己设置一个巨大的SQL注入难题。对您的数据库执行未知的SQL似乎不是一个好主意。如果我为每个表输入'DELETE FROM tbl',该怎么办?您打算如何清理查询?如果您已经在检查它们,那么您应该能够知道它是什么类型的查询,并正确地执行它。尽管如此,我还是敦促您重新考虑演示的方向。用一个糟糕的概念继续战斗只会导致糟糕的决策。好的应用程序的第一步是好的设计和规划。你的面试官不会看到你出色的代码,她会看到你糟糕的设计选择。谢谢你的帮助。有一个工作你可以做。。。是的,我也想到了类似的东西,但我真的不想重新设计GUI…想想你想对查询结果做什么。我正在构建一个小型演示应用程序,我希望在求职时将其与简历一起发送。我有treeview,它在数据库中显示表及其列,用户输入查询的文本框,以及应该填充结果的listview。我只需要处理UPDATE/INSERT/etc类型的查询。我想让它保持简单,只显示
MessageBox.Show(“Success”)因为捕获将处理错误。就这些,我希望现在一切都清楚了。顺便说一句,根据我的测试,到目前为止,
ExecuteReader
是有效的。10x 4回答。@AlwaysLearningNewStuff是的,继续使用
ExecuteReader
,它会很好地工作。如果有行,在列表视图中显示它们(或者更好,在网格中显示),如果没有行,可以只显示affec