开发者

SqlBulkCopy failing with String conversion issue

开发者 https://www.devze.com 2022-12-13 16:03 出处:网络
I have a view which generates a number of columns which I want to bulk load into another table which has identically named columns.

I have a view which generates a number of columns which I want to bulk load into another table which has identically named columns.

This procedure worked fine when I was looping over the SqlDataReader and doing an insert with SqlParamet开发者_如何学JAVAers using a SqlCommand each time. Obviously for many 100000s of rows, this was too slow.

I switched to using SqlBulkCopy, as it seemed this would work since the views column names and the target db tables column names and types match (since the above procedure worked!).

However, on the first record it fails with an InvalidOperationException saying "The given value of type String cannot be converted to type smalldatetime of the specified target column". There is just one date column in this first row and its value is NULL.

The view is only returning a subset of columns, but the ones it is not are all nullable.

Any help would be appreciated.


sqlbulkcopy does not automatically map between columns with the same name. It assumes that your select will return columns in the same order it sees them in the destination table.

So if there are 7 columns in the destination table and the view returns 5 it will try and put those 5 in the the first 5 columns of the destination table.

The SqlBulkCopy class can take a collection of column mappings. That should do the trick


Why do you nout just use a single sql statement

INSERT INTO YourTable (Col1, Col2,...) SELECT Col1, Col2, .. FROM YourView

If the view has the same columns as the table, you can drop the (Col1, Col2,...) after YourTable and change the statement to

INSERT INTO YourTable SELECT Col1, Col2, .. FROM YourView

But in general it is good form to specify the columns you are inserting into.

You can then also apply a where clause to the select from YourView.


try setting the SET DATEFORMAT to correct format (ymd, dmy, mdy, ...) for your connection and retry. this error usually happens if you have dates in a localized format and not locale independent format.

as for doing it all in one insert this is not recommended because this is considered a long running transaction and not a bulk insert operation.

0

精彩评论

暂无评论...
验证码 换一张
取 消