2017-05-02 9 views
0

SQLテーブルに書き込むフォームのコードを記述しようとしています。私はフォームを完成させるために他のテーブルからデータを使用しています(ユーザー入力と共に)。私はコンボボックス(ddDefect)のソースをチェックするオプションを持っています - これは2つのsql LIKEクエリのうちの1つに基づいています - もしcomboxが1つのLIKEクエリの結果を表示するのであれば、 = 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); 
    } 
+2

コードをデバッグする場合、 "sDEF"に含まれるものは何ですか?正しい価値は? –

+0

*「コンボボックスで選択したアイテムをどのように取るかわかりません」* - 使用: '(コンボボックスとしての送信者).SelectedItem'。 –

答えて

1

あなたのSQLコマンドテキストはddDefectの値の前後にスペースが含まれています。ここ

は、私がしようとしているコードです。あなたは列の値の周りにこれらの正確なスペースを持つデータベースのカラム(CHAR/NCHAR)で非常に特定のデータ型を持っていない限り、

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

これらのスペースは、データベースエンジンにそのまま渡すとされ、コマンドは意志データを見つけることはありません。

しかしこれは問題の終わりではありません。この方法で文字列を連結することは、よく知られている問題の原因です。 ddDefect.Textに一重引用符が含まれている場合はどうなりますか?別の構文エラーです。その後、非常に深刻なセキュリティ上の問題であるSql Injection vulnerabilityの問題があります。

だからあなたもそのSqlConnectionオブジェクトをこの

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); 
    } 
} 

お知らせなどのパラメータ化クエリを使用する必要があり、SqlCommandオブジェクトとSqlDataReaderのは使い捨てのオブジェクトであり、したがって、あなたは常にこれらのオブジェクト、特定する声明を使用してを使用するようにしてください(特にSqlConnectionオブジェクト)

+1

魅力的なように働いた - 皆さんは素晴らしいです。また、セキュリティのためのヒントとコードを追加してくれてありがとう - 非常に感謝! –

関連する問題