【问题标题】:datetime format changes upon oledbCommand.executeNonQueryoledbCommand.executeNonQuery 更改日期时间格式
【发布时间】:2020-08-23 02:04:03
【问题描述】:

我的网站中有一个 sql 插入查询,它插入了一些字符串和整数,并在“dd/MM/yyyy HH:mm:ss”中插入了一个日期时间,直到今天它都运行良好。但是,从今天开始,出于某种奇怪的原因,在查询的 executeNonQuery 方法期间,日期时间的格式更改为“MM/dd/yyyy HH:mm:ss”。我不知道为什么会这样,这让我发疯。谁能解释一下为什么会发生这种情况以及我如何防止这种变化?任何帮助将不胜感激。

查询:

"INSERT INTO Orders(OrderDate,MemberID,CityID,OrderAdress,CreditCardID,OrderStatus)VALUES(#" + o.OrderDate + "#," + o.MemberID + ","+o.CityID+",'" + o.OrderAdress + "',"+o.CreditCardID+",'Not sent')" 

o 是一个包含所有数据的对象。

【问题讨论】:

  • 参数不是问题。出于某种奇怪的原因,我数据库中日期的格式与插入的日期不同

标签: sql datetime ms-access oledb executenonquery


【解决方案1】:

在连接字符串时尝试构建查询时出现大问题。这对于接触 SQL 注入来说是一件大事。最好的方法是使用 PARAMETERIZED 查询,您可以四处查看并找到它们,您可能只是不知道它们。

基本上在您的查询中,您使用“?”作为您想要的参数的占位符,然后添加具有实际值/数据类型的参数对象,OleDb 查询会将其放置在其位置并具有正确的数据类型,因此您不必担心格式化字符串从特定顺序的日期开始。

另外,对于名字,如果你有一个人的名字“O'Conner”。您刚刚预先终止了查询字符串,否则会失败。你会严重挠头的。

说了这么多,让我们回到您的查询,使其更具可读性,并对其进行参数化...

您将 ms-access 称为数据库和 OleDb,这意味着您使用 C#、VB 或其他语言编写。我将使用 C# 进行演示,您可以根据需要更改为您的开发语言。

using(OleDbConnection connection1 = new OleDbConnection( WhateverYourConnectionString ) 
{
   connection1.Open();  
   using(OleDbCommand sqlcmd = new OleDbCommand("", connection1))
   {
      // simplified query and you can see the "?" place-holders
      sqlcmd.CommandText =
@"INSERT INTO Orders
  ( OrderDate,
    MemberID,
    CityID,
    OrderAdress,
    CreditCardID,
    OrderStatus )
  VALUES
  ( ?,
    ?,
    ?,
    ?,
    ?,
    'Not sent' )";

      // Now, add your parameters in the SAME ORDER as the "?" in the query
      sqlcmd.Parameters.AddWithValue("parmForDate", o.OrderDate ); 
      sqlcmd.Parameters.AddWithValue("parmForMember", o.MemberID ); 
      sqlcmd.Parameters.AddWithValue("parmForCity", o.CityID ); 
      sqlcmd.Parameters.AddWithValue("parmForAddress", o.OrderAddress ); 
      sqlcmd.Parameters.AddWithValue("parmForCard", o.CreditCardID ); 
      // since the last parameter is fixed, you can put that in explicitly.
      // you can similarly put fixed field of other strings, numbers.

      // Now you can execute it
      sqlcmd.ExecuteNonQuery();
   }

   connection1.Close()
}

【讨论】:

    【解决方案2】:

    DateTime 值不包含任何格式,但如果您希望连接,请在该值的字符串表达式上强制使用格式:

    "INSERT INTO Orders(OrderDate,MemberID,CityID,OrderAdress,CreditCardID,OrderStatus) VALUES(#" + o.OrderDate.ToString("yyyy'/'MM'/'dd") + "#," + o.MemberID + "," + o.CityID + ",'" + o.OrderAdress + "'," + o.CreditCardID + ",'Not sent')" 
    

    不过,使用参数要简单得多。

    【讨论】:

    • 在查询之前我已经给了日期时间所需的格式。直到executeNonQuery,格式都很好。之后,它在数据库中发生变化
    • 同样,DateTime 值不带格式,因此数据库无法“更改”格式。
    猜你喜欢
    • 2013-06-29
    • 2017-05-13
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多