- PR -

DataTableの列の追加または削除

1
投稿者投稿内容
michael
会議室デビュー日: 2004/03/12
投稿数: 14
投稿日時: 2004-04-19 17:32
いつもお世話になっています。

現在DataTableの内容をXmlに出力するプログラムを作成中なのですが、
既存のDataTableの特定の列だけを出力するということを実現したいと思っています。
Xmlへの出力は、
(filePath:ファイル出力先(String)、myDataTable:出力データ(DataTable))

Dim myDataSet As New DataSet
myDataSet.Tables.Add(myDataTable)
myDataSet.WriteXml(filePath, XmlWriteMode.WriteSchema)

という具合です。
列のColumnMappingプロパティを"MappingType.Hidden"に設定すると、
データは出力されないのですが、
スキーマ情報には出力されてしまいます。

そこで、特定の列だけを削除または追加を行って、
出力データを作り直そうと思ったのですが、
この削除または追加の方法がわかりません。

ちなみに追加は下記のように試してみましたがエラーになってしまいました。

Dim myDataTable2 As New DataTable
myDataTable2.Columns.Add(myDataTable.Columns(1))

エラーメッセージ:
System.ArgumentException' のハンドルされていない例外が system.data.dll で発生しました。
追加情報 : 列 '***' は既に別のデータ テーブルに属しています。

ご教授よろしくお願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-04-19 22:32
諸農です。

引用:

ちなみに追加は下記のように試してみましたがエラーになってしまいました。

Dim myDataTable2 As New DataTable
myDataTable2.Columns.Add(myDataTable.Columns(1))



これはエラーメッセージが示している通り、追加しようとしたそのカラムは
既に元のテーブルに所属しているからダメだ、という事なんでしょう。

DataTableにはCopy()メソッドがあるので、それを使ってみてはいかがですか?

C#で申し訳ないですが。

コード:
    //NorthwindのOrderテーブル
    DataSet ds = new DataSet("main");
    sqlDataAdapter1.Fill(ds);

    //確認用に表示
    dataGrid1.DataSource = ds;
    dataGrid1.DataMember = ds.Tables[0].TableName;

    //ここでデータテーブルのスキーマとデータをコピー
    DataTable copyTB = ds.Tables[0].Copy();
    //不要なカラムを削除
    //ここでは適当にひとつおきに削除しました。
    for (int i=0;i<3;i++)
    {
        string s = copyTB.Columns[i].ColumnName;
        copyTB.Columns.Remove(s);

        //削除カラムの確認用
        label1.Text += s + ",";
    }
    //確認用に表示
    dataGrid2.DataSource = copyTB;




_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
michael
会議室デビュー日: 2004/03/12
投稿数: 14
投稿日時: 2004-04-20 13:23
早速のご教授ありがとうございます。

頂いたコードをサンプルに作成したところ、
期待通りに動きになりました。

丁寧なサンプルまで頂き、本当にありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)