クエリのパラメーター化は、この問題を解決するはずです。ただし、問題は実際には 2 つの部分に分かれています。HOUR+stamp.Hour,
最初に、変更可能な列名とクエリ パラメータを参照するクエリを作成する必要があります。
したがって、次のようなものがうまくいくはずです。
string query =
String.Format("update sdeadmin.meter_data_fixed_network SET HOUR{0} = @read WHERE ERTNUMBER = @ertnumber AND DATETIME = @date;", this.Stamp.Hour);
HOUR
これにより、基本的なクエリが作成されます。 のそれぞれの列を更新するパラメータ化されたクエリがあることがわかりますsdeadmin.meter_data_fixed_network
。あとは、接続オブジェクト、コマンド オブジェクトを作成し、パラメータを追加してから実行するだけです。
例えば:
//Create the connection
using(SqlDbConnection connection = new SqlDbConnection("your_connection_string"))
{
//Create the Command
using(SqlDbCommand command = new SqlDbCommand(query))
{
//Set up the properties of the command and the parameters
command.CommandType = CommandType.Text;
command.Connection = connection;
command.Parameters.AddWithValue("@read", Read);
command.Parameters.AddWithValue("@ertnumber", ertNumber);
command.Parameters.AddWithValue("@date", DateStamp);
//Have to open the connection before we do anything with it
connection.Open();
//Execute the command. As we don't need any results back we use ExecuteNonQuery
command.ExecuteNonQuery();
}
}//At this point, connection will be closed and disposed - you've cleaned up
クエリをパラメーター化することには、いくつかの利点があります。
- SQL インジェクション攻撃の防止に役立ちます
- 多くのデータベース エンジンは、パラメーター化されたクエリの実行プランを再利用できるため、パフォーマンスが向上します。
@JeffAtwood は数年前にこのテーマについて書いています: http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html
また、 USINGステートメントの使用にも注意してください。これにより、それぞれの使用の範囲を離れるとすぐに、接続オブジェクトとコマンド オブジェクトが確実に破棄されます。.Net は制御できるリソースを管理しますが、ファイル ハンドル、データベース接続などの外部リソースは管理できないため、これは重要です。そのため、自分でクリーンアップすることが重要です。Dispose for Connection も明示的に閉じます。