2

こんにちは、データベースからデータを読み取るための一般的な方法を作成しようとしています。これまでのところ、次のとおりです。

private static void GetData(string tableName, string key, string values)
    {
        string connectionString = "data source=DB03RO;initial catalog=NCOI_Dev;User ID=NCOI_Olympus;Password=Olympus;persist security info=False;packet size=4096;Enlist=true;Transaction Binding=Explicit Unbind;";
        string commandText = @"SELECT @key , @value FROM @Name";
        SqlDataReader reader = null;

        using (var connection = new SqlConnection(connectionString))
        using (var cmd = new SqlCommand())
        {
            connection.Open();
            cmd.Connection = connection;
            cmd.Parameters.Add(new SqlParameter("@Name", tableName));
            cmd.Parameters.Add(new SqlParameter("@key", key));
            cmd.Parameters.Add(new SqlParameter("@value", values));
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = commandText;
            reader = cmd.ExecuteReader();

            while (reader != null)
            {
                string id = (string)reader[key];
                string data = (string)reader[values];
                Console.WriteLine(id + " " + data);
            }
        }
    }

リーダーを実行しようとすると、エラーが発生するようです。

テーブル変数「@Name」を宣言する必要があります。

この問題を修正するにはどうすればよいですか?

4

4 に答える 4

3

データベース オブジェクト (テーブル、列、ビューなど) の名前をパラメーター化されたクエリに置き換えることはできません。連結でのみ実行できます。

string commandText = String.Format("SELECT {0}, {1} FROM {2}", key, value, tableName);
于 2013-07-04T09:17:59.813 に答える
1

いいえ、テーブル名をパラメーター化することはできません。あなたはむしろただ使いたいstring.Format("SELECT @key , @value FROM [{0}]", tableName);

ただし、この方法では、SQL インジェクションに対して脆弱になります。しかし、ユーザー入力からテーブル名を取得していないと思います。また、チームの開発者は、時々入力できるような人ではありません'fake]; delete everything!!!'

于 2013-07-04T09:16:26.807 に答える
0

オブジェクト名は、TSQL では静的でなければなりません。

string.Format目標を達成するには、または同様のものを使用する必要があります。

類似の質問:変数としてのテーブル名

于 2013-07-04T09:20:58.090 に答える