【发布时间】: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 类中的其他方法重新使用连接对象。这是可取的吗?
-
忽略我,我没有正确阅读代码。无论如何,静态字段都会为每个方法调用创建一个新的连接对象,所以你已经在做我建议的事情了。