изменение формата даты и времени при oledbCommand.executeNonQuery - PullRequest
0 голосов
/ 07 мая 2020

У меня есть запрос на вставку sql на моем веб-сайте, который вставляет несколько строк и целых чисел и дату и время в формате «дд / мм / гггг ЧЧ: мм: сс», и до сегодняшнего дня он работал отлично. однако с сегодняшнего дня, по какой-то странной причине, во время метода executeNonQuery запроса формат даты и времени изменяется на «ММ / дд / гггг ЧЧ: мм: сс». Я понятия не имею, почему это происходит, и это сводит меня с ума. Кто-нибудь может пролить свет на то, почему это происходит и как я могу предотвратить это изменение? будет приветствоваться любая помощь.

запрос:

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

o - объект, содержащий все данные.

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Большая проблема при попытке построить запрос при объединении строк. Это ОГРОМНАЯ вещь для воздействия SQL -инъекции. Лучший способ сделать это - использовать ПАРАМЕТРИЗОВАННЫЕ запросы, и вы можете просмотреть все и найти их, вы, вероятно, просто не знали о них.

Обычно в вашем запросе вы используете "?" в качестве заполнителя для нужного параметра, затем добавьте объект параметра с фактическим значением / типом данных, и запрос OleDb поместит его на свое место и будет иметь правильный тип данных, поэтому вам не нужно беспокоиться о форматировании строки от даты в порядке c.

Также, для имен, что, если бы у вас было имя человека «О'Коннер». Вы только что завершили строку запроса и в противном случае потерпите неудачу. Вы бы сильно почесали голову.

Сказав все это, давайте вернемся к вашему запросу, сделаем его немного более читаемым и параметризуем его ...

Вы ссылаетесь на ms- доступ как к базе данных, так и к 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()
}
0 голосов
/ 08 мая 2020

Значение DateTime не имеет формата, но если вы sh объединяете, принудительно форматируйте строковое выражение для значения:

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

Тем не менее, гораздо проще использовать параметры.

...