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.

29
demandé sur fionaredmond 2012-12-03 08:51:56

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();
38
répondu lumberjack4 2012-12-03 05:11:29

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
}
19
répondu abatishchev 2015-12-30 19:09:30

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

14
répondu Hamed_gibago 2014-04-27 10:01:41

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

10
répondu Mujah Maskey 2017-05-23 12:02:49

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 .

8
répondu Mr Moose 2012-12-03 05:11:48

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();
            }
        }
    }
-1
répondu vlatko606 2017-12-20 09:55:46