2016-01-28 2 views
1

У меня возникла проблема с датами моей программы на хранимую процедуру в SQL.Ошибка преобразования типа данных Nvarchar в datetime из VB.NET

Моя программа принимает дату из таблицы первенствовать и разбирает его как таковой:

  tempDate = Date.FromOADate(exWS.Cells(exRow, myMatchedColumns(2)).value) 
      Dim format() = {"dd/MM/yyyy", "dd-MM-yyyy", "yyyy-MM-dd"} 
      dueDate = Date.ParseExact(tempDate, format, 
      System.Globalization.DateTimeFormatInfo.InvariantInfo, 
      Globalization.DateTimeStyles.None) 

DueDate является «ДАТА» переменная поэтому я предполагаю, в этом пункте «DueDate» является универсальным объектом Дата. Я думаю, что это был лучший способ разобрать BOTH английскую региональную дату и Polish даты, так как это будет использоваться на польском компьютере.

Однако при передаче значения моей хранимой процедуры:

 mySQLString = "EXEC bsp.PartPrice_sp " & _ 
      "'" & dueDate & "', " & _ 
      "'" & myPartID & "', " & _ 
      "'" & currency & "'" 

Английский посылает EXEC bsp.PartPrice_sp '01/09/2015', 'L555', 'USD', который возвращает цену.

Польские посылает EXEC bsp.PartPrice_sp '2015-09-01', 'L555', 'USD', который берет на себя ошибку:

The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.

Я понимаю ошибку, но следующее выполнение хранимой процедуры, польская машина послала 2015-09-10, возвращающую цену штраф. Я предполагаю, что с 2015-10-09 все еще находится в радиусе действия, но интересно вернула правильную цену на 10 сентября 2015 года.

Тем не менее, я изо всех сил стараюсь найти универсальный способ выполнения хранимой процедуры на английском и польском языках. Любая помощь, которую вы можете дать правильно разобрать даты, что также делает SQL счастливым, было бы потрясающе.

Спасибо.

Программа написана на VB .NET.

P.S Если изменить @duedate в хранимой процедуре из NVARCHAR к DateTime, я получаю:

Error converting data type varchar to datetime.

Ошибка, который я предполагаю, что это из формата английского. Большое спасибо.

+0

Try 'DueDate = duedate.ToString ("d", System.Globalization.CultureInfo.CreateSpecificCulture ("EN-US"))' –

+0

Спасибо за Ваш комментарий, он выглядит хорошо, за исключением функции ToString принимает целое число, не строка и не принимает второй параметр? Я получаю слишком много ошибок Аргументов. Благодарю. – MikeS

+0

Я тебя не понял .. !!(Функция _ToString принимает целое число, а не строку и не принимает второй параметр? _ Уточняет это), и этот метод работает без каких-либо ошибок, см. [This] (https://dotnetfiddle.net/QMakBO) и попробуйте это 'duedate = Формат (duedate," dd/MM/yyyy ")' –

ответ

0

Форматы даты в встроенных непараметризированных запросах являются одной из тех вещей, которые могут помочь вам избавиться от моего опыта.

Так -

  1. Если это вообще возможно вопрос SqlCommand с коллекцией SqlParameters, в который вы добавляете даты фактического типизированных переменных .Net. Гораздо безопаснее.
  2. Если вам действительно нужно поддерживать встроенный SQL по какой-то причине, never передать в региональных форматах даты. Они надежно ломаются по нечетным причинам. В идеале отправьте сервер YYYY-MM-DD hh: mm: ss.ms, но для безопасного запуска это через централизованную функцию - отчасти это проще, чем убедиться, что вы правильно вызываете формат .ToString() во всех местах, отчасти я в прошлом имел случайные серверы, жалующиеся даже на этот формат.
Смежные вопросы