Я пытаюсь создать небольшую контактную книгу, которая берет информацию о контактах из базы данных mssql. У нее есть 3 таблицы: контакты, last_talk (последний раз я разговаривал с контактом + краткое описание обсуждение) и другая таблица (которая имеет как первичные ключи из первых двух таблиц)C# отображает строку из базы данных sql
На форме (вкладке tabcontrol), где я показываю контакты, я добавил 2 списка, один загружает и отображает имена контактов, а второй список загружает список «Последний разговор» для каждого контакта, который я выбираю, в зависимости от того, сколько «переговоров» у меня было с контактом.
Теперь я пытаюсь отобразить внутри label.Text и внутри richTextBox.Text из моей базы данных, когда я выбираю поле в моем списке «Список разговоров» ListBox.
В моей базе данных есть 3 таблицы: 1 для контактов, 1 для обсуждений/переговоров, 1 для создания отношения между двумя первыми таблицами.
Вот часть кода:
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.InvalidCastException» произошло в System.Data.dll, но не был обработан в пользовательском коде Дополнительная информация: Не удалось преобразовать значение параметра из DataRowView к Int32.
Исключение выбрано этой строкой: SqlDataReader rdr = command.ExecuteReader();
Когда я наводил указатель мыши на «Listbox.SelectedValue» в режиме отладки в предыдущей проблеме, я получаю значение «1», когда я наводил курсор на «Listbox.SelectedValue» в коде i, вышедшем выше i получить «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();
}
}
Что я упускаю/делаю неправильно? Пожалуйста, помогите!
Edit: Код, который задает элементы в 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;
}
}
Не могли бы вы показать код, который задает элементы в _lstConversationList_? – Steve
Я добавил код. – Cristian