3

次のように、クエリのテーブル名をコマンドパラメータとして指定したいと思います。

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クエリを作成するための文字列の連結により、常に不気味になります...

ありがとう、エリック

4

1 に答える 1

5

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

そうですね、文字列の置換を使用する必要があります。もちろん、テーブル名がクラスのconstに由来する限り、セキュリティの問題ではありません(または、セキュリティの問題になるリスクさえありません)。

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

于 2009-07-30T09:20:58.093 に答える