Comment exécuter plusieurs commandes SQL dans une seule connexion SQL?
je crée un projet dans lequel je dois exécuter 2-3 commandes sql dans une seule connexion sql. Voici le code que j'ai écrit:
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();
}
j'ai essayé de supprimer l'erreur et j'ai obtenu que la connexion ne va pas d'autre condition. Veuillez revoir le code et suggérer s'il y a une erreur ou toute autre solution pour cela.
6 réponses
il suffit de changer le SqlCommand.CommandText
au lieu de créer un nouveau SqlCommand
à chaque fois. Il n'est pas nécessaire de fermer et de rouvrir la connexion.
// 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();
ce qui suit devrait fonctionner. Gardez la connexion unique ouverte tout le temps, et créez simplement de nouvelles commandes et exécutez-les.
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command1 = new SqlCommand(commandText1, connection))
{
}
using (SqlCommand command2 = new SqlCommand(commandText2, connection))
{
}
// etc
}
il suffit d'activer cette propriété dans votre chaîne de connexion:
sqb.MultipleActiveResultSets = true;
cette propriété permet une connexion ouverte pour plusieurs datareaders
Je n'ai pas testé , mais ce que l'idée principale est: mettre point-virgule sur chaque requête.
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();
}
mise à Jour: vous pouvez suivre est - il possible d'avoir plusieurs instructions SQL dans un ADO.NET commandement.Propriété CommandText? trop
cela risque d'être attaqué par injection SQL soit dit en passant. Il vaudrait la peine de lire sur cela et d'ajuster vos requêtes en conséquence.
peut-être même regarder la création d'un proc stocké pour cela et en utilisant quelque chose comme sp_executesql qui peut fournir une certaine protection contre cela quand SQL dynamique est une exigence (i.e.. noms de table inconnus, etc.). Pour plus d'informations, consultez ce lien .
ici vous pouvez trouver L'exemple de Postgre, ce code exécute plusieurs commandes sql (mettre à jour 2 colonnes) dans une seule connexion SQL
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();
}
}
}