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

时间:2010-09-17 13:06:02

标签: c# sql sql-server-express

我需要在c#类中执行sql查询。我想到了2个选项

  1. 启动sqlcmd的过程。
  2. 使用SqlCommand对象。
  3. 我的问题是哪种方式更好?重要的是,解决方案只能在短时间内与服务器建立连接。

    如果上述情况不好,我会接受其他想法。

    提前致谢。

5 个答案:

答案 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,所以我会读到它。