ejemplo desde datos crear consultar conexiones conexion conectar con clase cerrar abrir c# sql-server ado.net sqlconnection sqlcommand

desde - ejemplo conexion sql c#



¿Cómo ejecutar varios comandos SQL en una sola conexión SQL? (6)

Estoy creando un proyecto en el que necesito ejecutar 2-3 comandos 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 (''[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(); }

He intentado eliminar el error y obtuve que la conexión no iba a otra condición. Revise el código y sugiera si hay algún error o alguna otra solución para esto.


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


Esto es probable que sea atacado a través de inyección de SQL por cierto. Valdría la pena leerlo y ajustar sus consultas en consecuencia.

Tal vez considere incluso crear un proceso almacenado para esto y usar algo como sp_executesql que pueda proporcionar cierta protección contra esto cuando un SQL dinámico es un requisito (es decir, nombres de tablas desconocidos, etc.). Para más información, echa un vistazo a este enlace .


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 }


No lo he probado, pero la idea principal es: poner un 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 varias instrucciones SQL en una propiedad ADO.NET Command.CommandText? también


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

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


simplemente habilita esta propiedad en tu cadena de conexión:

sqb.MultipleActiveResultSets = true;

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