3


1

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

これは次の問い合わせの結果と思われます: `` SELECT * from E’mytable '' `これはエラーになります(一重引用符に注意してください)。

これには本当に文字列の連結が必要ですか? セキュリティの観点からは関係ありません。テーブル名はユーザーが変更することはできませんが、SQLクエリを作成するための文字列の連結は常に私に不快感を与えます

ありがとう、エリック

1 Answer


5


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

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

ただし、ユーザー入力からテーブル名を作成する場合は、注意が必要です。 しかし、通常、ユーザー入力からテーブル名を作成する必要がある場合は、最初にデータベース内で何かが適切に設計されていないため、修正する必要があります(もちろん、例外はあります)。