¿Cómo ejecutar múltiples comandos SQL en una sola conexión SQL?

Estoy creando un proyecto en el que necesito ejecutar comandos de 2-3 sql en una sola conexión sql. Aquí está el código que he escrito:

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(); } 

Intenté eliminar el error y me di cuenta de que la conexión no iba a condicionar otra cosa. Revise el código y sugiera si hay algún error o alguna otra solución para esto.

Simplemente cambie SqlCommand.CommandText lugar de crear un nuevo SqlCommand todo el tiempo. No es necesario cerrar y volver a abrir la conexión.

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

Lo siguiente debería funcionar Mantenga la conexión única abierta todo el tiempo, y simplemente cree nuevos comandos y ejecútelos.

 using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); using (SqlCommand command1 = new SqlCommand(commandText1, connection)) { } using (SqlCommand command2 = new SqlCommand(commandText2, connection)) { } // etc } 

solo habilite esta propiedad en su cadena de conexión:

sqb.MultipleActiveResultSets = true;

esta propiedad permite una conexión abierta para múltiples lectores de datos

No he probado, pero cuál es la idea principal: poner punto y coma en cada consulta.

 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(); } 

Actualización: puede seguir ¿Es posible tener múltiples instrucciones SQL en una propiedad Command.CommandText de ADO.NET? también

Es probable que esto sea atacado mediante la inyección de SQL. Valdría la pena leer sobre eso y ajustar sus consultas en consecuencia.

Tal vez considere incluso la creación de un procedimiento almacenado para esto y el uso de algo como sp_executesql, que puede proporcionar cierta protección contra esto cuando se requiere un sql dynamic (es decir, nombres de tabla desconocidos, etc.). Para obtener más información, consulte este enlace .

Aquí puede encontrar el ejemplo de Postgre, este código ejecuta múltiples comandos sql (actualizar 2 columnas) dentro de una única conexión 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(); } } }