C# 使用单个OleDbCommand类型执行选择、更新、插入和删除查询
我有一个用户提供SQL查询并由我的服务器执行的界面 我使用的是,它希望您使用C# 使用单个OleDbCommand类型执行选择、更新、插入和删除查询,c#,.net,C#,.net,我有一个用户提供SQL查询并由我的服务器执行的界面 我使用的是,它希望您使用ExecuteReader()、ExecuteNonQuery()或ExecuteScalar,具体取决于查询是返回多行、操作数据库还是检索单个值 对于所有类型的查询,有没有办法使用上述任何一种方法?简短的回答是没有,您无法同时使用这三种方法 ExecuteReader:此成员已重载。有关此成员的完整信息,包括语法、用法和示例,请单击重载列表中的名称 ExecuteNonQuery:针对连接执行Transact-SQL语
ExecuteReader()
、ExecuteNonQuery()
或ExecuteScalar
,具体取决于查询是返回多行、操作数据库还是检索单个值
对于所有类型的查询,有没有办法使用上述任何一种方法?简短的回答是没有,您无法同时使用这三种方法
ExecuteReader
:此成员已重载。有关此成员的完整信息,包括语法、用法和示例,请单击重载列表中的名称
ExecuteNonQuery
:针对连接执行Transact-SQL语句并返回受影响的行数
ExecuteScalar
:执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略
正如您所看到的,它们中的每一个都有自己的用法,无法将它们全部组合起来
您可以做一些变通,尝试将enum
与三个值一起使用,并让用户传递值,您可以在您的身边制作开关盒
,以检查enum
值并启动适当的功能
希望这有助于您分析查询的文本,根据这一点,您的代码可以选择使用哪种执行方法
这比让用户在GUI上选择更好。其中最常见的是
ExecuteReader
ExecuteScalar
只读取结果集中的第一个值(第一行的第一列)。因此,将其转换为ExecuteReader
是微不足道的——它已经在内部使用了ExecuteReader
)
ExecuteOnQuery
可能不会打开读卡器,但您仍然可以使用ExecuteReader
模拟相同的行为,-DbDataReader.RecordsAffected
属性为您提供完全相同的值。拥有读取器的开销可以忽略不计,特别是在GUI应用程序的上下文中
在最简单的情况下,区分所需的输出很容易:
将完全没有行。因此ExecuteNonQuery
为false(并且DbDataReader.HasRows
返回false)-这意味着您知道您只想返回DbDataReader.Read
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