2010-09-17 1 views
17

Ich muss eine SQL-Abfrage innerhalb einer C# -Klasse ausführen. Ich habe an 2 Optionen gedachtSQL/C# - Die beste Methode zum Ausführen einer Abfrage

  1. Starten eines Prozesses von sqlcmd.
  2. Verwenden eines SqlCommand-Objekts.

Meine Frage ist, welche wäre der bessere Weg? Es ist wichtig, dass die Lösung nur für kurze Zeit eine Verbindung zum Server hält.

Ich bin offen für andere Ideen, wenn die oben genannten nicht gut sind.

Vielen Dank im Voraus.

+0

erwarten Sie, dass ein Datensatz an Ihre Anwendung zurückgegeben wird, oder versuchen Sie nur, eine Abfrage auszuführen und weiterzugehen? – AndHeCodedIt

+0

Möchten Sie das Verbindungs-Pooling speziell vermeiden oder versuchen Sie nur Best Practices zu befolgen? – RedFilter

+0

Entschuldigung, dass ich nicht klar bin. Nein, die Abfrage ist eine Einfügung und das Ergebnis wird nicht benötigt. –

Antwort

28

Verwenden Sie einen SqlCommand. Dieser Code wird nur halten die Verbindung am Leben für eine sehr kurze Zeit (solange Ihre Anfrage performant ist):

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

Es kommt darauf an, ob es die Verbindung für kurze Zeit am Leben erhält. Wenn Sie nicht aufpassen, kann es die Verbindung und sogar nicht eine einzelne Verbindung halten, aber viele von ihnen öffnen sich während der Lebensdauer der gesamten Anwendung. Siehe meine Antwort für Details. –

+0

Wie kann ich erreichen, was ich mit Ihrem Code zu tun versuche: http: // stackoverflow.com/questions/23617661/why-the-sql-command-is-not-executing – SearchForKnowledge

0

Ich denke, SqlCommand ein klarer Sieger ist, weil Sie brauchen, um einen anderen nicht verdrahten verarbeiten. Sie können die Datenbankverbindung schließen, sobald Sie damit fertig sind.

Und dann können Sie auch die Anwendung auf Maschinen verteilen, die sqlcmd nicht verfügbar haben.

3

Kommt drauf an. Wenn Sie sich nicht um das Ergebnis der Abfrage interessieren, kann ein Prozess, der sqlcmd verwendet, OK sein. Wenn Sie andererseits die Ergebnisse kontrollieren müssen, ist es besser, ADO.NET zu verwenden. Halten Sie die Verbindung offen für eine lange Zeit zu vermeiden, stellen Sie sicher, deaktivieren ADO.NET connection pooling von Pooling=false zu Verbindungszeichenfolge hinzu:

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: Nach meinem besten Wissen hat Windows keinen Prozess Forking. –

7

Von MSDN:

Das folgende Beispiel erzeugt eine SqlConnection, ein SqlCommand, und ein SqlDataReader. Das Beispiel liest die Daten durch und schreibt sie in die Konsole. Schließlich schließt das Beispiel den SqlDataReader und dann die SqlConnection, wenn die Anwendung die Codeblöcke verlässt.

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

Ich denke, SqlCommand eine gute Idee ist, aber halten diese Klasse im Auge ist nur verfügbar, wenn auf SQL Server zu verbinden. Sie benötigen eine andere Art von Befehls-/Verbindungsklassen, wenn Sie mit Oracle arbeiten, oder eine OleDb-Verbindung zu einer anderen Datenbank. Alle Datenkommandoobjekte erben von DbCommand, also würde ich das nachlesen.

Verwandte Themen