簡體   English   中英

打開和關閉每個查詢的數據庫連接

[英]Opening and closing database connection for each query

我寫了以下代碼。 我已經為一個查詢打開了一次數據庫連接,我想執行另一個查詢。 我寫了下面的代碼。 但我認為有一個錯誤任何人都可以幫助我嗎?

public void check()
{
    try
    {
        OdbcConnection myOdbcConnection = new OdbcConnection(con1);
        OdbcCommand myOdbcCommand = myOdbcConnection.CreateCommand();
        String sSQL = "SELECT * FROM(select tdate from tbl_IThelpdesk order by call_no desc)where ROWNUM = 1"; //last record of the call_no column
        myOdbcCommand.CommandText = sSQL;
        myOdbcConnection.Open();
        OdbcDataReader myOdbcDataReader = myOdbcCommand.ExecuteReader();
        if (!myOdbcDataReader.Read())
        {
            txtDate.Text = DateTime.Now.ToShortDateString();
            string strcallno = DateTime.Now.Year.ToString("d2") + DateTime.Now.Month.ToString("d2") + DateTime.Now.Day.ToString("d2");
            txtcall.Text = "ITHD" + strcallno + "001";
            myOdbcConnection.Close();
            myOdbcDataReader.Close();
        }
        else
        {
            DateTime today = DateTime.Parse(DateTime.Now.ToShortDateString());
            if (myOdbcDataReader[0].ToString() == today.ToString())
            {
                myOdbcConnection.Close();
                myOdbcDataReader.Close();
                myOdbcConnection.Open();
                OdbcCommand myOdbcCommand1 = myOdbcConnection.CreateCommand();
                String SQLmax = "SELECT max(call_no) FROM TBL_IThelpdesk";
                myOdbcCommand1.CommandText = SQLmax;

                OdbcDataReader myOdbcDataReader1 = myOdbcCommand1.ExecuteReader();
                while (myOdbcDataReader1.Read() != false)
                {
                    txtcall.Text = myOdbcDataReader1[0].ToString().Trim();
                }
                myOdbcDataReader1.Close();
                myOdbcDataReader.Close();
                myOdbcConnection.Close(); 
            }
        }
    }
    catch (Exception e)
    {
        lblEmpty.Text = e.Message;
        lblEmpty.Visible = true;
    }
}

由於數據庫連接使用池,因此您不必為多個查詢維護相同的連接; 相反,在需要時打開連接,並盡快關閉它以釋放資源。

請參閱: http//msdn.microsoft.com/en-us/library/8xx3tyca(v = vs。80).aspx
另請參見: C#SQLConnection池

請注意,您沒有使用過using() { }模式。 鑒於OdbcConnection和類似類型實現IDisposable ,您應該將它們嵌入到using中,以便在不等待垃圾收集器的情況下處理它們。

請參閱: http//msdn.microsoft.com/en-us/library/yh598w02.aspx

當你只需要擊中一次時,你就會擊中數據庫兩次。 您將獲得最新日期,然后再次訪問數據庫以獲取相應的call_no。 這是不安全的,因為即使在2個查詢之間的少量時間內,max(call_no)也可能發生變化。

//get the latest [call_no] and [tdate]. No need for a 2cd trip with max(call_no)
SELECT * FROM(select call_no, tdate from tbl_IThelpdesk order by call_no desc)where ROWNUM = 1

數據訪問代碼也與UI代碼混合在一起。 你應該創建做一件事的數據訪問方法; 返回您想要的數據。 這將使您更容易遵循算法的主流程。

暫無
暫無

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

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