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