【问题标题】:Can I pass a parameter of an OledbCommand to other OledbCommand?我可以将 OledbCommand 的参数传递给其他 OledbCommand 吗?
【发布时间】:2019-06-01 06:04:50
【问题描述】:

这可能是个愚蠢的问题,但我需要一些解决方案。
我已经做到了

cmd.CommandText = "Insert Table1(Col1,Col2,Col3,Date) Values (1,'aa',101,?)"
cmd.Connection = con2
cmd.Parameters.AddWithValue("@Date", transdate)
ExecuteQuery(con2,cmd)

我写了下面的代码以避免写Using.. End Using无处不在。
如果没有参数,查询运行良好。

Private Sub ExecuteQuery(con as OledbConnection,cmd as OledbCommand)
Using con1 As New OleDbConnection(con.ConnectionString)
    Using cmd1 As New OleDbCommand(cmd.CommandText)
        cmd1.Connection = con1
        con1.Open()
        cmd1.ExecuteNonQuery()
        con1.Close()
    End Using
End Using

当我在Using Block 下编写 cmd 时,它可以很好地处理参数。
但正如我所说,我避免到处写Using
但是这样做会产生错误——No Given values for one or more required parameters.

【问题讨论】:

  • 为什么,哦,你为什么要避免写 Using 块。它应该让你的生活更轻松。不再有关闭和处置代码。
  • 将数据库对象保存在本地。在方法中声明为局部变量。在方法中使用它们。然后以相同的方法关闭并处置它们。这些对象可能正在使用 GC 无法收集的非托管代码。这使得 Dispose 很重要,因此对象可以释放非托管资源。

标签: vb.net oledb oledbcommand


【解决方案1】:

您需要调整 ExecuteQuery,因为它正在执行新命令并丢失参数。更改它,使其使用您传递的现有命令并处理它,或将参数从入站命令传输到新命令

Private Sub ExecuteQuery(con as OledbConnection, cmd as OledbCommand)
  Using con1 As New OleDbConnection(con.ConnectionString)
    Try
        cmd.Connection = con1
        con1.Open()
        cmd.ExecuteNonQuery()
        con1.Close()
    Finally
        cmd.Dispose()
    End Try
  End Using 
End Sub

Private Sub ExecuteQuery(con as OledbConnection,cmd as OledbCommand)
  Using con1 As New OleDbConnection(con.ConnectionString)
    Using cmd1 As New OleDbCommand(cmd.CommandText)
        cmd1.Connection = con1
        ForEach p as Parameter in cmd.Parameters
          cmd1.Parameters.Add(p) 
        con1.Open()
        cmd1.ExecuteNonQuery()
        con1.Close()
    End Using
  End Using
End Sub

如果您正在寻找一种让您的数据库生活更轻松的方法,请查看 Dapper 或实体框架 - 您使用对象,它会为您编写所有 sql。这不是控制的停止(您仍然编写查询),而是委派执行查询、检查结果、挖掘每个文本或 int 并将其分配给您的用户对象的名称或年龄的无聊方面..

如果您不想编写 SQL,请使用实体框架,因为它可以在您的对象和数据库之间自动转换

【讨论】:

  • 我得到了你的答案,但你能给我举个小例子吗??我也必须使用Using 关键字。
  • 编辑了一个例子
  • 我的工作方式与您之前给出的示例类似,但在 backgroundworker 中无法正常工作,因此我正在使用 Using 关键字进行转换。建议我使用Using,它可以很好地执行异步查询
  • BackgroundWorker 应该对 Using 没有任何影响
猜你喜欢
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 2011-02-19
  • 2012-12-26
  • 2014-01-21
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
相关资源
最近更新 更多