2016-04-22 14 views
-1

2つの異なるテーブルを使用して、変数からテーブル名が割り当てられているテーブルから選択しようとしています。ただし、DB2Exceptionエラーが発生します。C#SQLクエリテーブルパラメータを選択

db2Error = {"ERROR [42601] [IBM][AS] SQL0104N An unexpected token \"'TABLENAME'\" was found following \"\". 

このクエリはエラーを引き起こすものである - テーブル名は、テーブルの名前を持つ文字列です。

string strUpdate = "SELECT COMMENT FROM '" + tableName + "' WHERE NUMBER = '" + strNumber + "' AND CODE = '" + c.Trim() + "' "; 

このクエリは、しかし正常に動作します -

// string strUpdate = "SELECT COMMENT FROM TABLE WHERE NUMBER = '" + strNumber + "' AND CODE = '" + c.Trim() + "'"; 

は、テーブル名に変数を使用/ parametriseすることは可能ですか?

+3

SQLインジェクションのリスクが高いことが検出されました! – dotctor

+0

コードをデバッグして 'tablename'の値をチェックしましたか? strUpdateに割り当てられたSQLクエリ文字列を表示します。あなたのテーブル名は? –

+0

はい私はSQLインジェクションの脆弱性に気づいていますが、この問題を最初に解決する必要があります。そして、はい、デバッグ時にテーブル名がtablenameで正しい – user6097989

答えて

1

SQLインジェクションのリスクはさておき、単に同じではありません2つのに示すクエリ。

あなたが示したクエリが

string strUpdate = "SELECT COMMENT FROM TABLE WHERE NUMBER = "など

あるしかし、あなたが示したコードは、次のクエリを生成します。

string strUpdate = "SELECT COMMENT FROM 'TABLE' WHERE NUMBER = "など

テーブル名だけではないはず引用符で囲みます。あなたがパラメータを使用していないという事実を考えれば、これはパラメータシステムの欠陥でさえありません。引用符は、独自のクエリ構築コードの中にあります。削除するだけです。

+1

こんにちは、私はどちらかの側から引用符を削除し、うまくいきます。私はまた、すべてのSQLインジェクションコメントを考慮に入れました。 – user6097989

1

なぜfrom文でqoutesを使用していますか?

select sysdate 
from dual; 

また、SqlCommandクラスを使用して、次のように選択ステートメントにパラメータを追加します。

string strUpdate = "SELECT COMMENT FROM @tablename WHERE NUMBER = @strnumber AND CODE = @c"; 
SqlCommand insertCommand = new SqlCommand(strUpdate , connection); 
insertCommand.Parameters.AddWithValue("@tableName ", tableName); 
insertCommand.Parameters.AddWithValue("@strNumber ", strNumber); 
insertCommand.Parameters.AddWithValue("@c", c.trim()); 
+1

文字列パラメータとして追加されているので、テーブル名の前後に引用符は入れられませんか? – Nyerguds

+0

http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ –