2

初学者:

嗨伙计们 - 寻找一些帮助,看看我应该如何打开和关闭数据库连接。

我要解决的问题:我有一组需要在数据访问层执行的存储过程。

我的服务调用 DA 方法 Get(Request req) 为:

public Data Get(Request request)
    {
        var data = new Data();

        data = GetData();
        data.AppleData = GetGrapeData();
        data.OrangeData = GetGrapeData();
        data.GrapeData = GetGrapeData();

        return data;
    }

其中所有 getmethods getdata、getgrapedata 等都是 Data 访问类中的私有方法,并且在每个方法中调用不同的 SP。

现在在每种方法中,我打开和关闭数据库连接为:

{  try{   
  using (var connection = new SqlConnection(connectionString)
  using (var command = connection.CreateCommand())
   {
      connection.open();
      ExecuteSP();
      connection.Close();
   }
   }catch()
     {
     }
}

现在有什么办法可以做到这一点,所以我必须打开/关闭连接一次?我正在尝试在每个私有方法中捕获。那样行吗?我在上面做的方式有什么问题吗?

4

3 回答 3

1

使用 SQL Server,您不想让连接保持打开的时间超过您需要的时间。系统的其他部分或另一个系统可以等待它们。

其次是 ORM——无论是 EF 还是 NHibernate 都比大多数程序员做得更好。

于 2013-11-08T22:05:02.563 回答
1

是的,您只需打开一次连接。您可以使用一个类或其他东西来管理它,但对于一个简单的场景来说,这对我来说似乎有点过头了。

public Data Get(Request request)
{
    using (var connection = new SqlConnection(connectionString))
    {
        try
        {
            connection.open();

            var data = new Data();

            data = GetData(connection);
            data.AppleData = GetGrapeData(connection);
            data.OrangeData = GetGrapeData(connection);
            data.GrapeData = GetGrapeData(connection);

            return data;
        }
        finally
        {
            connection.close()
        }

    }
}

然后在调用存储过程的方法中:

private Date GetDate(SqlConnection connection)
{
    using (var command = connection.CreateCommand())
    {
        return ExecuteSP();
    }
}

你可以把异常处理放在你想要的任何地方,但是如果你不打算对异常做任何事情,那么你绝对不应该捕获它。

于 2013-11-08T22:30:33.833 回答
0

因此,为了支持我在上面评论中提到的示例,您可以执行以下操作:

// This is your main class.
namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
       public Form1()
       {
          InitializeComponent();
       }

       private void SomeMethod(object sender, EventArgs e)
       {
          ConnectToSql connToSql = new ConnectToSql(); // Instantiate the new class here.
          connToSql.SqlConnection();  // Use the new class
       }
   }   
}

// This is the class that manages your SqlCommand and connection objects
namespace WindowsFormsApplication1
{
   class ConnectToSql
   {
      public void SqlConnection()
      {
         try
         {
            string strConn = "Some connection string here.";
            string strCmd = "Some Sql query string here.";

            // Create your connection object.
            using (SqlConnection sqlConn = new SqlConnection(strConn))
            {
                // Create your command object and pass it the connection.
                using (SqlCommand sqlCommand = new SqlCommand(strCmd, sqlConn))
                {
                    sqlConn.Open();
                    // Do some work here.
                    sqlConn.Close();
                }
            }
         }

         catch (SqlException sqlExc)
         {
            throw;
         }

         catch (Exception exc)
         {
            throw;
         }
     }
}

这里有几点需要注意:

  • 这不是最好的方法。正如评论中提到的,ORM 可能更合适。
  • 每次需要打开连接时,都需要使用新类,因此最好在类的顶层实例化它。
  • using关键字将为您管理您的连接和命令对象,因为它们都实现了IDisposable.
于 2013-11-08T22:05:22.500 回答