【问题标题】:Insert DateTime into Sql Server 2008 from C#从 C# 将 DateTime 插入 Sql Server 2008
【发布时间】:2013-06-09 19:25:37
【问题描述】:

我已经尝试解决这个问题超过 2 小时,因此非常感谢任何帮助

  public void setAppointment(int studentID, DateTime appt)
    {
        connection.Open();

        string sqlStatement3 = "UPDATE dbo.students SET appointmentDate = '" + appt.Date.ToString("yyyy-MM-dd HH:mm:ss") + "' WHERE ID = " + studentID + ";";

        OleDbCommand updateCommand = new OleDbCommand(sqlStatement3, connection);            
        updateCommand.ExecuteNonQuery();

        connection.Close();
    }

所以基本上这样做是将日期时间插入到保持月份和日期格式相同的 sql server 表中,以避免区域设置妨碍。

唯一的问题是时间仍然是 00:00:00。即使当我调试代码时,“appt”显示 28/06/2013 09:30:00

【问题讨论】:

  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入

标签: c# sql datetime sql-server-2008-r2 datetime-format


【解决方案1】:

下面试试

 public void setAppointment(int studentID, DateTime appt)
        {
            connection.Open();

            string sqlStatement3 = "UPDATE dbo.students SET appointmentDate = ? WHERE ID = ?";

            OleDbCommand updateCommand = new OleDbCommand(sqlStatement3, connection);
            updateCommand.Parameters.AddWithValue("@p1", appt);
            updateCommand.Parameters.AddWithValue("@p2", studentID);
            updateCommand.ExecuteNonQuery();

            connection.Close();
        }

但是!

你说它是 sql server 但你为什么使用OleDbCommand

如果是sql server,下面试试

public void setAppointment(int studentID, DateTime appt)
{
    using (SqlConnection con = new SqlConnection(connectionString))
    using (SqlCommand cmd = con.CreateCommand())
    {
        cmd.CommandText = "UPDATE dbo.students SET appointmentDate = @appointmentDate WHERE ID = @ID";
        con.Open();
        cmd.Parameters.AddWithValue("@appointmentDate", appt);
        cmd.Parameters.AddWithValue("@ID", studentID);
        cmd.ExecuteNonQuery();
    }
}

【讨论】:

  • +1 这是执行此操作的唯一安全方法 - 是的,对于 SQL Server,使用 SqlConnection / SqlCommand 而不是 OleDb 的东西更有意义。 ...
  • 第二个答案 - 带有参数 - 就像一个魅力。我以前使用过非参数化查询,但我遇到了各种各样的日期问题。有参数,没问题。
【解决方案2】:

第 5 行。 改变

...  appt.Date.ToString(...

... appt.ToString(...

【讨论】:

  • 如下所示的参数化查询既安全又快捷。您应该养成始终这样做的习惯 - 您不太可能遇到 int 和 datetime 的问题,但是当您将其用于字符串值时,您将引入 SQL 注入漏洞。
【解决方案3】:

我希望您已经解决了您在上一篇文章中遇到的问题,并且我同意将 SQL 语句与参数一起使用。

如果您的应用程序日期时间格式是固定的,那么硬编码并没有什么坏处,但是从您的 web.config 文件中获取日期时间格式将是很好的代码。这将帮助您的代码与整个项目保持一致。

代替

ToString("yyyy-MM-dd HH:mm:ss")

ToString(ConfigValue)

【讨论】:

    【解决方案4】:

    为时已晚,但对于您的问题:试试下面的代码。

    public void setAppointment(int studentID, DateTime appt)
            {
    
    connection.Open();
    
        string sqlStatement3 = "UPDATE dbo.students SET appointmentDate = '" + "CONVERT(datetime, '" + appt.Date.ToString("yyyy-MM-dd HH:mm:ss")  + "', 103)" + "' WHERE ID = " + studentID + ";";
    
        OleDbCommand updateCommand = new OleDbCommand(sqlStatement3, connection);            
        updateCommand.ExecuteNonQuery();
    
        connection.Close();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多