.NET DataTable 跳過 Load(DataReader) 上的行
我正在嘗試使用以下內容填充 DataTable 以建構 LocalReport:
MySqlCommand cmd = new MySqlCommand(); cmd.Connection = new MySqlConnection(Properties.Settings.Default.dbConnectionString); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT ... LEFT JOIN ... WHERE ..."; /* query snipped */ // prepare data dataTable.Clear(); cn.Open(); // fill datatable dt.Load(cmd.ExecuteReader()); // fill report rds = new ReportDataSource("InvoicesDataSet_InvoiceTable",dt); reportViewerLocal.LocalReport.DataSources.Clear(); reportViewerLocal.LocalReport.DataSources.Add(rds);有一次,我注意到報告不完整,並且缺少一條記錄。我更改了一些條件,以便查詢將準確返回兩行並且…驚喜:報告僅顯示一行而不是兩行。我試圖調試它以找出問題所在,但我陷入了困境
dt.Load(cmd.ExecuteReader());當我注意到
DataReader包含兩條記錄但DataTable僅包含一條時。偶然地,我ORDER BY在查詢中添加了一個子句,並註意到這次報告正確顯示。顯然,DataReader 包含兩行,但 DataTable 僅在 SQL 查詢字元串包含時讀取這兩行
ORDER BY(否則它只讀取最後一行)。誰能解釋為什麼會發生這種情況以及如何解決?編輯: 當我第一次發布問題時,我說它跳過了第一行;後來我意識到它實際上只讀取了最後一行,並且我已經相應地編輯了文本(當時所有記錄都分為兩行,當它實際上只顯示最後一行時,它似乎跳過了第一行)。這可能是由於它沒有唯一標識符來區分 MySQL 返回的行,因此添加
ORDER BY語句會導致它為每行創建唯一標識符。這只是一個理論,我沒有任何證據支持它,但我所有的測試似乎都得出了相同的結果。
我有同樣的問題。我從您的部落格中獲得了提示,並在查詢中添加了 ORDER BY 子句,以便它們可以一起形成查詢返回的所有記錄的唯一鍵。它解決了這個問題。有點怪。
在擺弄了很多之後,我發現該
DataTable.Load方法需要基礎數據中的主鍵列。如果您仔細閱讀文件,這會變得很明顯,儘管沒有很明確地說明。如果您有一個名為“id”的列,它似乎使用它(它為我修復了它)。否則,它似乎只是使用第一列,無論它是否唯一,並在讀取時覆蓋該列中具有相同值的行。如果您沒有名為“id”的列並且您的第一列不是唯一的,我建議在載入數據讀取器之前嘗試顯式設置數據表的主鍵列。