質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

9514閲覧

【C#+SQLServer】money型カラムのあるテーブルに、SqlBulkCopyでdecimal型のデータを入れようとすると例外発生

shinuch2891

総合スコア24

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

1クリップ

投稿2016/07/14 13:55

###前提・実現したいこと
・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/ツール等のバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Sqlbulkcopy Error : The given value of type SqlDecimal from the data source cannot be converted to type decimal of the specified

特定の値が含まれているとうまくいかないという情報があります。
Sqlbulkcopy のバグではないでしょうか?

投稿2016/07/14 22:17

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinuch2891

2016/07/15 03:34

ご提示頂いたURLで解決しました! どうやら、money型(SqlDecimal型)に対して .00~ を入れようとするとエラーが起きるようです。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問