- ベストアンサー
DataTableに入っているデータを全てinsertしたい!(C#)
はじめまして、okwebsamaです。 さっそく質問なのですが、 質問タイトルのままですが、DataTableに入っているデータを全てinsertしたいのです。 insert先のテーブルは、DataTableと同じ列名をもっています。 コード DataTable d; for(int i = 1; i <= d.Rows.Count; i++){ みたいな感じで作っていたんですが、ここから先が思いつきませんでした。 どなたかよろしくお願いします!!
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
確認ですが、 ・使っているデータベースは何ですか? (SQL Server or Oracle or Access or その他?) ・DBの接続方法には、何を使ってますか? (SqlClient? OleDb?) ・コピー元のDataSetは、型付DataSet?型無しDataSet? ・C# + ASP.NET でという話で宜しいでしょうか? (ASP.NETで質問されていますが、質問内容みると、C#という 分類での質問になり、ASP.NETではないような気がします) 少々情報が足りないので、回答が的外れになるかもしれませんが、 どのDB&接続方法にしても、名前空間とクラス名が違うだけで 基本ロジック自体は、ほぼ一緒のため、 下記、型付きDataSetで、SQL Serverの例で、サンプル記載しておきます。 もし、SQL Serverじゃない&型無しDataSetの場合だったり、 どう応用したらいいかわからないという場合は、また質問して下さい。 ############################################################# // コピー元のDataTableを取得 DataTable d = コピー元DataTableを取得; // データベースの接続 //(本来であれば、web.configやapp.configに設定されている接続先を取得する方法が望ましいわけで...) System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB名;Data Source=DBサーバのIPアドレス"); conn.Open(); // コピー元のデータ数分だけループ foreach (DataRow row in d.Rows) { // INSERT用SQLを生成 System.Text.StringBuilder sql = new System.Text.StringBuilder(); sql.Append("INSERT INTO [コピー先のスキーマ].[コピー先テーブル名] "); // INSERT項目 System.Text.StringBuilder insertColumns = new System.Text.StringBuilder(); // INSERT値 System.Text.StringBuilder valueColumns = new System.Text.StringBuilder(); // DataTableの列数分だけループ foreach (DataColumn col in d.Columns) { insertColumns.AppendFormat("{0},", col.ColumnName); // 列の型が文字列型の場合 if (col.DataType == typeof(String)) { valueColumns.AppendFormat("'{0}',", row[col.ColumnName].ToString()); } else { // 列の型が文字列型以外の場合 valueColumns.AppendFormat("{0},", row[col.ColumnName].ToString()); } } // 不要な「,」を削除 insertColumns.Remove(insertColumns.Length - 1, 1); valueColumns.Remove(valueColumns.Length - 1, 1); // INSERT用SQL文の生成 sql.AppendFormat("({0}) VALUES ({1})", insertColumns.ToString(), valueColumns.ToString()); // SQLの実行 System.Data.OleDb.OleDbCommand command; command = new System.Data.OleDb.OleDbCommand(sql.ToString(), conn); command.ExecuteNonQuery(); command.Dispose(); command = null; } // DBの接続を閉じる conn.Close(); conn.Dispose(); conn = null;
お礼
結局SQLのINSERT文で一気にデータを送りました。 長いソースを書いて説明して頂き、今後の参考にしたいと思います。 ありがとうございます。