2011-08-21 48 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