2010-09-17 9 views
17

Potrzebuję wykonać kwerendę sql z klasy C#. Myślałem o 2 opcjachSQL/C# - Najlepsza metoda wykonywania zapytania

  1. Rozpoczęcie procesu sqlcmd.
  2. Używanie obiektu SqlCommand.

Moje pytanie brzmi, który byłby lepszy sposób? Ważne jest, aby rozwiązanie utrzymywało połączenie z serwerem przez krótki czas.

Jestem otwarty na inne pomysły, jeśli powyższe nie są dobre.

Z góry dziękuję.

+0

Czy spodziewasz się, że zestaw rekordów zostanie zwrócony do Twojej aplikacji do użycia lub czy po prostu chcesz uruchomić zapytanie i przejść dalej? – AndHeCodedIt

+0

Czy chcesz w szczególności unikać łączenia połączeń lub czy próbujesz postępować zgodnie ze sprawdzonymi metodami? – RedFilter

+0

Przepraszam za brak jasności. Żadne zapytanie nie jest wstawką, a wynik nie jest potrzebny. –

Odpowiedz

28

Użyj polecenia SqlCommand. Kod ten będzie utrzymywać tylko połączenia żyje na bardzo krótki okres czasu (o ile zapytanie jest wydajnych):

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

To zależy od tego, czy utrzyma połączenie przy życiu przez krótki czas. Jeśli nie będziesz ostrożny, może zachować połączenie, a nawet jedno połączenie, ale wiele z nich będzie otwarte przez cały czas trwania całej aplikacji. Zobacz moją odpowiedź dla szczegółów. –

+0

Jak osiągnąć to, co próbuję wykonać za pomocą kodu: http: // stackoverflow.com/questions/23617661/why-the-sql-command-is-not-executing – SearchForKnowledge

0

myślę SqlCommand jest wyraźnym zwycięzcą, ponieważ nie trzeba podłączać się inna proces. Możesz zamknąć połączenie z bazą danych, gdy tylko skończysz.

A następnie można również rozpowszechniać aplikację na komputerach, które nie są dostępne pod numerem sqlcmd.

3

To zależy. Jeśli nie dbasz o wynik zapytania, rozwidlenie procesu, który używa sqlcmd, może być w porządku. Jeśli z drugiej strony musisz kontrolować wyniki, lepiej byłoby użyć ADO.NET. Aby uniknąć zachowując połączenie otwarte przez dłuższy czas upewnij się wyłączyć ADO.NET connection pooling dodając Pooling=false do ciągu połączenia:

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: Zgodnie z moją wiedzą system Windows nie obsługuje rozwiązywania procesów. –

7

Od MSDN:

Poniższy przykład tworzy SqlConnection, SqlCommand, a SqlDataReader. Przykład czyta dane, zapisując je na konsoli. Na koniec przykład zamyka SqlDataReader, a następnie SqlConnection, gdy wychodzi z bloków kodu Using.

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

myślę SqlCommand jest dobrym pomysłem, ale należy pamiętać, klasa ta jest dostępna tylko po podłączeniu do serwera SQL. Będziesz potrzebował innego typu klas Command/Connection, jeśli masz do czynienia z Oracle lub połączenia OleDb z inną bazą danych. Wszystkie obiekty poleceń danych dziedziczą po DbCommand, więc przeczytałem o tym.

Powiązane problemy