c#中SQL update语句的日期问题
本文关键字:日期 问题 语句 update SQL | 更新日期: 2023-09-27 18:13:50
我在表中有一个日期字段,显示为日-月-年小时。分钟。秒,当有相同的Ertnumber和Date时,我试图更新HOUR字段。我可以让字段更新相同的Ertnumber,但当我试图确保日期是相同的,我得到一个错误。我有麻烦使我的DateTime格式与sql相同。我在c#中创建了DateTime:
DateTime dateStamp = new DateTime(2013, 2, 14, 1, 0, 0);
这是我的更新字符串。
String.Format("update sdeadmin.meter_data_fixed_network set HOUR{2} = {0} where ERTNUMBER = '{1}' and DATETIME = '{3}'", this.Read, this.ertNumber, this.Stamp.Hour, this.DateStamp.ToString("MMddyyyyHHmmss"));
试着这样做:SQL查询的日期时间参数您应该执行参数化查询,而不是String.Format()
参数化查询应该可以解决这个问题;然而,你的问题实际上分为两部分;您需要首先构建一个查询,该查询引用一个可以更改的列名、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);
这将构建您的基本查询-您知道有一个参数化查询,将更新sdeadmin.meter_data_fixed_network
的HOUR
列。剩下的就是创建一个连接对象,一个命令对象,并在执行它之前为它添加参数。
//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也会显式地关闭它。
(假设你指的是SQL Server): SQL Server使用的最佳日期格式是ISO 8601:
名称HHmmss .
然而,用字符串写SQL。格式是一种糟糕的做法。使用带有参数和格式的System.Data.SQLClient.SQLCommand。
DateTime dateStamp = new DateTime(2013, 2, 14, 1, 0, 0);
System.Data.SQLClient.SQLConnection cxn; // make sure to set this up and open it
System.Data.SQLClient.SQLCommand cmd = new System.Data.SQLClient.SQLCommand(
String.Format("update sdeadmin.meter_data_fixed_network set HOUR{0} = @value where ERTNUMBER = @ert and DATETIME = @date", this.Stamp.Hour)
,cxn );
cmd.Parameters.Add(new SqlParameter("@value", this.Read);
cmd.Parameters.Add(new SqlParameter("@ert", this.ertNumber);
cmd.Parameters.Add(new SqlParameter("@date", this.Stamp);
cmd.ExecuteNonQuery();