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"));

c#中SQL update语句的日期问题

试着这样做: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_networkHOUR列。剩下的就是创建一个连接对象,一个命令对象,并在执行它之前为它添加参数。

例如:

//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
参数化查询有以下几个优点:
  1. 可以帮助防止sql注入攻击
  2. 许多数据库引擎可以为参数化查询重用执行计划,从而提高性能

@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();