54

1つのSQL接続で2〜3個のSQLコマンドを実行する必要があるプロジェクトを作成しています。これが私が書いたコードです:

SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\project.mdf;Integrated Security=True");
con.Open();
SqlCommand cmd = new SqlCommand("select *  from " + mytags.Text + " ", con);
SqlDataReader rd = cmd.ExecuteReader();
if (rd.Read())
{
    con.Close();
    con.Open();
    SqlCommand cmd1 = new SqlCommand("insert into " + mytags.Text + " values ('fname.lname@gmail.com','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','"+mytags.Text+"')", con);
    cmd1.ExecuteNonQuery();
    label.Visible = true;
    label.Text = "Date read and inserted";
}
else
{
    con.Close();
    con.Open();
    SqlCommand cmd2 = new SqlCommand("create table " + mytags.Text + " ( session VARCHAR(MAX) , Price int , Description VARCHAR(MAX), Date VARCHAR(20),tag VARCHAR(10))", con);
    cmd2.ExecuteNonQuery();
    con.Close();
    con.Open();
    SqlCommand cmd3 = new SqlCommand("insert into " + mytags.Text + " values ('" + Session + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + mytags.Text + "')", con);
    cmd3.ExecuteNonQuery();
    label.Visible = true;
    label.Text = "tabel created";
    con.Close();
}

エラーを削除しようとしましたが、接続が他の状態にならないことがわかりました。コードを確認し、間違いやその他の解決策があるかどうかを提案してください。

4

9 に答える 9

52

毎回SqlCommand.CommandText新しいものを作成するのではなく、変更するだけです。SqlCommand接続を閉じて再度開く必要はありません。

// Create the first command and execute
var command = new SqlCommand("<SQL Command>", myConnection);
var reader = command.ExecuteReader();

// Change the SQL Command and execute
command.CommandText = "<New SQL Command>";
command.ExecuteNonQuery();
于 2012-12-03T04:56:49.347 に答える
34

接続文字列でこのプロパティを有効にするだけです。

sqb.MultipleActiveResultSets = true;

このプロパティにより、複数のデータリーダーに対して 1 つの接続を開くことができます。

于 2014-04-27T10:01:41.673 に答える
12

私はテストしていませんが、主なアイデアは次のとおりです。各クエリにセミコロンを付けます。

SqlConnection connection = new SqlConnection();
SqlCommand command = new SqlCommand();
connection.ConnectionString = connectionString; // put your connection string
command.CommandText = @"
     update table
     set somecol = somevalue;
     insert into someTable values(1,'test');";
command.CommandType = CommandType.Text;
command.Connection = connection;

try
{
    connection.Open();
}
finally
{
    command.Dispose();
    connection.Dispose();
}

更新: フォローできます ADO.NET Command.CommandText プロパティに複数の SQL 命令を含めることは可能ですか? それも

于 2012-12-03T05:16:37.707 に答える
10

ちなみに、これはSQLインジェクションを介して攻撃される可能性があります。それを読んで、それに応じてクエリを調整する価値があります。

このためのストアド プロシージャを作成し、動的 ​​SQL が必要な場合 (つまり、不明なテーブル名など) にこれに対する保護を提供できるsp_executesqlのようなものを使用することも検討してください。詳細については、このリンクをご覧ください。

于 2012-12-03T05:11:48.540 に答える