2009-07-29 9 views
1

私はそうのように、コマンドパラメータとしてクエリのテーブル名を提供したい:"SELECT * from E'mytable'"(単一引用符を気に)エラーになり:これは、このクエリの結果のようですNpgsqlでコマンドパラメータとしてクエリのテーブル名を指定する方法はありますか?

public class Foo 
{ 
    private const String myTableName = "mytable"; 

    public void Bar() 
    { 
     NpgsqlCommand command = new NpgsqlCommand("SELECT * from :tableName", connection); 
     command.Parameters.Add(new NpgsqlParameter("tableName", DbType.String)); 
     command.Parameters[0].Value = myTableName; 
    } 
} 

本当にこれを行うには文字列連結が必要ですか?テーブル名は、ユーザーが変更することができないため、セキュリティの観点から、それを問題ではありませんが、SQLクエリを作成するための文字列の連結はいつも私にゾッとを与える...

おかげで、 エリック

答えて

3

テーブル名パラメータとして送信することはできません。テーブル名は、パース時に解決されます。プランニング時などに必要になるためです。パラメータは、エグゼキュータ(または必要に応じてオプティマイザ)の時刻に置き換えられます。

だから、文字列の置換を使用する必要があります。もちろん、テーブル名があなたのクラスのconstから来ている限り、セキュリティ上の問題(または1つになる危険性さえありません)ではありません。

しかし、ユーザー入力からテーブル名を構成する場合は、非常に注意する必要があります。しかし、通常、ユーザー入力からテーブル名を構築する必要がある場合は、最初にデータベースに設計されたものがあり、修正する必要があります(もちろん例外はあります)。

+0

テーブル名は常に定数です。ありがとう。 – EricSchaefer

関連する問題