SQL / C# – 执行查询的最佳方法
我需要从ac#class中执行一个sql查询。 我想到了两个选择
- 启动sqlcmd的进程。
- 使用SqlCommand对象。
我的问题是哪种方式更好? 重要的是,解决方案只能在短时间内与服务器建立连接。
如果上述情况不好,我会对其他想法持开放态度。
提前致谢。
使用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);
来自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(); } } }
这取决于。 如果您不关心查询的结果,那么使用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类。 所有的数据命令对象都inheritance自DbCommand ,所以我会读到它。