2010-09-17 10 views
17

Ho bisogno di eseguire una query sql da una classe C#. Ho pensato di 2 opzioniSQL/C#: metodo migliore per l'esecuzione di una query

  1. Avvio di un processo di sqlcmd.
  2. Utilizzo di un oggetto SqlCommand.

La mia domanda è quale sarebbe il modo migliore? È importante che la soluzione mantenga una connessione al server solo per un breve periodo.

Sono aperto ad altre idee se quanto sopra non va bene.

Grazie in anticipo.

+0

ci si aspetta un set di record da restituire all'applicazione per l'uso, o si sta solo cercando di eseguire una query e andare avanti? – AndHeCodedIt

+0

Vuoi evitare specificamente il pool di connessioni o stai solo cercando di seguire le best practice? – RedFilter

+0

Ci scusiamo per non essere chiari. Nessuna query è un inserto e il risultato non è necessario. –

risposta

28

Utilizzare un SqlCommand. Questo codice manterrà solo la connessione in vita per un brevissimo periodo di tempo (a patto che la query è performante):

DataTable results = new DataTable(); 

using(SqlConnection conn = new SqlConnection(connString)) 
    using(SqlCommand command = new SqlCommand(query, conn)) 
     using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command)) 
      dataAdapter.Fill(results); 
+0

Dipende se mantiene la connessione attiva per un breve periodo. Se non si presta attenzione, potrebbe mantenere la connessione e persino non una singola connessione, ma molte di esse si aprono per tutta la durata dell'intera applicazione. Vedi la mia risposta per i dettagli. –

+0

Come posso ottenere con quello che sto cercando di fare con il tuo codice: http: // StackOverflow.it/questions/23617661/why-the-sql-command-is-not-executing – SearchForKnowledge

0

penso SqlCommand è un vincitore chiaro perché non c'è bisogno di cablare un diverso processi. Puoi chiudere la connessione al database non appena hai finito.

E quindi è anche possibile distribuire l'applicazione su macchine che non dispongono di sqlcmd disponibile.

3

Dipende. Se non ti interessa il risultato della query, forking un processo che usa sqlcmd potrebbe essere OK. Se invece è necessario controllare i risultati, sarebbe meglio utilizzare ADO.NET. Per evitare di mantenere la connessione aperta per un lungo periodo di tempo assicurarsi di disattivare ADO.NET connection pooling aggiungendo Pooling=false per la stringa di connessione:

using (var conn = new SqlConnection("Data Source=server;Initial Catalog=somedb;User Id=foo;Password=secret;Pooling=false")) 
using (var cmd = conn.CreateCommand()) 
{ 
    conn.Open(); 
    cmd.CommandText = "DELETE FROM foo"; 
    var result = cmd.ExecuteNonQuery(); 
} 
+0

Nitpick: Per quanto ne so, Windows non ha processi di forking. –

7

Da MSDN:

L'esempio seguente crea uno SqlConnection, uno SqlCommand, e un SqlDataReader. L'esempio legge i dati, scrivendoli sulla console. Infine, l'esempio chiude SqlDataReader e quindi SqlConnection quando esce dall'utilizzo dei blocchi di codice.

private static void ReadOrderData(string connectionString) 
{ 
    string queryString = 
     "SELECT OrderID, CustomerID FROM dbo.Orders;"; 
    using (SqlConnection connection = new SqlConnection(
       connectionString)) 
    { 
     SqlCommand command = new SqlCommand(
      queryString, connection); 
     connection.Open(); 
     SqlDataReader reader = command.ExecuteReader(); 
     try 
     { 
      while (reader.Read()) 
      { 
       Console.WriteLine(String.Format("{0}, {1}", 
        reader[0], reader[1])); 
      } 
     } 
     finally 
     { 
      // Always call Close when done reading. 
      reader.Close(); 
     } 
    } 
} 
0

Penso SqlCommand è una buona idea, ma tenete a mente questa classe è disponibile solo durante la connessione a SQL Server. Avrai bisogno di qualche altro tipo di classi di Comando/Connessione se hai a che fare con Oracle, o una connessione OleDb con qualche altro database. Tutti gli oggetti di comando dati ereditano da DbCommand, quindi dovrei leggerlo.

Problemi correlati