简体   繁体   中英

Strange error when adding row to datatable

I'm hoping you guys can help me figure out why this is happening. I've been tearing my hair out trying to figure this out.

Here's an example directly from my code (with the boring bits cut out)

...(Set up the connection and command, initialize a datatable "dataTable")...

using (SqlDataReader reader = cmd.ExecuteReader())
{
   //Query storage object
   object[] buffer = new object[reader.FieldCount];

   //Set the datatable schema to the schema from the query
   dataTable = reader.GetSchemaTable();


   //Read the query
   while (reader.Read())
   {  
    reader.GetValues(buffer);
    dataTable.Rows.Add(buffer);
   }
}                        

The error is

Input string was not in a correct format.Couldn't store in NumericScale Column. Expected type is Int16.

The specific column data types as returned by the schema are (ordered by column)

  1. System.Data.SqlTypes.SqlInt32
  2. System.Data.SqlTypes.SqlInt32
  3. System.Data.SqlTypes.SqlByte
  4. System.Data.SqlTypes.SqlMoney
  5. System.Data.SqlTypes.SqlString
  6. System.Data.SqlTypes.SqlGuid
  7. System.Data.SqlTypes.SqlDateTime

It would appear that the data that should be in column #5 is actually appearing in column #3. But that is pure speculation.

What I know is that in order to use a dataTable "dynamically" with a query that can continue any number of different types of data the best route is to use GetSchemaTable() to retrieve it.

What I Saw In The Debugger

When I dropped into the debugger I took a look at dataTable's types built from the schema vs. the types returned to the object from reader.GetValues(). They are exactly the same .

It seems like dataTable.Rows.Add(buffer) is adding the columns a few columns off from where it should be. But this shouldn't be possible. Especially with the schema being directly built from the reader. I've played with options such as "CommandBehavior.KeyInfo" within ExecuteReader() and still had the same error occur.

Note: I need to run the query this way to enable the end-user to halt the query mid-read. Please do not suggest I scrap this and use an SqlDataAdapter or DataTable.Load() solution.

I'd really appreciate any help. Thank you!

Method DbDataReader.GetSchemaTable() return metadata table containing column names and types. It is not an empty table that one could expect. For more details see MSDN

I'm sorry but GetSchemaTable retrieves schema for a given table and GetValues retrieves the actual row data . Eg your dataTable will contain columns like column name, column type, etc. (see MSDN reference ) while your buffer will contain the actual data whose representation will differ from what the dataTable contains.

Why don't you just use:

dataTable.Fill();

Why are you manually loading it one row at a time?

Please check what you are inserting into the column row which gas GUID data type. I got the same error and found that while inserting records after reading records from csv file, there were couple of empty spaces in csv file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM