我需要在c#类中执行sql查询。我想到了2个选项
我的问题是哪种方式更好?重要的是,解决方案只能在短时间内与服务器建立连接。
如果上述情况不好,我会接受其他想法。
提前致谢。
答案 0 :(得分:29)
使用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);
答案 1 :(得分:7)
来自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();
}
}
}
答案 2 :(得分:4)
这取决于。如果您不关心查询的结果,那么使用sqlcmd的进程可能没问题。另一方面,如果您需要控制结果,最好使用ADO.NET。为避免长时间保持连接状态,请确保通过在连接字符串中添加 Pooling=false
来停用ADO.NET connection pooling:
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();
}
答案 3 :(得分:0)
我认为SqlCommand是一个明显的赢家,因为您不需要连接不同的进程。您可以在完成后立即关闭数据库连接。
然后,您还可以将应用程序分发给没有sqlcmd
可用的计算机。
答案 4 :(得分:0)
我认为SqlCommand是一个好主意,但请记住,此类仅在连接到SQL Server时可用。如果您正在处理Oracle,或者与其他数据库的OleDb连接,则需要一些其他类型的Command / Connection类。所有数据命令对象都继承自DbCommand,所以我会读到它。