.NET DataTable在Load(DataReader)上跳過行


Answers

問題是幾年,但我沒有找到一個體面的答案,除了上述的解決方法。

經過相當多的調整之後,我發現DataTable.Load方法需要基礎數據中的主鍵列。 如果你仔細閱讀文檔,這是顯而易見的,雖然沒有明確說明。

如果你有一個名為“id”的列,它似乎使用(它已經修復了我)。 否則,它似乎只使用第一列,不管它是否是唯一的,並且覆蓋與讀取列中相同值的行。 如果你沒有名為“id”的列,並且你的第一列不是唯一的,那麼我建議在加載數據庫之前嘗試顯式地設置數據表的主鍵列。

Question

我想填充一個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包含兩行,但如果SQL查詢字符串包含一個ORDER BY (否則它只讀取最後一個),DataTable將只讀取它們兩個。 任何人都可以解釋為什麼發生這種情況,以及如何解決?

編輯:當我第一次發布的問題,我說這是跳過第一行; 後來我意識到,它實際上只讀了最後一行,我相應地編輯了文本(當時所有的記錄都分成兩行,當它只顯示最後一行時,它似乎跳過第一行)。 這可能是由於它沒有一個唯一的標識符來區分MySQL返回的行,所以添加ORDER BY語句導致它為每一行創建一個唯一的標識符。
這只是一個理論,我沒有任何支持,但我所有的測試似乎導致相同的結果。




以防萬一任何人有類似的問題作為canceriens,我使用如果DataReader.Read ...而不是如果DataReader.HasRows調用dt.load(DataReader)之前檢查存在!




你有沒有嘗試在dt.Load(cmd.ExecuteReader())調用之後調用dt.AcceptChanges()來查看是否有幫助?




不知道為什麼你錯過了數據表中的行,是否有可能需要關閉閱讀器? 在任何情況下,這裡是我通常如何加載報告,它每次工作...

        Dim deals As New DealsProvider()
        Dim adapter As New ReportingDataTableAdapters.ReportDealsAdapter
        Dim report As ReportingData.ReportDealsDataTable = deals.GetActiveDealsReport()
        rptReports.LocalReport.DataSources.Add(New ReportDataSource("ActiveDeals_Data", report))

好奇,看看它是否仍然發生。




我有同樣的問題..根本不使用dataReader.Read()..它將需要指針到下一行。 而是直接使用datatable.load(dataReader)。




今天遇到這個問題。

在這個線程沒有任何修復它不幸的是,但是,然後我包裝我的SQL查詢在另一個SELECT語句,它的工作!

例如:

SELECT * FROM (
    SELECT ..... < YOUR NORMAL SQL STATEMENT HERE />
) allrecords

奇怪....