C# 显示 SQL 数据库中的字符串
本文关键字:字符串 数据库 显示 SQL | 更新日期: 2023-09-27 18:33:25
我正在尝试制作一个小的通讯录,从mssql数据库中获取联系人详细信息。它有 3 个表:联系人、last_talk(上次我与联系人交谈+讨论的简短描述(和另一个表(具有前 2 个表中的两个主键(
在我显示联系人的表单(选项卡控件的选项卡(上,我添加了 2 个列表框,一个加载并显示联系人姓名,第二个列表框为我选择的每个联系人加载"上次谈话"列表,具体取决于我与联系人的"谈话"次数。
现在我正在尝试在标签内显示。文本和在 richTextBox 中。当我在"对话列表"列表框中选择一个字段时,我的数据库中的文本。
我的数据库有 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# 在标签中显示 sql 数据库对象的名称。"选定索引已更改"事件上的文本属性
在我添加之后
command.Parameters.Add("@ID", SqlDbType.Int);
command.Parameters["@ID"].Value = lstConversationList.SelectedValue;
成功了。
但是,现在当我尝试使用 lstConversationList.SelectedValue 时; 我收到以下异常
System.Data 中发生类型为"System.InvalidCastException"的异常.dll但未在用户代码中处理 其他信息:无法将参数值从数据行视图转换为 Int32。
异常由以下行引发:SqlDataReader rdr = 命令。执行读取器((;
当我在上一期中以调试模式将鼠标悬停在"Listbox.SelectedValue"上时,我得到的值为"1",当我将鼠标悬停在上面发布的代码中的"Listbox.SelectedValue"上时,我得到"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;
}
}
此问题是由于您将lstConversationList
的数据源设置为 DataTable,而忘记将其 ValueMember
属性设置为包含要从 SelectedValue 属性检索的值的列的名称。
将 DataSource 属性设置为数据表时,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;
}
}
值应该是字符串,所以事情将是
lstConversationList.SelectedValue.toString();