【问题标题】:Will Sqldatareader with Using Statement ever return an Output parameter?带有 Using 语句的 Sqldatareader 会返回输出参数吗?
【发布时间】:2011-08-21 18:23:12
【问题描述】:

这里以一个较大函数的简单代码sn-p为例。

Using conn as New SqlConnection("conn string")
    Using find as new SqlCommand("ExampleProc",conn)
        Dim rParam as new SqlParameter("@RESULT",SqlDbType.Int)
        rParam.Direction = ParameterDirection.Output
        find.Pareameters.Add(rParam)

        Using f as SqlDataReader = find.ExecuteReader
              'Do stuff with datareader
        End Using

        updateResult.Success = Convert.ToBoolean(find.Parameters("@RESULT").Value)
    End Using
  End Using

我知道 SqlDataReader 关闭后会返回 Output 参数。据我所知,Using 语句将在 SqlDataReader 上调用 .Dispose,那么这基本上会消除 Output 参数吗?如果是这样,调用 SqlDataReader 的最佳方法是什么,该 SqlDataReader 还包含正确关闭和处理所有内容的输出参数?在我的搜索中,我在网上找不到任何具体的信息或示例。谢谢!


让我根据我读到的内容补充一下,在调用 SqlDataReader 上的 .Close 后,您只能使用 SqlDataReader 访问 Output 参数。

【问题讨论】:

  • 处置读者应该只影响那个对象(以及它拥有的任何对象或资源)。我认为它不应该从命令中删除任何内容。

标签: .net vb.net parameters sqldatareader using-statement


【解决方案1】:

你真的只需要输出参数中返回的

您可以将值复制到在Using 块外声明的变量中并返回该值,或者在您有权访问该值时直接返回该值。

【讨论】:

  • 根据我读过的内容,只有在 sqldatareader 上调用 .close 时,您才能访问该值。那么它会在上面的示例中返回以首先使用吗?我知道如何在函数的其余部分引用和使用该值。
  • @NinjaBomb - 来自文章:“我发现您必须在检索输出参数之前完全处理整个记录集,否则,输出参数将为空。” - 这意味着需要首先读取所有记录,而不是需要调用.Close()
  • 文章末尾的简短复制和粘贴摘要: - 确保首先通过 cmd.ExecuteReader() 将记录集作为 SqlDataReader 检索 - 处理所有记录集,然后... -确保在尝试检索输出参数之前通过 reader.Close() 关闭记录集或 SqlDataReader。
【解决方案2】:

不确定我是否理解您想要实现的目标,但这似乎是一种更好的方法

    updateResult.Success = False

    Using f as SqlDataReader = find.ExecuteReader
          'Do stuff with datareader
          updateResult.Success = Convert.ToBoolean(find.Parameters("@RESULT").Value)
    End Using

您在 Using 语句中读取结果,如果有任何失败,您将其预设为 false...

【讨论】:

  • 我认为您的示例不起作用,因为必须关闭 SqlDataReader 才能访问输出参数?你先在 Using 语句中关闭它吗?
  • 为什么一定要先关闭阅读器?我不使用 sql sever,但使用其他数据库(如 oracle)从来没有这样的限制......
  • 查看这篇博文以获得很好的解释:dominicpettifer.co.uk/Blog/8/…
  • 我明白...这与 Oracle 不同-您可以只返回一个游标并使用它...这只是意味着在您阅读输出参数之前,您需要阅读所有记录(例如在 Using 中使用 while 循环)...以上仍然可以工作...
  • 这正是我在 Using 块中检索记录的方法。不太确定输出参数是否可用。希望今天做一些测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2011-02-25
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多