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;
         }
    }

C# 显示 SQL 数据库中的字符串

此问题是由于您将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();