2013-04-18 104 views
0

編程時,我正在編寫一個項目,該項目允許用戶使用文本框將其註冊數據輸入到本地數據庫中。該代碼的作品,它將項目添加到數據庫 和我按下「Show_users」按鈕後,它顯示在listBox_users列表框中。如何使用C#中的本地數據庫中的數據顯示文本框中的列表框項目

我的問題是,當我從listBox_users選擇一個名字,應該用我的listBox_users創建的事件dislay大約在上textBox'es選定的用戶,我用擺在首位進入 數據的數據, 但即時通訊出現「無法從已關閉的數據庫讀取數據」的錯誤。

namespace Userform 
{ 
public partial class Form1: Form 
{ 
    SqlCeDataReader rdr; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    // Some code between... 

    private void button_ShowUsers_Click(object sender, EventArgs e) //code that shows users in listBox 
    { 

     var dt = new DataTable(); 
     string connectionString2 = @"Data Source=MyDatabase;Password=xxxxxx;"; 

     using (var cn = new SqlCeConnection(connectionString2)) 
     using (var cmd = new SqlCeCommand("Select * From Users", cn)) 
     { 
      cn.Open(); 

      using (var reader = cmd.ExecuteReader()) 
      { 
       dt.Load(reader); 
       var results = (from row in dt.AsEnumerable() 
           select new 
           { 
            //UserID = row.Field<int>("ID"), 
            FirstName = row.Field<string>("Firsname"), 
            LastName = row.Field<string>("Lastname"), 
            FullName = row.Field<string>("Firstname") + " " + row.Field<string>("Lastname") 
           }).ToList(); 

       listBox_users.DataSource = results; 
       listBox_users.DisplayMember = "FullName"; 

       rdr = cmd.ExecuteReader(); 
       } 
      } 
     } 

    //I made an event for the listBox_users: 

    private void listBox_users_SelectedIndexChanged(object sender, EventArgs e) 
    //event code that should show listbox selected data in the textBoxes 
    {    
     if (listBox_inimesed.SelectedItem != null && rdr != null) 
     { 
      try 
      { 
       if (rdr.Read()) 
       { 

        textBox1_firstname.Text = rdr.GetString(1); 
        textBox2_lastname.Text = rdr.GetString(2); 
        textBox3_email.Text = rdr.GetString(3); 
        textBox4_address.Text = rdr.GetString(4); 
        dateTimePicker1.Value = rdr.GetDateTime(5); 
        richTextBox_info.Text = rdr.GetString(6); 
       } 
       else MessageBox.Show("Object not found"); 
      } 
      finally 
      { 
       rdr.Close(); 
      } 
     } 
    } 
} 

回答

0

您正在使用的閱讀器所依賴的連接已在button_ShowUsers_Click事件中關閉。

嘗試跨事件共享連接和數據讀取器不是一個好習慣。這將導致打開的連接沒有正確處理。更好的做法是在每個事件方法中創建Connection,Command和DataReader。通過使用「使用」語句,它們將在每種方法中被關閉並正確處置。您也可以刪除類級變量「rdr」。

namespace Userform 
{ 
    public partial class Form1 : Form 
    { 
     const string connectionString2 = @"Data Source=MyDatabase;Password=xxxxxx;"; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     // Some code between... 

     private void button_ShowUsers_Click(object sender, EventArgs e) //code that shows users in listBox 
     { 
      var dt = new DataTable(); 

      using (var cn = new SqlCeConnection(connectionString2)) 
      using (var cmd = new SqlCeCommand("Select * From Users", cn)) 
      { 
       cn.Open(); 

       using (var reader = cmd.ExecuteReader()) 
       { 
        dt.Load(reader); 
        var results = (from row in dt.AsEnumerable() 
            select new 
            { 
             //UserID = row.Field<int>("ID"), 
             FirstName = row.Field<string>("Firsname"), 
             LastName = row.Field<string>("Lastname"), 
             FullName = row.Field<string>("Firstname") + " " + row.Field<string>("Lastname") 
            }).ToList(); 

        listBox_users.DataSource = results; 
        listBox_users.DisplayMember = "FullName"; 
       } 
      } 
     } 

    //I made an event for the listBox_users: 

     private void listBox_users_SelectedIndexChanged(object sender, EventArgs e) 
     //event code that should show listbox selected data in the textBoxes 
     { 
      if (listBox_inimesed.SelectedItem != null) 
      { 
       using (var cn = new SqlCeConnection(connectionString2)) 
       using (var cmd = new SqlCeCommand("Select * From Users", cn)) 
       { 
        cn.Open(); 

        using (var reader = cmd.ExecuteReader()) 
        { 
         if (reader.Read()) 
         { 
          textBox1_firstname.Text = reader.GetString(1); 
          textBox2_lastname.Text = reader.GetString(2); 
          textBox3_email.Text = reader.GetString(3); 
          textBox4_address.Text = reader.GetString(4); 
          dateTimePicker1.Value = reader.GetDateTime(5); 
          richTextBox_info.Text = reader.GetString(6); 
         } 
         else MessageBox.Show("Object not found"); 
        } 
       } 
      } 
     } 
    } 
} 
+0

對不起,很長的響應,但給出錯誤「對象引用未設置爲對象的實例」。 –

+0

那是因爲我在'SelectedIndexChanged'事件中引用了錯誤的對象,是referenece'rdr'而不是'reader'。現在修復。 – rclement

+0

是的,它可以在列表框中顯示來自數據庫的項目,但我需要的是,如果我在列表框中選擇一個值,它會將該人員的信息顯示迴文本框。那就是我從來沒有去過的東西 –

相關問題