iT邦幫忙

0

C# DataTable 使用DataReader 會當讀取器關閉時嘗試呼叫 Read 無效。

  • 分享至 

  • xImage

您好:
於C# + MSSQL 中

主PORC
|-- 判斷是否要做 次PROC ( 裡面有seldct 語法)
|--主PROC 最後有select 語法

因為會有次PORC 的執行可能性,所以會有多個datareader
故會去判斷這一個datareader是否為需要的
有需要,在填入datatable中
但是以下程式碼,若沒加break 跳出,就會遇到
使用DataReader 會當讀取器關閉時嘗試呼叫 Read 無效。
請問,這有何種方式可以解決 table使用reader的問題

  while (dr.HasRows)
            {
                Console.WriteLine("\t{0}", dr.GetName(0));

                if (dr.GetName(0) == "doz") {
                    table1.Load(dr);
                    break;
                }            

                dr.NextResult();
            }

望空 iT邦新手 1 級 ‧ 2024-12-23 14:26:41 檢舉
while做到最後去關閉看看
noway iT邦研究生 1 級 ‧ 2024-12-24 08:24:16 檢舉
您好:
改了,不做 //break;  一樣有問題

do
{
while (dr.Read())
{
if (dr.GetName(0) == "dlvdate_min")
{
table1.Load(dr);
//break;
}
}

} while (dr.NextResult());
.

1 個回答

0
sam0407
iT邦大師 1 級 ‧ 2024-12-24 09:38:29
最佳解答

主、次PORC分別用兩個DataReader來作就好了....

while (dr1.HasRows)
            {
                Console.WriteLine("\t{0}", dr1.GetName(0));

                if (dr1.GetName(0) == "doz") {
                    table1.Load(dr2);
                    break;
                }            

                dr1.NextResult();
            }

看更多先前的回應...收起先前的回應...
noway iT邦研究生 1 級 ‧ 2024-12-26 20:16:04 檢舉

您好:
謝謝
所以 會需要用break; ?

sam0407 iT邦大師 1 級 ‧ 2024-12-27 09:10:04 檢舉

這要看您程式的邏輯呀,我並不清楚您的需求...

改成用兩個DataReader只是要解決用了table1.Load(dr)指令後,再執行dr.NextResult()會因為DataReader被關閉而出錯的問題

noway iT邦研究生 1 級 ‧ 2024-12-27 18:30:10 檢舉

您好:
我只是好奇,為何 原程式,有brak,就不會有問題
table1.Load(dr); 後,仍會咬住 dr 嗎?

一個proc 的結果
要如何分為 dr1 與 dr2

sam0407 iT邦大師 1 級 ‧ 2024-12-30 09:26:43 檢舉

建議您先把.Net的基礎讀紮實,再來看或改別人的程式。

break就跳出while迴圈了,不會執行到dr.NextResult();,自然也不會有錯誤。

執行table1.Load(dr);後,不是會咬住dr,您看錯誤訊息就可以知道是因為dr被關閉。如果您了解DataTable.Load這方法作了什麼事,就不會覺得意外。

noway iT邦研究生 1 級 ‧ 2024-12-30 19:38:39 檢舉

謝謝您的指導

我要發表回答

立即登入回答