C# を使用して asp.net 3.5 で SQL Bulkcopy を使用すると、文字列から日付への変換に問題があります。
大きな CSV ファイルを読みました ( CSV リーダーを使用)。読み取った文字列の 1 つを SQL Server 2008 の Date 列にロードする必要があります。
たとえば、テキスト ファイルに文字列 '2010-12-31' が含まれている場合、SQL Bulkcopy は問題なくそれを Date 列に読み込みます。
ただし、文字列が '20101231' の場合、エラーが発生します:
The given value of type String from the data source cannot be convert to type date of the specified target column
ファイルには 8000 万件のレコードが含まれているため、データテーブルを作成できません....
SqlBulkcopy カラムマッピングなどはすべて問題ありません。また、DateTime に変更しても役に立ちません。
私は試した
SET DATEFORMAT ymd;
しかし、それは役に立ちません。
この形式を受け入れるように SQL Server に指示する方法はありますか? それ以外の場合は、CSV リーダーでカスタム修正を作成しますが、SQL で修正することをお勧めします。
更新 2つの回答に続いて、私はこのようなSQLバルクコピーを使用しています(別の質問でStackoverflowで提案されているように):
CSV リーダー (上記の codeproject のリンクを参照) は文字列値を返します (厳密な型指定ではありません)。CSVreader は System.Data.IDataReader を実装しているので、次のようなことができます。
using (CsvReader reader = new CsvReader(path))
using (SqlBulkCopy bcp = new SqlBulkCopy(CONNECTION_STRING))
{ bcp.DestinationTableName = "SomeTable";
// columnmappings
bcp.WriteToServer(reader); }
iDataReader からのすべてのフィールドは文字列であるため、CSVreader でかなり変更しない限り、C# のアプローチを使用できません。
したがって、私の質問はC#で修正する方法とは関係ありません。それはできますが、それを防ぎたいです。
in sql のようなものを実行すると奇妙です
update set [somedatefield] = '20101231'
バルクコピーでは機能しません。
理由はありますか?
アドバイスありがとう、プルン