2011-08-21 49 views
2

下面是一个较大函数的简单代码片段作为示例。使用Statement的Sqldatareader会返回一个Output参数吗?

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 

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


让我补充一点,根据我读过使用一个SqlDataReader你调用SqlDataReader中.Close后,你只能访问输出参数。

+0

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

回答

1

您确实只需要输出参数中返回的

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

+0

根据我读过的内容,如果您在sqldatareader上调用.close,则只能访问该值。那么它会在上面的例子中返回以便使用吗?我知道如何引用和使用函数其余部分的值。 – NinjaBomb

+0

@NinjaBomb - 来自文章:“我发现你必须完整处理整个记录集之前检索输出参数否则,输出参数将为空。” - 这意味着所有记录需要先被读取,而不是'.Close()'需要被调用。 – Oded

+0

文章结尾处的简短复制和粘贴摘要: - 确保您通过cmd.ExecuteReader()通过所有记录集处理第一个SqlDataReader来获取记录集,然后... ** - 确保关闭记录集,或SqlDataReader通过reader.Close()之前尝试检索输出参数。** – NinjaBomb

0

不知道,我知道你想达到什么样的,但是这似乎是一个更好的办法

updateResult.Success = False 

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

您阅读Using语句中的结果,如果出现任何故障,你把它预设为假......

+0

我以为你的例子不会工作,因为SqlDataReader必须先关闭,然后才能访问输出参数?你首先在Using语句中关闭它吗? – NinjaBomb

+0

为什么读者必须先关闭?我不使用SQL服务器,但与其他数据库(如甲骨文)从来没有这样的限制... – Yahia

+0

检查此博客张贴好的解释:http://www.dominicpettifer.co.uk/Blog/8/ output-parameters-and-recordsets-from-a-stored-procedure – NinjaBomb