2011-06-27 73 views
4

我沒有在年齡(我更喜歡使用ORM)使用DataReaders,但我被迫在工作。我拉回行,並檢查HasRows是否屬實;在這一點進行調試並檢查讀者表明我的數據在那裏。DataReader有行和數據,試圖從它讀取說「沒有數據存在」

現在遇到了這個問題:當我打電話給reader.Read()時,試圖展開結果顯示「枚舉沒有結果」或任何其他內容,並且我得到「無數據存在時無效嘗試讀取」。錯誤。如果我不呼叫Read()(這是DataReader在第一條記錄之前啓動的默認值),我會得到相同的結果。

我不記得正確的方法來處理這個;數據那裏,當我檢查HasRows,但是我不是在我打電話Read之後或之後嘗試從它讀取的那一刻,這是沒有意義的,因爲如果我不打電話Read,讀者應該仍然在之前第一個記錄,如果該屬性設置爲在第一個記錄(SingleRow?我忘記了它的名稱)時啓動它,那麼我應該能夠在不調用Read的情況下讀取行,但是這兩種方式似乎都是以前移動的包含數據的行。

我忘了什麼?代碼相當簡單:

TemplateFile file = null; 
using (DbDataReader reader = ExecuteDataReaderProc("GetTemplateByID", idParam)) 
{ 
    if (reader.HasRows) // reader has data at this point - verified with debugger 
    { 
     reader.Read(); // loses data at this point if I call Read() 
     template = new TemplateFile 
     { 
      FileName = Convert.ToString(reader["FileName"]) // whether or not I call 
                  // Read, says no data here 
     }; 
    } 
} 
+4

does'reader.Read()'return'true'或'false'?爲什麼不使用'if(reader.Read())'或'while(reader.Read())'? –

+0

也 - 當你說「驗證與調試器」...如何*確切* *? (試圖查看你的測試是否可能破壞了數據) –

+2

爲了確認@Marc的說法,我在過去的一個問題上懸停在可查詢變量上導致調試器獲取結果,這意味着代碼無法'完成,因爲你只能枚舉一次記錄(調試器完成)。這可能是同一件事嗎? (這也可能發生在手錶上嗎?) – Smudge202

回答

9

只是爲了澄清答案,它是使用調試器,因爲擴張的結果視圖調用Read(),因此移過一行。正如Marc Gravell在評論中所說:調試器認爲有害

0

如果要將數據放入文件中,請首先加載DataTable而不是使用DataReader。 隨着DataReader的,正如在評論中提到的,你可能想通過將結果與while循環設置爲重複

while (reader.Read()) 
{ 

} 

循環一次讀取一行並退出時所有的行具有被讀過。 一旦你移動到下一行,前面的行就不再可用,除非你把它們放到其他結構中,比如列表或DataTable。

但是你可以使用DataAdapater來填充DataTable,所以可能沒有理由使用DataReader。然後,您可以從DataTable寫入文件。

無論如何,我不明白這條線是如何工作的。

FileName = Convert.ToString(reader["FileName"]) 

如果您願意,我可以發佈其他代碼。
HTH哈維Sather

相關問題