DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Fillで読み込み別ファイルに書き出しする方法

環境/言語:[Winxp VC#2005、SQLServer2005]
分類:[.NET]

こんにちは エツです。 また御教授をお願いします。
xp VC#2005 Express Edition、SQLServer2005 Express Editionの環境です。

SQLServer2005 Express Editionのデータベースファイル Orgnal.mdf から抽出データをFillメソッドで
データセットDs のSyohinテーブルに読み込みます。
読み込んだ内容を別ファイル d20060920.mdf に書き出し、次回からは d20060920.mdf を読み込む事で、
スピードアップを計ろうとしています。d20060920.mdf は Orgnal.mdf と同じでデータが空のファイルです。

データセット内テーブルへの読み込みは出来ていますので書き込みファイルにコネクションを変更して
Updateをしたいのですが上手くできません。
データセット内テーブルへの読み込んだ後何もしないデータを書き出すのはできないのでしょうか?
書き出し部分は次のようにしましたが1行も書き出しはしません。

            Cb = new SqlCommandBuilder(Da);
            Cb.QuotePrefix = "[";
            Cb.QuoteSuffix = "]";
            Da.SelectCommand.Connection = CnW;  //コネクションの変更
            Da.SelectCommand.CommandText = "SELECT * FROM [Syohin]";
            Cb.RefreshSchema();
            Da.InsertCommand = Cb.GetInsertCommand();
            Da.UpdateCommand = Cb.GetUpdateCommand();
            int n = Da.Update(Ds, "Syohin");    //書き出し行数の確認


ExecuteNonQuery() を使った次の方法では書き出しはOKです。
しかしこの方法はINSERT SQL の作成に多くのコードを使っておりスマートでない--->時間の掛かるコード の気がします。
できれば上の方法でしたいのです。

            CmdW.Connection = CnW;
            CnW.Open();
            for (int i = 0; i < Ds.Tables["Syohin"].Rows.Count; i++)
            {
                object [] dt=Ds.Tables["Syohin"].Rows[i].ItemArray;
                string[] data = new string[dt.Length];

                for (int j = 0; j < dt.Length; j++)
                    data[j] = (string)dt[j];
                
                CmdW.CommandText = SQL_INSERT("Syohin", data);
                CmdW.ExecuteNonQuery();
            }
            CnW.Close();



        //INSERT SQL の作成
        private string SQL_INSERT(string tbl, string[] data)
        {
            Scmdtext = new StringBuilder("INSERT INTO [" + tbl + "] VALUES ('");     //各文字列の作成用
            for (int i = 0; i < data.Length - 1; i++)
            {
                Scmdtext.Append(data[i].Replace("'", " ") + "','");
            }
            Scmdtext.Append(data[data.Length - 1].Replace("'", " ") + "')");
            return Scmdtext.ToString();
        }


どうか宜しくお願いします。
Updateメソッドは、DataTableの各行の「状態」RowStateに従って
Insert、Update、Deleteのコマンドを切り替えて発行しているものなので、
未変更とみなされる行は何もされません。
この場合、マネージャとなるUpdateメソッドではなく、内部のInsertCommand
(Da.InsertCommand)を直接実行するのでよろしいかと。
(ループでexecuteNonQuery)
foreach(DataRow drw in Ds.tables["Syohin"].Rows)
{
    /*ここで各パラメータにdrwから代入して、*/
    /*実行*/
    Da.InsertCommand.executeNonQuery();
}
※送る前にデータを消去したり調整をしているのであれば、
.Rowsではなく.Select("","",currentrows)
を使用してください。
■No17644に返信(こど。さんの記事)

こど。さん 回答有難うございます。
Da.InsertCommand.ExecuteNonQuery() メソッドはしりませんでした。
教えて頂いた方法で試しましたところ上手くいきました。
解り易い説明有難うございます。大変助かりました。

CmdW.ExecuteNonQuery();を使った私の下手ソースと比較すると約2倍強の速度アップがありました。
こど。さんの方法だと
for (int i = 0; i < drw.ItemArray.Length; i++)
Da.InsertCommand.Parameters[i].Value = drw.ItemArray[i];
で簡単にパラメータ指定ができるので、コードの少ない分速度アップできます。



コマンドビルダーはお手軽にsql CommandText が作成できますがパフォーマンスが悪くなるので
こど。さん に教えて頂いた方法と上手く組み合わせて使用したいと思います。

またひとつ 速度アップができました。
有難うございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板