2017-05-02 46 views
0

我尝试编写代码写入到一个SQL表的形式。我使用其他表格的数据来完成表格(以及用户输入)。我有选择的组合框(ddDefect)的源极的复选框 - 它是基于一个两个SQL之类的查询 - 如此,COMBOX将显示之一的结果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); 
    } 
+2

如果您调试代码,什么是包含在“sDEF”?正确的价值? –

+0

*“我似乎无法弄清楚如何采取在组合框中选择的项目” * - 使用:'(发件人为组合框).SelectedItem'。 –

回答

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的都是一次性的对象,因此,你应该尽量使用语句可以肯定,这些对象始终使用免费获得的非托管资源在他们的工作(特别是SqlConnection对象)

+1

工作就像一个魅力 - 你们是惊人的。也感谢您为安全性添加的提示和代码 - 非常感谢! –

相关问题