我的问题可能很傻,也可能根本不是问题,但这就是问题所在。
我在ASP.net MVC项目中执行相当多的数据库操作,其中我每次都创建两个对象,即SqlConnection
和SqlCommand
。
我在下面展示了一个例子
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand("sRegisterUser", connection))
{
我的问题是如何每次都减少这些对象的创建?如何全局创建
PS: sRegisterUser是一个存储过程,同样,其他方法使用不同的过程来获取不同的值作为参数。
请帮帮我。
感谢您的帮助。
答案是,不要。您不希望共享这些对象,您正在适当地使用它们
你没有。你要么让对象存活,这很糟糕。或者你按你应该的方式处理它,目前就是这样。
那么,你为什么要用using
呢?
由于using
是处理Windows句柄所必需的。
您也可以这样写,这类似于使用using
:
SqlConnection connection = new SqlConnection(connectionString);
connection.Close();
connection.Dispose();
当上面的代码抛出错误时, using
也会进行处理。使用using
实际上是编写此代码的最短方法。
所以错误保存版本应该是:
SqlConnection connection;
try
{
connection = new SqlConnection(connectionString);
...
connection.Close();
}
finally
{
connection.Dispose();
}
正如其他人已经说过的,你现在所做的没有错。ADO。. NET对象意味着被使用和处理。根据经验,您应该尽可能晚地创建它们,并且尽可能快地处置它们。
话虽如此,我明白你在这里想做什么,我确实有一些你可能感兴趣的想法,可以让你的生活更轻松,同时保持良好的编程实践。
如果你想让代码更简洁,你可以链接using
语句:
using (var cn = new SqlConnection(yourConnectionString))
using (var cmd = new SqlCommand(yourQuery, cn))
{
// do stuff
}
IDE不会尝试缩进第二个块,使您更容易阅读。
你也可以为你的过程创建一个抽象层:
public static class Procedures
{
public static void RegisterUser() // add whatever parameters you need
{
using (var cn = new SqlConnection(yourConnectionString))
using (var cmd = new SqlCommand(yourQuery, cn))
{
// do stuff
}
}
}
从那时起,你可以简单地通过调用
来执行你的过程:Procedures.RegisterUser();
另一种选择是引入工厂模式来获取对象。这本身不会减少它们的数量,但它可能有助于将它们全部设置好(即正确的连接字符串)。
你也可以创造性地将这两种模式结合起来。实现IDisposable
的自定义类可以负责创建必要的ADO对象,打开连接,执行查询,关闭连接,并在对象本身被处置时处置任何需要处置的对象。