Hi everyone
I'm doing some data generation for testing and since I have to create a quite large set of data I'm using the SqlBulkCopy class. I create a DataTable in memory and load it with a batch of data to insert. I then use the SqlBulkCopy.WriteToServer to write the content of the DataTable to the server. The generated data inserted consists of a bigint(long) and an int column (which forms the composite primary key) and a number of columns with all null values. The basic loop code goes like this:
1 |
int startID = 1; |
2 |
int endID = 56700000; |
3 |
int increments = 1000; |
4 |
while (startID < endID && ContinueRunning) |
5 |
{ |
6 |
int newEndID = startID + increments; |
7 |
|
8 |
SqlBulkCopyOptions options = SqlBulkCopyOptions.Default; |
9 |
SqlBulkCopy copy = new SqlBulkCopy(connectionString, options); |
10 |
copy.DestinationTableName = "ScientificSamples"; |
11 |
DataTable table = _Generator.GenerateData(startID, newEndID); |
12 |
table.TableName = "ScientificSamples"; |
13 |
|
14 |
copy.WriteToServer(table); |
15 |
startID = newEndID; |
16 |
} |
17 |
|
Executing this code has some very strange behavior. At some point the WriteToServer throws an exception like:
OLE DB provider 'STREAM' for linked server '(null)' returned invalid data for column '[!BulkInsert].Stddev'.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternal()
at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServer(Int32 columnCount)
at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState)
at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table)
at WFDBDataGenerator.DataInserter.StartInserting(String connectionString, LoggingCallback callback) in C:\projects\SiemensWFDB\src\WFDB\WFDBDataGenerator\DataInserter.cs:line 47
Sometimes it throw after having inserted 1000 or 2000, other times it inserts 13000-14000 entries before breaking. It is not always the same column that is reported in the exception, but it is always one of the columns that has been created with a DBValue.Null in the DataTable.
What really puzzles me here is the seemingly nondeterministic behavior: It's not always the same column, so why can I insert the same data some times but not other times? Why can I sometimes run to 13000 entries but other times break after just 1000 entries inserted?
Any thoughts or ideas would be really appreciated...