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 ('[email protected]','" + 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();
}
エラーを削除しようとしましたが、接続が他の状態にならないことがわかりました。コードを確認し、間違いやその他の解決策があるかどうかを提案してください。
新しいSqlCommand
を毎回作成する代わりに、SqlCommand.CommandText
を変更するだけです。接続を閉じて再度開く必要はありません。
// 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();
以下が動作するはずです。常に単一の接続を開いたままにして、新しいコマンドを作成して実行するだけです。
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command1 = new SqlCommand(commandText1, connection))
{
}
using (SqlCommand command2 = new SqlCommand(commandText2, connection))
{
}
// etc
}
接続文字列でこのプロパティを有効にします。
sqb.MultipleActiveResultSets = true;
このプロパティは、複数のデータリーダーに対して1つのオープン接続を許可します
(回答済みとしてマークし、回答が正しい場合は投票してください)
私はテストしていませんが、主なアイデアは、各クエリにセミコロンを置くことです。
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命令を含めることは可能ですか? too
ちなみに、これはSQLインジェクションを介して攻撃される可能性があります。それを読んで、それに応じてクエリを調整することは価値があるでしょう。
このためにストアドプロシージャを作成し、 sp_executesql のようなものを使用して、動的SQLが必要な場合(つまり、未知のテーブル名など)にこれを保護することもできます。詳細については、 このリンク をご覧ください。
ここでは、Postgreの例を見つけることができます。このコードは、単一のSQL接続内で複数のsqlコマンド(更新2列)を実行します。
public static class SQLTest
{
public static void NpgsqlCommand()
{
using (NpgsqlConnection connection = new NpgsqlConnection("Server = ; Port = ; User Id = ; " + "Password = ; Database = ;"))
{
NpgsqlCommand command1 = new NpgsqlCommand("update xy set xw = 'a' WHERE aa='bb'", connection);
NpgsqlCommand command2 = new NpgsqlCommand("update xy set xw = 'b' where bb = 'cc'", connection);
command1.Connection.Open();
command1.ExecuteNonQuery();
command2.ExecuteNonQuery();
command2.Connection.Close();
}
}
}