如何在 C# 中使用 ComboBox 从另一个 DataGridView 的 sql 表中选择数据名称?

Posted

技术标签:

【中文标题】如何在 C# 中使用 ComboBox 从另一个 DataGridView 的 sql 表中选择数据名称?【英文标题】:How to choose a name of data from sql table from another DataGridView using ComboBox in C#? 【发布时间】:2021-09-04 11:10:43 【问题描述】:

我有三个表:Patient、Doctor、Diagnosis。在诊断表单中,我有两个 ComboBox,我需要能够通过这些 ComboBox 选择医生和患者的姓名。

方法代码:

void populatecombo()

    string sql = "select * from Patient";
    SqlCommand cmd = new SqlCommand(sql, conn);
    SqlDataReader rdr;
    try
    
        conn.Open();
        DataTable dt = new DataTable();
        dt.Columns.Add("PatId", typeof(int));
        rdr = cmd.ExecuteReader();
        dt.Load(rdr);
        PatId.ValueMember = "PatId";
        PatId.DataSource = dt;
        conn.Close();
    
    catch
    

    


void populatedoc()

    string mysql = "select * from Doctor";
    SqlCommand cmd = new SqlCommand(mysql, conn);
    SqlDataReader rdr;
    try
    
        conn.Open();
        DataTable dt = new DataTable();
        dt.Columns.Add("DocId", typeof(int));
        rdr = cmd.ExecuteReader();
        dt.Load(rdr);
        DocId.ValueMember = "DocId";
        DocId.DataSource = dt;
        conn.Close();
    
    catch
    

    


string patname;
string docname;

void fetchpatientname()


    string mysql = "select * from Patient where PatId=" + PatId.SelectedValue.ToString() + "";
    SqlCommand cmd = new SqlCommand(mysql, conn);
    DataTable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dt);
    foreach (DataRow dr in dt.Rows)
    
        patname = dr["PatName"].ToString();
        PatientTb.Text = patname;
    


void fetchdoctorname()

    string str = "select * from Doctor where DocId=" + DocId.SelectedValue.ToString() + "";
    SqlCommand cmd = new SqlCommand(str, conn);
    DataTable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dt);
    foreach (DataRow dr in dt.Rows)
    
        docname = dr["DocName"].ToString();
        DocName.Text = docname;
    

所以populatedocpopulatecombo 应该得到医生和病人的名字,而 fetch 应该有助于从 ComboBox 中选择它们,但它似乎不适用于错误:

System.Data.SqlClient.SqlException:“'=' 附近的语法不正确。”

表格图片:

【问题讨论】:

这能回答你的问题吗? What are good ways to prevent SQL injection? • SqlCommand Parameters Add vs. AddWithValue SQL Injection alert - 你应该将你的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入 - 查看Little Bobby Tables @OlivierRogier 所以实际上我像你展示的那样进行了编辑,但我仍然无法从组合框中进行选择,因为当我点击它时,只有一个空白空间,而不是来自其他表的数据 PatId 和 DocId 的 DB 类型是什么? Text.VarChar 或 Integer 还是什么?什么是 PatId 和 DocId 以及 SelectedValue 的底层类型? 它们是 int,但我不确定如何选择 docname 和 patname,所以我将表单的图像编辑到帖子中以使其更清晰 【参考方案1】:

根据我的测试,我无法根据您的代码得到您提供的错误。

您可以尝试使用 SqlCommand.Parameters.AddWithValue 方法来做到这一点。

 void fetchpatientname()
        
            conn.Open();
            string mysql = "select * from Patient where PatId=@PatId";
            SqlCommand cmd = new SqlCommand(mysql, conn);
            cmd.Parameters.AddWithValue("@PatId", cmbPat.SelectedValue);
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            foreach (DataRow dr in dt.Rows)
            
                patname = dr["PatName"].ToString();
                txtPatName.Text = patname;
            
            conn.Close();

        
        void fetchdoctorname()
        
            conn.Open();
            string str = "select * from Doctor where DocId=@DocId"; 
            SqlCommand cmd = new SqlCommand(str, conn);
            cmd.Parameters.AddWithValue("@DocId", cmbDoc.SelectedValue);
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            foreach (DataRow dr in dt.Rows)
            
                docname = dr["DocName"].ToString();
                txtDocName.Text = docname;
            
            conn.Close();
        
         private void button1_Click(object sender, EventArgs e)
        
            fetchdoctorname();
            fetchpatientname();
        

结果:

【讨论】:

以上是关于如何在 C# 中使用 ComboBox 从另一个 DataGridView 的 sql 表中选择数据名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用linq c#优化嵌套循环并从另一个列表中过滤

如何在 C# 中获取 dataGridView 中所有 Combobox 列的显示成员?

C# Combobox (Dropdownstyle = Simple) -- 如何在键入时选择项目

c#中,如何对COMBOBOX的SelectedIndexChanged事件分别执行程序?

c#如何获取comboBox当前选中的值

如何从另一个 WinForm 中通过 C# WinForm 查看