0

我在表格中有一个日期字段,显示为 Day-Month-Year Hour.Minute.Seconds,当 Ertnumber 和 Date 相同时,我试图更新 HOUR 字段。我可以使用相同的 Ertnumber 更新该字段,但是当我尝试确保日期相同时出现错误。我在使我的 DateTime 格式与 sqls 相同时遇到了麻烦。我通过以下方式在 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"));
4

3 回答 3

4

尝试执行以下操作: SQL 查询的日期时间参数 您应该执行参数化查询,而不是 String.Format()

于 2013-05-15T17:02:12.727 回答
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

参数化查询有几个优点:

  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 也将显式关闭它。

于 2013-05-15T17:12:31.383 回答
0

(假设您的意思是 SQL Server):与 SQL Server 一起使用的最佳日期格式是 ISO 8601:

yyyyMMdd HHmmss。

但是,使用 String.Format 编写 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();
于 2013-05-15T17:09:24.153 回答