2012-02-09 15 views
1

とのトラブル持つ:次のように私は、データベース内のテーブルを変更しようとしていますSQLとC#

using (SqlCeCommand com = new SqlCeCommand("INSERT INTO RamResults(Result, Date) VALUES(@num, @date)", con)) 
{ 
    com.Parameters.AddWithValue("@num", num); 
    com.Parameters.AddWithValue("@hostname2", hostname2); 
    com.Parameters.AddWithValue("@date", Form1.date); 
    com.ExecuteNonQuery(); 
} 

テーブル名は、変数の接頭辞(hostname2はを)持っていますがを。だから、私は次のことをやろうとしました:

("INSERT INTO @hostname2 + RamResults(Result, Date) VALUES(@num, @date)", con)) 

しかし、誰もこれを解決するためのアイデアはありますか?

エラーメッセージ:

クエリを解析エラーが発生しました。 [トークン行番号= 1、トークン 行オフセット= 13、トークンエラー中= @ホスト名2]

+5

テーブル名にSQLパラメータ(つまり、 '@')を使用することはできません。そして、私は同じことをするために文字列連結を提案するつもりはありません。 – Yuck

+2

残念ながら、それは実際に唯一の答えであることは示唆されませんが。しかし私はYuckに同意します - 問題は別の角度から解決されるべきです。たとえば、なぜ動的テーブル名プレフィックスが必要ですか? –

答えて

3

このような準備文を使用すると、@hostname2'value'に置き換えられます。
代わりstring.Format()を使用する必要があります。

string hostprefix = 'host2_'; // example 
string sql = string.Format("INSERT INTO {0}RamResults(Result, Date) "+ 
          " VALUES(@num, @date)", hostprefix); 
using (SqlCeCommand com = new SqlCeCommand(sql, con)) 
// .... 

だけあなたのhostprefixため、NOTユーザ入力をString.Formatのを使用します!これにより、SQLインジェクションを防ぐことができます。

0

パラメータでテーブル名を変更することはできません。その部分では、動的SQLを使用する必要があります。

0

「通常の」SQLと同様に、挿入するテーブルの名前をパラメータ化することはできません。

new SqlCeCommand(String.Format("INSERT INTO {0}RamResults (Result, Date) VALUES(@num, @date)", hostname2), con)) 

その後、もはやの@ hostname2にパラメータを設定/合格しない:このようなコードは

1

変更。 SQLのパラメータは動的SQLの生成と同じではありません。

関連する問題