4
using (var connection = new SqlConnection(...))
{
    string sql = "SELECT * FROM tableA";
    using (var command = new SqlCommand(sql,connection))
    {
        using (var reader = command.ExecuteReader(...))
        {
            //***************Sample Start
            string sql2 = "INSERT into tableB(column1) VALUES('"+reader["column1"]+"')";
            using (var command2 = new SqlCommand(sql2,connection))
            {
                ...
            } 
            //***************Sample End
        }
    }
}

上記のコード スニペットを使用することで、C# で SQL を処理するのがベスト プラクティスであると思います。tableA からレコードのリストを取得した後、tableB に挿入したい行ごとに。

ただし、例外をスローしています

このコマンドに関連付けられた開いている DataReader が既に存在し、最初に閉じる必要があります

この問題は、別のメソッドを作成してそこからテーブルに挿入することで解決できることを知っています。他の方法があるかどうか疑問に思っています。ご意見ありがとうございます。

4

3 に答える 3

4

コメントで述べたように、挿入には別のデータベース接続が必要です。各接続は一度に 1 つのアクティブなステートメントを処理できます。ここには 2 つあり、1 つは 用SELECT、もう 1 つは (一度に) 用INSERTです。

たとえば、これを試してください:

string srcqry = "SELECT * FROM tableA";
using (SqlConnection srccon = new SqlConnection(ConnectionString))
using (SqlCommand srccmd = new SqlCommand(srcqry, srccon))
{
    srccon.Open();
    using (SqlDataReader src = srccmd.ExecuteReader())
    {
        string insqry = "INSERT INTO tableB(column1) VALUES(@v1)";

        // create new connection and command for insert:
        using (SqlConnection inscon = new SqlConnection(ConnectionString))
        using (SqlCommand inscmd = new SqlCommand(insqry, inscon))
        {
            inscmd.Parameters.Add("@v1", System.Data.SqlDbType.NVarChar, 80);
            inscon.Open();

            while (src.Read())
            {
                inscmd.Parameters["@v1"].Value = src["column1"];
                inscmd.ExecuteNonQuery();
            }
        }
    }
}

パラメータを使用すると、SQL インジェクションの脆弱性が解決されます。生のユーザー入力から、またはデータベースから取得しているデータからクエリ文字列を作成するのではなく、常にこれを行う必要があります。必要に応じて、簡単にするヘルパー メソッドをいくつか記述してください。必ず実行してください。

于 2013-09-13T02:51:36.363 に答える
1

悪い例は別として、クエリを単純化して

TableB に挿入 (column1) TableA から column1 を選択

于 2013-09-13T02:24:42.777 に答える