SQL / C# – 执行查询的最佳方法

我需要从ac#class中执行一个sql查询。 我想到了两个选择

  1. 启动sqlcmd的进程。
  2. 使用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 ,所以我会读到它。