SQL / C # - лучший метод для выполнения запроса - PullRequest
17 голосов
/ 17 сентября 2010

Мне нужно выполнить SQL-запрос из класса C #. Я думал о 2 вариантах

  1. Запуск процесса sqlcmd.
  2. Использование объекта SqlCommand.

Мой вопрос: что было бы лучше? Важно, чтобы решение удерживало соединение с сервером только в течение короткого времени.

Я открыт для других идей, если вышеупомянутое не хорошо.

Заранее спасибо.

Ответы [ 5 ]

29 голосов
/ 17 сентября 2010

Используйте SqlCommand. Этот код будет поддерживать соединение только в течение очень короткого периода времени (до тех пор, пока ваш запрос выполняется):

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);
7 голосов
/ 17 сентября 2010

С MSDN:

В следующем примере создается SqlConnection, SqlCommand и SqlDataReader.Пример читает данные, записывая их в консоль.Наконец, пример закрывает SqlDataReader и затем SqlConnection при выходе из блоков кода 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();
        }
    }
}
4 голосов
/ 17 сентября 2010

Это зависит.Если вас не волнует результат запроса, то процесс, использующий sqlcmd, может быть в порядке.С другой стороны, если вам нужно контролировать результаты, лучше использовать ADO.NET.Чтобы не открывать соединение в течение длительного времени, убедитесь, что вы отключили ADO.NET пул соединений , добавив Pooling=false в строку подключения:

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 голосов
/ 17 сентября 2010

Я думаю, что SqlCommand - хорошая идея, но имейте в виду, что этот класс доступен только при подключении к SQL Server.Вам понадобятся другие типы классов Command / Connection, если вы имеете дело с Oracle, или соединение OleDb с какой-либо другой базой данных.Все объекты команд данных наследуются от DbCommand , так что я бы прочитал об этом.

0 голосов
/ 17 сентября 2010

Я думаю, что SqlCommand явный победитель, потому что вам не нужно подключать другой процесс. Вы можете закрыть соединение с базой данных, как только закончите.

И затем вы также можете распространять приложение на машины, на которых нет sqlcmd.

...