webentwicklung-frage-antwort-db.com.de

Wie führe ich mehrere SQL-Befehle in einer einzigen SQL-Verbindung aus?

Ich erstelle ein Projekt, in dem ich 2-3 SQL-Befehle in einer einzelnen SQL-Verbindung ausführen muss .. Hier ist der Code, den ich geschrieben habe: 

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

Ich habe versucht, den Fehler zu beheben, und ich habe festgestellt, dass die Verbindung nicht zu einer anderen Bedingung wird. Bitte überprüfen Sie den Code und schlagen Sie vor, wenn ein Fehler oder eine andere Lösung vorliegt.

30
user1831272

Ändern Sie einfach den SqlCommand.CommandText, anstatt jedes Mal eine neue SqlCommand zu erstellen. Es ist nicht erforderlich, die Verbindung zu schließen und erneut zu öffnen.

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

Folgendes sollte funktionieren. Halten Sie die Einzelverbindung immer offen, erstellen Sie einfach neue Befehle und führen Sie sie aus.

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

aktivieren Sie einfach diese Eigenschaft in Ihrer Verbindungszeichenfolge:

sqb.MultipleActiveResultSets = true;

diese Eigenschaft ermöglicht eine offene Verbindung für mehrere Datenlesegeräte

15
Hamed_gibago

Ich habe es nicht getestet, aber die Hauptidee ist: Setzen Sie bei jeder Abfrage ein Semikolon.

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

Update: Sie können folgen Können mehrere SQL-Anweisungen in einer ADO.NET-Eigenschaft Command.CommandText vorhanden sein? auch

10
Mujah Maskey

Dies wird wahrscheinlich per SQL-Injection angegriffen. Es lohnt sich, das nachzulesen und Ihre Fragen entsprechend anzupassen. 

Sehen Sie sich vielleicht sogar eine gespeicherte Prozedur an und verwenden Sie etwas wie sp_executesql , das einen gewissen Schutz bietet, wenn dynamisches SQL erforderlich ist (dh unbekannte Tabellennamen usw.). Weitere Informationen finden Sie unter diesem Link .

8
Mr Moose

Hier finden Sie ein Postgre-Beispiel. Dieser Code führt mehrere SQL-Befehle (Update 2-Spalten) innerhalb einer einzelnen SQL-Verbindung aus

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