【初月無料キャンペーン中】gooドクター

はじめまして、okwebsamaです。
さっそく質問なのですが、
質問タイトルのままですが、DataTableに入っているデータを全てinsertしたいのです。
insert先のテーブルは、DataTableと同じ列名をもっています。

コード
DataTable d;
for(int i = 1; i <= d.Rows.Count; i++){
みたいな感じで作っていたんですが、ここから先が思いつきませんでした。
どなたかよろしくお願いします!!

gooドクター

A 回答 (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;
    • good
    • 1
この回答へのお礼

結局SQLのINSERT文で一気にデータを送りました。
長いソースを書いて説明して頂き、今後の参考にしたいと思います。
ありがとうございます。

お礼日時:2007/08/16 18:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング