【问题标题】:Performance Implications of Using a Method in ADO.NET在 ADO.NET 中使用方法的性能影响
【发布时间】:2015-12-22 16:09:19
【问题描述】:

而不是像这样执行查询的传统方式:

protected void btnAdd_Click(object sender, EventArgs e)
{
    SqlConnection connection = new SqlConnection(
        ConfigurationManager.ConnectionStrings["MyCon"].ConnectionString);
    connection.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = connection;
    cmd.CommandText = "INSERT INTO Test VALUES (@FN, @LN, @DateAdded)";
    cmd.Parameters.AddWithValue("@FN", txtFN.Text);
    cmd.Parameters.AddWithValue("@LN", txtLN.Text);
    cmd.Parameters.AddWithValue("@DateAdded", DateTime.Now);
    cmd.ExecuteNonQuery();
    connection.Close();
}

我创建了一个单独的类,允许我通过确定 SQL 语句及其参数(名称和值)重用方法来执行查询:

DB.cs

static SqlConnection connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["MyCon"].ConnectionString);

public static void Execute(string query, SqlParameter[] parameters)
{
    using (connection)
    {
        using (SqlCommand command = new SqlCommand(query, connection))
        {
            foreach (SqlParameter parameter in parameters)
            {
                command.Parameters.Add(parameter);
            }
            connection.Open();
            command.ExecuteNonQuery();
        }
    }
}

这让我可以在这里减少我的编码过程:

protected void btnAdd_Click(object sender, EventArgs e)
{
    string SQL = "INSERT INTO Test VALUES (@FN, @LN, @DateAdded)";
    SqlParameter[] parameters = {
        new SqlParameter("@FN", txtFN.Text),
        new SqlParameter("@LN", txtLN.Text),
        new SqlParameter("@DateAdded", DateTime.Now)
    };

    DB.Execute(SQL, parameters);
}

执行这些操作是否会对性能产生影响?另外,有没有办法改进现有的代码?谢谢!

【问题讨论】:

  • 我看不出这种技术有什么问题,虽然这可能更适合code review,但是,我个人不会费心重用连接对象。您不会从中获得任何好处,并且可能会导致您出现问题,只需将您的配置用于静态连接字符串,并在方法中创建一个新的 SqlConnection 对象,然后由 .NET 连接池处理其余部分。此外,您可以通过使用 command.Parameters.AddRange(parameters); 而不是显式的 foreach 循环来稍微简化代码。
  • @GarethD 感谢 .AddRange 提示。我将为同一个 DB 类中的其他方法重新使用连接对象。这是可取的吗?
  • 忽略我,我没有正确阅读代码。无论如何,静态字段都会为每个方法调用创建一个新的连接对象,所以你已经在做我建议的事情了。

标签: c# sql webforms ado.net


【解决方案1】:

这两种方法之间应该没有性能差异,因为在这两种情况下您都使用参数化查询。由于您直接对SqlCommand 的方法(与IDbCommand 方法相反)进行编程,因此与其他 RDBMS 提供程序的可移植性也没有区别,因为这两种实现都与 SQL Server 相关联。

您可以通过标记第二个参数params 使界面更易于使用,即

public static void Execute(string query, params SqlParameter[] parameters)

这会让你像这样拨打电话:

DB.Execute(
    "INSERT INTO Test VALUES (@FN, @LN, @DateAdded)"
,   new SqlParameter("@FN", txtFN.Text)
,   new SqlParameter("@LN", txtLN.Text)
,   new SqlParameter("@DateAdded", DateTime.Now)
);

【讨论】:

    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 2021-09-05
    • 2010-09-11
    • 2018-07-09
    相关资源
    最近更新 更多