c#ListView中的数据库保存问题

本文关键字:保存 问题 数据库 c#ListView | 更新日期: 2023-09-27 17:57:43

我有一个ListView。它有6列:

question_id | question_text | start_time | end_time | status | repeat 

分别。现在我可以显示数据库中的数据了。这是我的代码:

private void Voting_Editor_Tool_Load(object sender, EventArgs e)
{
    GetData();
}
public void GetData()
{
    try
    {
        now = DateTime.Now;
        String time_date = now.ToString();
        myConnection = new SqlConnection(@"User ID=sa;Password=password123;Initial Catalog=dishtv;Persist Security Info=True;Data Source=ENMEDIA-EA6278E'ENMEDIA");
        //myConnection.Open();
        //SqlDataReader dr = new SqlCommand("SELECT question_text,question_id FROM otvtbl_question ", myConnection).ExecuteReader();
        // listView1.Columns.Clear();
        listView1.Items.Clear();
        myConnection.Open();
        String MyString1 = string.Format("SELECT question_id,question_text,start_time,end_time,status,repeat FROM otvtbl_question");
        com = myConnection.CreateCommand();
        com.CommandText = MyString1;
        dr = com.ExecuteReader();
        ListViewItem itmX;
        //Adding the Items To The Each Column
        while (dr.Read())
        {
            itmX = new ListViewItem();
            itmX.Text = dr.GetValue(0).ToString();
             var word = itmX.Text;
            for (int i = 1; i < 6; i++)
            {
                itmX.SubItems.Add(dr.GetValue(i).ToString());
            }
            if (dr.GetDateTime(2) < now && dr.GetDateTime(3) > now)
            {
                itmX.SubItems[4].Text = "Broadcasting";
            }
            else if (dr.GetDateTime(3) < now)
            {
                string a=Convert.toString(dr.GetDateTime(3));
                itmX.SubItems[4].Text = "Expired";
                String broadcast = string.Format("UPDATE otvtbl_question SET             status='EXPIRED' where start_time='{6}'",a );
                //Execute the SqlCommand
                com = new SqlCommand(broadcast, myConnection);
                com.ExecuteNonQuery();
            }
            else
            {
                itmX.SubItems[4].Text = "Not Expired";
            }
            listView1.Items.Add(itmX);
        }
        dr.Close();
        myConnection.Close();
    }
    catch (Exception ex)
    {
        //Error Message While Fetching
        MessageBox.Show("Error While Fetching the data From the DataBase" + ex);
    }
    finally
    {
        //Closing The Connection
        if (dr != null)
            dr.Close();
        if (myConnection.State == ConnectionState.Open)
            myConnection.Close();
    }
}

在这段代码中,每次用户加载表单时都必须更新状态列。在加载表单时,必须检查start_time是否大于当前时间。如果大于,则状态列必须显示NOT EXPIRED,否则必须显示EXPIRED。问题是,我可以通过比较时间在Status列中显示EXPIREDNOT EXPIRED的值,但我想在数据库中保存EXPIREDNOT EXPIRED的值,同时它在状态列中显示值。我已经尝试使用以下命令更新它:

String broadcast = string.Format("UPDATE otvtbl_question SET                status='EXPIRED' where start_time='{6}'",a );
//Execute the SqlCommand
com = new SqlCommand(broadcast, myConnection);
com.ExecuteNonQuery();

但上面写着:

更新数据之前必须关闭DataReader。

我甚至试图关闭数据读取器并尝试更新,它显示了不同的错误:

索引(从零开始)必须大于或等于零并且小于参数列表的大小

有什么建议吗?

c#ListView中的数据库保存问题

您应该实现using语句。这将解决问题。以下是应该实现using语句的块。

  1. Sql连接
  2. 数据读取器

此外,我们应该使用参数化查询。下面是示例代码。

using (System.Data.SqlClient.SqlConnection con = new SqlConnection("YourConnection string")) { 
    con.Open(); 
    SqlCommand cmd = new SqlCommand(); 
    string expression = "Parameter value"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "Your Stored Procedure"; 
    cmd.Parameters.Add("Your Parameter Name", 
                SqlDbType.VarChar).Value = expression;    
    cmd.Connection = con; 
    using (IDataReader dr = cmd.ExecuteReader()) 
    { 
        if (dr.Read()) 
        { 
        } 
    } 
}

以下是您请求的IDisposable示例。IDisposable