为每个查询打开和关闭数据库连接

本文关键字:数据库连接 查询 | 更新日期: 2023-09-27 18:00:07

我已经编写了以下代码。我已经为一个查询打开了一次数据库连接我想执行另一个查询。我已经写了下面的代码。但我认为这是一个错误有人能帮我吗?

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。这是不安全的,因为即使在两个查询之间的很短时间内,最大值(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代码混合使用。您应该创建做1件事的数据访问方法;返回所需的数据。这将使遵循算法的主要流程变得更加容易。