如何在 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;
所以populatedoc
和populatecombo
应该得到医生和病人的名字,而 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 表中选择数据名称?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中获取 dataGridView 中所有 Combobox 列的显示成员?
C# Combobox (Dropdownstyle = Simple) -- 如何在键入时选择项目