簡體   English   中英

何時/何時使用connection.close()

[英]Where / when to use connection.close()

任何人都可以幫我解決連接問題。打開()和關閉()。 我不確定何時關閉並打開連接。 下面添加了給我一個錯誤的代碼。

如果有人能給我一個關於此的提示,我將不勝感激。 請隨時編輯我的代碼,顯示關閉連接的位置,以便我從中學習。

我還是個學生。 謝謝。 =)

public class LoanDAL
{
string connString = ConfigurationManager.ConnectionStrings["Oakhorizons"].ToString();
public LoanDAL()
{
    //
    // TODO: Add constructor logic here
    //
}
public DataTable getAllLoanInfoDT()
{
        using (SqlConnection conn = new SqlConnection(connString))
        {
            SqlCommand cmd2 = new SqlCommand();
            cmd2.Connection = conn;
            // cmd.CommandType = CommandType.StoredProcedure;
            cmd2.CommandText = "SELECT DISTINCT loanUpdateDate FROM LoanPortfolio WHERE (custID LIKE 'OH00002') AND (loanType LIKE 'Personal Loan')";
            cmd2.Parameters.AddWithValue("@custID", "OH00002");
            cmd2.Parameters.AddWithValue("@loanType", "Personal Loan");
            conn.Open();
            DateTime loanUpdateDate = DateTime.Now;
            SqlDataReader myReader = cmd2.ExecuteReader();
            while (myReader.Read())
            {
                loanUpdateDate = Convert.ToDateTime(myReader[0]); 
                break; 
            }

            DateTime currDateTime = DateTime.Now;

            int loanToBeAdded = (((currDateTime.Year - loanUpdateDate.Year) * 12) + currDateTime.Month - loanUpdateDate.Month) * 500;
            if (loanToBeAdded > 0)
            {
                String sql = "UPDATE LoanPortfolio SET loanPaid = loanPaid + " + loanToBeAdded.ToString() + ", LastUpdatedLoanPaidDate = " + DateTime.Now.ToString();
                sql += " WHERE (loanType LIKE 'Personal Loan') AND (custID LIKE 'OH00002')";
                cmd2.Connection = conn;
                cmd2.CommandText = sql;
                cmd2.ExecuteNonQuery();

            }
            conn.Close();
            using (SqlDataAdapter dAd = new SqlDataAdapter("SELECT * FROM LoanPortfolio where custID like 'OH00002'", conn))
            {
                DataTable dTable = new DataTable();
                dAd.Fill(dTable);
                return dTable;
            }

        }

}

//Returning a DataSet which contains all the information in the Player Table
public DataSet getAllLoanInfoDS()
{
    using (SqlConnection conn = new SqlConnection(connString))
    {

        using (SqlDataAdapter dAd = new SqlDataAdapter("SELECT * FROM LoanPortfolio where custID like 'OH00002", conn))
        {
            DataSet myDS = new DataSet();
            dAd.Fill(myDS);
            return myDS;
        }



    }
}
}

您沒有顯式關閉連接,因為您正在使用帶有sqlconnection對象的{}塊。 連接將自動關閉。

第二,如果要顯式關閉連接,則在完成所有數據庫操作后關閉它。

例如,當適配器填充操作完成時關閉它。

....
....
....
using (SqlDataAdapter dAd = new SqlDataAdapter("SELECT * FROM LoanPortfolio where custID like 'OH00002'", conn))
                {
                    DataTable dTable = new DataTable();
                    dAd.Fill(dTable);
                    conn.Close();
                    return dTable;
                }

這個部分:

conn.Close();
using (SqlDataAdapter dAd = new SqlDataAdapter("SELECT * FROM LoanPortfolio where custID like 'OH00002'", conn))
{
    DataTable dTable = new DataTable();
    dAd.Fill(dTable);
    return dTable;
}

關閉后,您將重新使用相同的連接。 重新打開並重復使用。 或者根本不關閉,因為你仍然using相同的塊。

更新 :MSDN: http//msdn.microsoft.com/en-us/library/bh8kx08z( v= vs.100).aspx

如果發現連接尚未打開,則Fill方法隱式打開DataAdapter正在使用的Connection。 如果Fill打開連接,它也將在Fill完成時關閉連接。

所以,在上面的章節“conn.close()”無關緊要,“填充”將打開連接並關閉它。

一旦完成, using塊將丟棄連接。 因此,不需要顯式關閉連接。

Sql dataAdapter本身管理連接.it在fill命令之后打開和關閉。但是使用ExecuteReader或ExecuteNonQuery顯然需要連接打開和關閉,你可以在執行nonquery和executereader命令之前打開連接,如果你的代碼面臨的話還有一個場景。錯誤和代碼無法到達conn.close(); 命令。

   public class LoanDAL
{
string connString = ConfigurationManager.ConnectionStrings["Oakhorizons"].ToString();
public LoanDAL()
{
    //
    // TODO: Add constructor logic here
    //
}
public DataTable getAllLoanInfoDT()
{
        using (SqlConnection conn = new SqlConnection(connString))
        {
            SqlCommand cmd2 = new SqlCommand();
            cmd2.Connection = conn;
            // cmd.CommandType = CommandType.StoredProcedure;
            cmd2.CommandText = "SELECT DISTINCT loanUpdateDate FROM LoanPortfolio WHERE (custID LIKE 'OH00002') AND (loanType LIKE 'Personal Loan')";
            cmd2.Parameters.AddWithValue("@custID", "OH00002");
            cmd2.Parameters.AddWithValue("@loanType", "Personal Loan");

            DateTime loanUpdateDate = DateTime.Now;
            try
            {
             conn.Open();
            SqlDataReader myReader = cmd2.ExecuteReader();
            while (myReader.Read())
            {
                loanUpdateDate = Convert.ToDateTime(myReader[0]); 
                break; 
            }
               conn.Close();   
            DateTime currDateTime = DateTime.Now;
            }
            Catch(Exception Ex)
            {//Close connection in case of any exception .
              conn.Close();
            }
            int loanToBeAdded = (((currDateTime.Year - loanUpdateDate.Year) * 12) + currDateTime.Month - loanUpdateDate.Month) * 500;
            if (loanToBeAdded > 0)
            {
               try
               {
                String sql = "UPDATE LoanPortfolio SET loanPaid = loanPaid + " + loanToBeAdded.ToString() + ", LastUpdatedLoanPaidDate = " + DateTime.Now.ToString();
                sql += " WHERE (loanType LIKE 'Personal Loan') AND (custID LIKE 'OH00002')";
                cmd2.Connection = conn;
                cmd2.CommandText = sql;
                 conn.Open();
                cmd2.ExecuteNonQuery();
                conn.Close();
                }
                Catch(Exception Ex)
                 {
                 //Close connection in case of exception .
                  Conn.close()
                  throw Ex;
                 }
            }            
            using (SqlDataAdapter dAd = new SqlDataAdapter("SELECT * FROM LoanPortfolio where custID like 'OH00002'", conn))
            {
                DataTable dTable = new DataTable();
                dAd.Fill(dTable);
                return dTable;
            }

        }

}

//Returning a DataSet which contains all the information in the Player Table
public DataSet getAllLoanInfoDS()
{
    using (SqlConnection conn = new SqlConnection(connString))
    {

        using (SqlDataAdapter dAd = new SqlDataAdapter("SELECT * FROM LoanPortfolio where custID like 'OH00002", conn))
        {
            DataSet myDS = new DataSet();
            dAd.Fill(myDS);
            return myDS;
        }



    }
}
}

您的連接字符串需要添加“MultipleActiveResultSets = True”。如果您使用多個命令,就像在一個連接中有兩個命令一樣,請在連接字符串中啟用“MultipleActiveResultSets = True”,或者在每次連接后打開並關閉與服務器的事務(每個連接一個命令)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM