为什么在这个数据库连接中使用while循环?

时间:2016-11-29 00:08:16

标签: c#

Currectly我正在学习和学习,我只是想知道C#中这个数据库连接的一些逻辑。我想知道为什么使用while循环我意味着如果我不使用它,它会影响程序还是程序运行正常如果我把它拿出来。我只是想知道使用它或从程序中取出它是明智的。有人可以帮帮我吗 ??谢谢

    private bool filled;
    public DataSet ds = new DataSet();

    private void bnt_displaylog_Click(object sender, EventArgs e)
    {
        try
        {
            string dbconnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Elevator_Database.accdb;";
            string dbcommand = "Select * from Log;";
            OleDbConnection conn = new OleDbConnection(dbconnection);
            OleDbCommand comm = new OleDbCommand(dbcommand, conn);
            OleDbDataAdapter adapter = new OleDbDataAdapter(comm);

            conn.Open();
            //MessageBox.Show("Connection Open ! "); 
            **while (filled == false)**
            {
                adapter.Fill(ds);
                filled = true; 
            }

            conn.Close();
        }
        catch (Exception)
        {
            MessageBox.Show("Can not open connection ! ");
            string message = "Error in connection to datasource";
            string caption = "Error";
            MessageBoxButtons buttons = MessageBoxButtons.OK;
            DialogResult result;
            result = MessageBox.Show(message, caption, buttons); 
        }

        database_listbox.Items.Clear();
        foreach (DataRow row in ds.Tables[0].Rows) 
        {
            database_listbox.Items.Add(row["Date"] + "\t\t" + row["Time"] + "\t\t" + row["Action"]); 
        } 

    }

1 个答案:

答案 0 :(得分:4)

这只是以非常不清楚的方式编写的代码。 while循环永远不会循环。循环体将执行一次,或者根本不执行,具体取决于filled的值。

换句话说,代码可以更清楚地写成:

conn.Open();
if( ! filled )
{
    adapter.Fill(ds);
    filled = true; 
}
conn.Close();

但即便如此,代码却做错了。考虑filledtrue的情况。实际执行的代码是:

conn.Open();
conn.Close();

这样做有什么意义?

在任何情况下,代码实际执行的操作(whileif)只是第一次调用adapter.Fill(ds)。鉴于此,当我们不进行该调用时,我们应该完全跳过设置连接。让我们重构代码,使其更清晰:

private bool filled = false;
public DataSet ds = new DataSet();

private void bnt_displaylog_Click(object sender, EventArgs e)
{
    loadDisplayLog();

    database_listbox.Items.Clear();
    foreach (DataRow row in ds.Tables[0].Rows) 
    {
        database_listbox.Items.Add(
            row["Date"] + "\t\t" + row["Time"] + "\t\t" + row["Action"]
        ); 
    } 

}

private void loadDisplayLog(object sender, EventArgs e)
{
    if( filled ) return;

    try
    {
        string dbconnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Elevator_Database.accdb;";
        string dbcommand = "Select * from Log;";
        OleDbConnection conn = new OleDbConnection(dbconnection);
        OleDbCommand comm = new OleDbCommand(dbcommand, conn);
        OleDbDataAdapter adapter = new OleDbDataAdapter(comm);

        conn.Open();
        adapter.Fill(ds);
        conn.Close();

        filled = true;
    }
    catch (Exception)
    {
        MessageBox.Show("Can not open connection ! ");
        string message = "Error in connection to datasource";
        string caption = "Error";
        MessageBoxButtons buttons = MessageBoxButtons.OK;
        DialogResult result;
        result = MessageBox.Show(message, caption, buttons); 
    }
}

此代码中的异常处理仍存在一些问题 - 如果adapter.Fill(ds);引发异常,是否会关闭连接?哎呀。但我会把剩下的作为读者的练习......