###前提・実現したいこと
・OS:Windows Server 2008 R2
・アプリケーションサーバ:IIS7.5
・言語:C#.NET
・.NET Framework:4.5.1
・DBサーバ:SQL Server 2008 R2
###発生している問題・エラーメッセージ
テーブル名
と同じ型(DB:money型 → C#:decimal型)で定義した entity
というクラスをリフレクションを使ってDataTable化、 SqlBulkCopy
を使って一括でデータを投入しようとすると、下記の例外が発生する。
データソースから与えられた SqlDecimal 型の値を、指定された列の型 decimal に変換できません。
###該当のソースコード
// テーブル投入用のDataTableを準備 var dt = new DataTable("テーブル名"); List<PropertyInfo> properties = new List<PropertyInfo>(); properties.AddRange(typeof(entity).GetProperty("PublicProperty")); properties.ForEach(p => dt.Columns.Add(p.Name, p.PropertyType)); foreach (var item in entities) { var row = dt.NewRow(); properties.ForEach(p => row[p.Name] = p.GetValue(typeof(entity), null)); dt.Rows.Add(row); } // 別のところで定義済 // SqlConnection c = page.DbConnection as SqlConnection; // SqlTransaction t = page.Transaction as SqlTransaction; if (c != null && t != null) { // コネクション・トランザクションがあれば、それを使用してBulk Insert using (SqlBulkCopy bulkCopy = new SqlBulkCopy(c, SqlBulkCopyOptions.KeepIdentity, t)) { // *** bulkCopy.BulkCopyTimeout = 120; bulkCopy.DestinationTableName = dt.TableName; bulkCopy.WriteToServer(dt); // 例外発生 「データソースから与えられた SqlDecimal 型の値を、指定された列の型 decimal に変換できません。」 } }
###試したこと
・ //***
の所に下記のコードを追加したが、変わらず例外が発生する。
foreach (DataColumn col in table.Columns) { bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(col.ColumnName, col.ColumnName)); }
・このプログラムとは別に、リフレクションを使用せず dtAccessLog.Columns.Add
を一行一行定義するように組んだ時は問題なく動いたが、その時は decimal
を使用していない。
・引っかかっているデータは 80000.00
、テーブルの当該カラムはmoney型。
###補足情報(言語/FW/ツール等のバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/15 03:34