SQL/С# - лучший способ выполнения запроса
Мне нужно выполнить sql-запрос из класса С#. Я подумал о двух вариантах
- Запуск процесса sqlcmd.
- Использование объекта SqlCommand.
Мой вопрос в том, какой будет лучший способ? Очень важно, чтобы в течение короткого времени на сервере было установлено соединение с сервером.
Я открыт для других идей, если выше не очень хорошо.
Спасибо заранее.
Ответы
Ответ 1
Использовать 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);
Ответ 2
От MSDN:
В следующем примере создается SqlConnection, SqlCommand и SqlDataReader. Пример читает данные, записывая их на консоль. Наконец, пример закрывает SqlDataReader, а затем SqlConnection, когда он выходит из блоков использования кода.
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();
}
}
}
Ответ 3
Это зависит. Если вам неважно, что результат запроса, который ищет процесс, который использует 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();
}
Ответ 4
Я думаю, что SqlCommand - явный победитель, потому что вам не нужно подключать другой процесс. Вы можете закрыть соединение с базой данных, как только вы закончите с ней.
А затем вы также можете распространять приложение на машины, у которых нет sqlcmd
.
Ответ 5
Я думаю, что SqlCommand - хорошая идея, но имейте в виду, что этот класс доступен только при подключении к SQL Server. Вам понадобятся другие типы команд/соединений, если вы имеете дело с Oracle или соединение OleDb с какой-либо другой базой данных. Все объекты команд данных наследуют от DbCommand, поэтому я бы это прочитал.