我需要在C#类内执行一条SQL查询语句,我想到了两个选项:
- 启动sqlcmd进程。
- 使用SqlCommand对象。
我的问题是哪种方法更好?重要的是解决方案只能短时间保持与服务器的连接。
如果上述方法不好,我也可以接受其他建议。
谢谢您提前的帮助。
我需要在C#类内执行一条SQL查询语句,我想到了两个选项:
我的问题是哪种方法更好?重要的是解决方案只能短时间保持与服务器的连接。
如果上述方法不好,我也可以接受其他建议。
谢谢您提前的帮助。
使用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);
using System.Data.SqlClient
...
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]));
}
}
catch (SqlException e)
{
Console.WriteLine(e.StackTrace);
Console.WriteLine(e.Message);
}
finally
{
// Always call Close when done reading.
reader.Close();
}
}
}
这要看情况。如果您不关心查询结果,那么使用sqlcmd可能是可以的。但是,如果您需要控制结果,最好使用ADO.NET。为了避免长时间保持连接,确保在连接字符串中添加Pooling=false
来禁用ADO.NET连接池:
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();
}
我认为SqlCommand是一个明显的赢家,因为您不需要连接不同的进程。完成后,您可以立即关闭数据库连接。
然后,您还可以将应用程序分发到没有可用“sqlcmd”的机器上。
我认为SqlCommand是一个不错的选择,但请记住,这个类只适用于连接SQL Server。如果你要处理Oracle或其他数据库的OleDb连接,你需要其他类型的Command/Connection类。所有数据命令对象都继承自DbCommand,所以我建议你先了解一下它。