查询的参数化应该可以解决这个问题;但是,您的问题实际上分为两部分;您需要首先构建引用可以更改的列名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 也将显式关闭它。