C# 如果选择组合框,则文本框中的数据库值

C# 如果选择组合框,则文本框中的数据库值,c#,C#,我正在尝试为一个表单编写代码,该表单可以写入sql表。我使用其他表格中的数据来完成表格(以及用户输入)。我有一个复选框可以选择combobox(ddDefect)的源——它基于两个类似sql的查询之一——因此,如果复选框=true,combox将显示一个类似查询的结果,如果复选框=false,则显示另一个类似查询的结果。这部分很好用。问题是;我似乎不知道如何在组合框中选择所选项目并在我的文本框(txtNcm)中显示另一列的文本 我尝试过各种方法,这对我来说似乎是最有意义的(虽然我只是一个初学者,

我正在尝试为一个表单编写代码,该表单可以写入sql表。我使用其他表格中的数据来完成表格(以及用户输入)。我有一个复选框可以选择combobox(ddDefect)的源——它基于两个类似sql的查询之一——因此,如果复选框=true,combox将显示一个类似查询的结果,如果复选框=false,则显示另一个类似查询的结果。这部分很好用。问题是;我似乎不知道如何在组合框中选择所选项目并在我的文本框(txtNcm)中显示另一列的文本

我尝试过各种方法,这对我来说似乎是最有意义的(虽然我只是一个初学者,而且毫无头绪),但我的文本框里什么都没有

以下是我一直在尝试的代码:

private void ddDefect_SelectedIndexChanged(object sender, EventArgs e)
{
    string constring = "Data Source=TS-ERP01;Initial Catalog=Touchstn02;Integrated Security=True";
    string Query = "select * from  Defect_Codes Where DESCP_91= ' " + ddDefect.Text + " ';";
    SqlConnection conDataBase = new SqlConnection(constring);
    SqlCommand cmdDataBase = new SqlCommand(Query, conDataBase);
    SqlDataReader myReader;
    try
    {
        conDataBase.Open();
        myReader = cmdDataBase.ExecuteReader();

        while (myReader.Read())
        {
            string sDEF = myReader["DEFECT_91"] as String;
            txtNcm.Text = sDEF;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

sql命令文本包含ddDefect值前后的空格

 ....DESCP_91= ' " + ddDefect.Text + " ';";
                ^                     ^
这些空格将按原样传递给数据库引擎,除非在数据库列(CHAR/NCHAR)中有一个非常特定的数据类型,并且在列中的值周围有这些精确的空格,否则该命令将永远找不到任何数据

但这并不是你问题的终结。以这种方式连接字符串是一个众所周知的问题源。如果ddDefect.Text包含一个引号怎么办?另一个语法错误。然后是一个非常严重的安全问题

所以您应该使用这样的参数化查询

string constring = "Data Source=TS-ERP01;Initial Catalog=Touchstn02;Integrated Security=True";
string Query = "select * from  Defect_Codes Where DESCP_91= @ds91";
using(SqlConnection conDataBase = new SqlConnection(constring))
using(SqlCommand cmdDataBase = new SqlCommand(Query, conDataBase))
{
   try
   {
       conDataBase.Open();
       cmdDataBase.Parameters.Add("@ds91", SqlDbType.NVarChar).Value = ddDefect.Text;
       using(SqlDataReader myReader = cmdDataBase.ExecuteReader())
       {
           while (myReader.Read())
           {
              string sDEF = myReader["DEFECT_91"].ToString();
              txtNcm.Text = sDEF;
           }
       }
   }
   catch (Exception ex)
   {
       MessageBox.Show(ex.Message);
   }
}

还要注意,SqlConnection、SqlCommand和SqlDataReader都是一次性对象,因此您应该尝试始终使用using语句来确保这些对象释放在工作期间获取的非托管资源(特别是SqlConnection对象)

如果调试代码,“sDEF”中包含什么?正确的值?“我似乎不知道如何在组合框中获取所选项目”-使用:
(发送者作为组合框)。SelectedItem
。效果很好-你们太棒了。还感谢您为安全性添加的提示和代码-非常感谢!