如果选择Combobox

时间:2017-05-02 19:17:58

标签: c#

我正在尝试为写入sql表的表单编写代码。我使用其他表的数据来完成表单(以及用户输入)。我有一个复选框,用于选择组合框的源(ddDefect) - 它基于两个sql LIKE查询之一 - 因此,如果checkbox = true,则combox将显示一个LIKE查询的结果,如果是,则显示另一个LIKE查询的结果=假。这部分效果很好。问题是;我似乎无法弄清楚如何在组合框中选择所选项目并在文本框中显示另一列文本(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);
    }

1 个答案:

答案 0 :(得分:1)

您的sql命令文本包含ddDefect值之前和之后的空格。

 ....DESCP_91= ' " + ddDefect.Text + " ';";
                ^                     ^

这些空格将按原样传递给数据库引擎,除非数据库列(CHAR / NCHAR)中有非常特定的数据类型,并且列中的值周围有这些确切的空格,否则命令将永远不会找到任何数据

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

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

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)对象)