2016-11-25 5 views
0

SQLインジェクションを防止するために、私のプログラムのデザインを変更しようとしています。プリセット文字列とTextBoxesを連結することによって、どのような古いSQL文字列が作られたかを見ています。C# - ODBCパラメータの動作

DB2データベースでODBCドライバを使用しています。

これは、場合によっては機能しますが、それ以外の場合は機能しません。

例を挙げましょう:

旧コード:

App.Comando.CommandText = "SELECT NOMUSU, CodEmp FROM DB.Users WHERE CODUSU = '" + txt_usuario.Text + "' AND PASUSU = '" + txt_password.Password + "'"; 

新コード:

App.Comando.CommandText = 
      "SELECT NOMUSU, CodEmp FROM DB.Users WHERE CODUSU = ? AND PASUSU = ?"; 
     App.Comando.Parameters.AddWithValue("@codusu", txt_usuario.Text); 
     App.Comando.Parameters.AddWithValue("@pass", txt_password.Password); 

この1つは完璧に動作します。

ただし、これはありません。何もエラーを投げていない、ちょうど空白に戻ってきます。

旧コード:

App.Comando.CommandText = "SELECT CODMAR FROM DB.Marcas AS MARCAS WHERE DESMAR = '" + marca + "'"; 

新コード:

App.Comando.CommandText = "SELECT CODMAR FROM DB.Marcas AS MARCAS WHERE DESMAR = ?"; 
App.Comando.Parameters.AddWithValue("@marca", marca); 

あなたがそれを必要とするだけの場合には、この場合、

string marca = txt_marca.Text.Trim().ToUpper(); 

、新しいコードは動作しません、古いものがやった。私は私の髪を引き出している、それはちょうど意味がありません。

ありがとうございました!

+0

'App.Comando.Parameters.AddWithValue(" @ desmar "、marca);'? – artm

+0

@artmはい、marcaは、あらかじめテキストボックスのトリムされたテキストとして定義されています。 –

+0

私は 'AddWithValue'の中で' @ marca'の代わりに '@ desmar'を使うつもりでした。 – artm

答えて

0

コマンドタイプを設定していますか?

App.Comando.CommandText = "SELECT CODMAR FROM DB.Marcas AS MARCAS WHERE DESMAR = ?"; 
App.Comando.Parameters.AddWithValue("?marca", marca); 
+0

最初のものは何も変更されません。ODBCは、ODBCがテキストコマンドの名前付きパラメータを受け入れないため、ストアドプロシージャでのみODBC例外を与えます。ありがとう、結構です。 –

+0

私は自分の反応を変更しました。 – Esperento57

+0

これはストアドプロシージャではありません。ストアドプロシージャはデータベースに格納され、コードから呼び出すことができます。 –

関連する問題