2016-02-06 59 views
0

我想做一個小的聯繫簿,從一個mssql數據庫中獲取聯繫人的詳細信息。它有3個表格:contacts,last_talk(上次我與聯繫人聊天+討論)和另一個表(這兩個表都具有來自前兩個表的主鍵)C#顯示從SQL數據庫中的字符串

在顯示聯繫人的窗體(tabcontrol標籤)中,我添加了2個列表框,加載並顯示聯繫人姓名,第二個列表框爲我選擇的每個聯繫人加載「Last talk」列表,具體取決於我與聯繫人進行了多少次「會談」。

現在我試圖在我的「對話列表」列表框中選擇一個字段時,我正試圖在label.Text中顯示並從數據庫中顯示richTextBox.Text。

我的數據庫有3個表格:1個用於聯繫人,1個用於討論/會談,1個用於創建前2個表格之間的關係。

下面是代碼的一部分:

private void PopulateSelectedTalk() 
    { 
     string query = "SELECT * FROM LastTalk WHERE Id = @ID"; 

     using (connection = new SqlConnection(connectionString)) 
     using (SqlCommand command = new SqlCommand(query, connection)) 
     using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
     { 
      command.Parameters.Add("@ID", SqlDbType.Int); 
      command.Parameters["@ID"].Value = lstConversationList.SelectedValue; 


      connection.Open(); 
      SqlDataReader rdr = command.ExecuteReader(); 

      while (rdr.Read()) 
      { 
       lblLastTalk.Text = rdr["LastTalkSubject"].ToString(); 
       rtxtLastTalkDescription.Text = rdr["LastTalkDescription"].ToString(); 

      } 
      rdr.Close(); 
      connection.Close(); 

     } 
    } 
    private void lstConversationList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     PopulateSelectedTalk(); 
    } 

我有一個非常類似的問題,我這裏張貼:C# Displaying a sql database object's name in a label.Text property on "SelectedIndexChanged" Event

而且我加入

command.Parameters.Add("@ID", SqlDbType.Int); 
     command.Parameters["@ID"].Value = lstConversationList.SelectedValue; 

後,它的工作。

但是,現在當我試圖使用lstConversationList.SelectedValue;我得到下面的異常

「」類型的異常出現在System.Data.dll中,但在用戶代碼中沒有處理 其他信息:無法參數值從DataRowView的到的Int32轉換。

此行引發異常:SqlDataReader rdr = command.ExecuteReader();

當我在上一個問題的調試模式中將鼠標懸停在「Listbox.SelectedValue」上時,我將鼠標懸停在「Listbox.SelectedValue」上的代碼中,我得到的值爲「1」得到「System.DataRowView」

下面是從以前的問題的代碼(它的工作原理):

private void PopulateContactLabels() 
    { 
     string query = "SELECT * FROM Contact WHERE Id = @ID"; 

     using (connection = new SqlConnection(connectionString)) 
     using (SqlCommand command = new SqlCommand(query, connection)) 
     using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
     { 
      command.Parameters.Add("@ID", SqlDbType.Int); 
      command.Parameters["@ID"].Value = lstContactList.SelectedValue; 

      connection.Open(); 
      SqlDataReader rdr = command.ExecuteReader(); 

      while (rdr.Read()) 
      { 
       lblContactName.Text = rdr["Name"].ToString(); 
       lblCompany.Text = rdr["Company"].ToString(); 
       lblOccupation.Text = rdr["Occupation"].ToString(); 
       lblPhoneNumber.Text = rdr["PhoneNumber"].ToString(); 
       lblEmail.Text = rdr["Email"].ToString(); 
      } 
      rdr.Close(); 
      connection.Close(); 

     } 
    } 

我缺少/做錯了嗎? 請幫忙!

編輯:代碼,設置在lstConversationlist項目

private void PopulateTalkList() 
    { 
     string query = "SELECT a.LastTalkSubject FROM LastTalk a " + "INNER JOIN ContactLastTalk b ON a.Id = b.LastTalkId " + 
      "WHERE b.ContactId = @ContactId"; 

     using (connection = new SqlConnection(connectionString)) 
     using(SqlCommand command = new SqlCommand(query,connection)) 
     using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
     { 
      command.Parameters.AddWithValue("@ContactId", lstContactList.SelectedValue); 
      DataTable lastTalkTable = new DataTable(); 
      adapter.Fill(lastTalkTable); 

      lstConversationList.DisplayMember = "LastTalkSubject"; 
      lstConversationList.ValueMember = "Id"; 
      lstConversationList.DataSource = lastTalkTable; 
     } 
    } 
+0

你能證明將在_lstConversationList_項目的代碼? – Steve

+0

我已添加代碼。 – Cristian

回答

0

問題從事實出現您設置的DataSource將lstConversationList轉換爲DataTable,並忘記將其ValueMember屬性設置爲包含要從SelectedValue屬性中檢索的值的列的名稱。

當您將DataSource屬性設置爲DataTable時,ListBox.Items集合中的每個項目都是DataRowView。如果您未設置ValueMember屬性,則SelectedValue無法知道從哪個列讀取其返回值。它只是返回整個DataRowView實例,當然,這不是您正在搜索的整數。

所以,當你填lstConversationList不要忘了寫

private void PopulateTalkList() 
{ 

    ' NOTE. you need to add also the ID field to the select query 

    string query = @"SELECT a.Id, a.LastTalkSubject 
        FROM LastTalk a INNER JOIN ContactLastTalk b 
        ON a.Id = b.LastTalkId 
        WHERE b.ContactId = @ContactId"; 

    using (connection = new SqlConnection(connectionString)) 
    using(SqlCommand command = new SqlCommand(query,connection)) 
    using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
    { 
     command.Parameters.AddWithValue("@ContactId", lstContactList.SelectedValue); 
     DataTable lastTalkTable = new DataTable(); 
     adapter.Fill(lastTalkTable); 

     lstConversationList.DisplayMember = "LastTalkSubject"; 
     lstConversationList.ValueMember = "Id"; 
     lstConversationList.DataSource = lastTalkTable; 
    } 
} 
+0

我在「對話列表」列表框中顯示的方法中使用DataTable,其中顯示我與選定聯繫人(在我的聯繫人姓名列表框中)的對話。使用(SqlDataAdapter adapter = new SqlDataAdapter(command)) – Cristian

+0

command.Parameters.AddWithValue(「@ ContactId」,lstContactList.SelectedValue); DataTable lastTalkTable = new DataTable(); adapter.Fill(lastTalkTable); lstConversationList.DisplayMember =「LastTalkSubject」; lstConversationList.ValueMember =「Id」; lstConversationList.DataSource = lastTalkTable; } – Cristian

+0

我應該分享方法之間的數據表嗎?或者我應該在我的PopulateSelectedTalk()中使用另一個;方法? – Cristian

0

值應爲字符串,這樣的事情會

lstConversationList.SelectedValue.toString(); 
+0

讓我知道這是否工作。好? –

+0

對不起,它不起作用。 – Cristian