.NET DataTable skips rows on Load(DataReader)

11,443

Solution 1

I had same issue. I took hint from your blog and put up the ORDER BY clause in the query so that they could form together the unique key for all the records returned by query. It solved the problem. Kinda weird.

Solution 2

After fiddling around quite a bit I found that the DataTable.Load method expects a primary key column in the underlying data. If you read the documentation carefully, this becomes obvious, although it is not stated very explicitly.

If you have a column named "id" it seems to use that (which fixed it for me). Otherwise, it just seems to use the first column, whether it is unique or not, and overwrites rows with the same value in that column as they are being read. If you don't have a column named "id" and your first column isn't unique, I'd suggest trying to explicitly set the primary key column(s) of the datatable before loading the datareader.

Solution 3

Just in case anyone is having a similar problem as canceriens, I was using If DataReader.Read ... instead of If DataReader.HasRows to check existence before calling dt.load(DataReader) Doh!

Solution 4

Don't use

dr.Read()

Because It moves the pointer to the next row. Remove this line hope it will work.

Solution 5

Had the same issue. It is because the primary key on all the rows is the same. It's probably what's being used to key the results, and therefore it's just overwriting the same row over and over again.

Datatables.Load points to the fill method to understand how it works. This page states that it is primary key aware. Since primary keys can only occur once and are used as the keys for the row ...

"The Fill operation then adds the rows to destination DataTable objects in the DataSet, creating the DataTable objects if they do not already exist. When creating DataTable objects, the Fill operation normally creates only column name metadata. However, if the MissingSchemaAction property is set to AddWithKey, appropriate primary keys and constraints are also created." (http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx)

Share:
11,443

Related videos on Youtube

Tom
Author by

Tom

[email protected]

Updated on December 08, 2020

Comments

  • Tom
    Tom over 3 years

    I'm trying to populate a DataTable, to build a LocalReport, using the following:

    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);
    

    At one point I noticed that the report was incomplete and it was missing one record. I've changed a few conditions so that the query would return exactly two rows and... surprise: The report shows only one row instead of two. I've tried to debug it to find where the problem is and I got stuck at

     dt.Load(cmd.ExecuteReader());
    

    When I've noticed that the DataReader contains two records but the DataTable contains only one. By accident, I've added an ORDER BY clause to the query and noticed that this time the report showed correctly.

    Apparently, the DataReader contains two rows but the DataTable only reads both of them if the SQL query string contains an ORDER BY (otherwise it only reads the last one). Can anyone explain why this is happening and how it can be fixed?

    Edit: When I first posted the question, I said it was skipping the first row; later I realized that it actually only read the last row and I've edited the text accordingly (at that time all the records were grouped in two rows and it appeared to skip the first when it actually only showed the last). This may be caused by the fact that it didn't have a unique identifier by which to distinguish between the rows returned by MySQL so adding the ORDER BY statement caused it to create a unique identifier for each row.
    This is just a theory and I have nothing to support it, but all my tests seem to lead to the same result.

    • Dave Markle
      Dave Markle over 15 years
      Mod+1 because I've been programming .NET and ADO.NET every day since the fist betas and I never knew I could just call dt.Load() without a DataAdapter. Sigh.
    • Joel Coehoorn
      Joel Coehoorn over 15 years
      Similar situation here, Dave. I learned about it only about a month ago.
    • usr-local-ΕΨΗΕΛΩΝ
      usr-local-ΕΨΗΕΛΩΝ over 9 years
      Today I have posted a duplicate question (stackoverflow.com/questions/28676382/…) that was eventually solved by wrapping the query. I want to highlight that this only happens on MYSQL. It doesn't happen on SQLSERVER.I think the problem shouldn't be caused by DataTable component but rather could be a bug in Mysql connector. Any thoughts?
  • Tom
    Tom over 15 years
    Yes, I've tried running the queries in a MySQL client. The only difference between them is that one has ORDER BY Invoice.ID and the other one doesn't, they both return two rows in the same order. I'm going to check on SqlDataAdapter now.
  • StingyJack
    StingyJack over 15 years
    Any luck? You dont by chance have a TOP in the Query do you?
  • Tom
    Tom almost 14 years
    Next time, please post that as a comment or in the form of a question. This is not acceptable as an answer on StackOverflow.
  • Bluebaron
    Bluebaron over 12 years
    Might not only affect the primary key. If the primary key is not in the results, it may key another column.
  • Bluebaron
    Bluebaron over 12 years
    I went back to check, just to make sure. Absolutely. The reader returns 5 rows, but the dt.Load only gives you the last row in the reader. Just so y'all know that I wasn't talking out my ass. I think this is the first time someone's actually pin pointed this one. Check please! :)
  • Rhyous
    Rhyous almost 11 years
    I added an ID column to no avail.
  • qnguyen
    qnguyen over 6 years
    He on has 1 point and doesn't have enough point to comment (at least 50)
  • EduBic
    EduBic over 4 years
    Oh man, thank you for this little detail, it solves my issue.