2012-12-03 17 views
25

Sto creando un progetto in cui ho bisogno di eseguire 2-3 comandi sql in una singola connessione sql. Qui è il codice che ho scritto:Come eseguire più comandi SQL in una singola connessione SQL?

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

Ho provato a rimuovere l'errore e ho ottenuto che la connessione non è andare a condizione else. Si prega di rivedere il codice e suggerire se c'è qualche errore o qualsiasi altra soluzione per questo.

+0

cosa succede se si dispone già di una tabella con lo stesso nome ma non ci sono dati in esso? Hai anche considerato cosa succede se qualcuno digita SQL in una delle tue caselle di testo che stai inserendo? – Greg

risposta

35

Basta cambiare il SqlCommand.CommandText invece di creare un nuovo SqlCommand ogni volta. Non è necessario chiudere e riaprire la connessione.

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

Ho aggiornato il codice: – user1831272

+0

var cmd = new SqlCommand ("seleziona * da" + mytags.Text + "", con); var rd = cmd.ExecuteReader(); if (rd.Read()) { cmd.CommandText = "inserisci in" + mytags.Text + "valori ('[email protected]', '" + TextBox3.Text + "', '" + TextBox4.Text + "','" + TextBox5.Text + "','" + mytags.Text + "')"; cmd.ExecuteNonQuery(); – user1831272

+0

continua a non funzionare – user1831272

17

Quanto segue dovrebbe funzionare. Mantieni aperta la singola connessione per tutto il tempo, e crea solo nuovi comandi ed eseguili.

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

il mio primo comando è creare una tabella temporanea. il mio prossimo comando deve usare quella tabella temporanea. nel tuo esempio, il tavolo Temp scompare. quando ho fatto una traccia, la traccia mi ha mostrato "exec CreateTableSproc". come otterrei la tabella temporanea per essere vista dal prossimo comando? –

7

Questo è probabile che venga attaccato tramite l'iniezione SQL a proposito. Vale la pena di leggerlo e di adattare di conseguenza le tue domande.

Forse guardate anche a creare un proc memorizzato per questo e usando qualcosa come sp_executesql che può fornire una certa protezione contro questo quando sql dinamico è un requisito (per esempio nomi di tabelle sconosciute ecc.). Per maggiori informazioni, controlla this link.

7

Non ho provato, ma qual è l'idea principale: mettere il punto e virgola su ogni query.

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

Aggiornamento: è possibile seguire Is it possible to have multiple SQL instructions in a ADO.NET Command.CommandText property? troppo

+0

Funziona ... Saluti! –

11

basta abilitare questa proprietà nella stringa di connessione:

sqb.MultipleActiveResultSets = true;

questo propperty alows una connessione aperta per più DataReaders

+1

Questa credo dovrebbe essere la risposta. – GibralterTop

+1

E se prevedi di abilitare MARS assicurati di leggere le "considerazioni speciali" qui: https://msdn.microsoft.it/it/us/library/h32h3abf (v = vs.110) .aspx –

+0

Ho trovato la mia risposta.e ho risposto sopra –

0

Qui puoi trovare gli Postgre esempio, questo codice eseguire più comandi SQL (aggiornamento 2 colonne) all'interno di singola connessione 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(); 
      } 
     } 
    } 
+0

Si prega di modificare per spiegare cosa questo codice raggiunge. –