Ошибка преобразования типа данных nvarchar в datetime в хранимой процедуре из кода - PullRequest
0 голосов
/ 24 января 2019

Я получаю следующую ошибку при вызове хранимой процедуры из C #.

параметры определены в коде как:

 if (repRIS.Length > 0)
    command.Parameters.AddWithValue("@repRIS", repRIS);
 else
    command.Parameters.AddWithValue("@repRIS", DBNull.Value);
  command.Parameters.Add("@invDt", OleDbType.Date).Value = invDate;

Я закомментировал все из хранимой процедуры и теперь имею только следующее:

ALTER PROCEDURE [dbo].[SearchDates]
    -- Add the parameters for the stored procedure here
     @invDt datetime,
     @repRIS varchar(10) ,

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

select this, that, and, the, other from myTableName ird
where
     ird.RIS = COALESCE(@repRIS, ird.RIS) 
     and ird.InventoryDate = @invDt
END

InventoryDate имеет тип DateTime в базе данных.

когда я запускаю SP из SQL MS, он дает результаты без проблем, однако при использовании приложения для его вызова я получаю следующее сообщение об ошибке

Ошибка преобразования типа данных nvarchar в datetime

Я заметил, что это начало происходить после того, как я переключился с SQLConnection на OLEDBConnection. Я еще не подтвердил это. (Мне пришлось переключиться, чтобы соответствовать тому, как остальная часть заявки была написана до меня)

UPDATE: когда я помещаю значение 30.09.2008 в текстовое поле, оно передается в хранимую процедуру как: {9/30/2018 12:00:00 AM} после преобразования в datetime (код выше)

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Я бы сказал, что Min Date не работает в SQL из C #, так как min C # Datetime и поддерживаемый SQL различаются.

Использование:

System.Data.SqlTypes.SqlDateTime.MinValue.Value

вместо предложенного MinC # Datetime.Это должно работать

0 голосов
/ 24 января 2019

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

В своем коде вы сначала добавляете @repRIS, и это первый параметр, передаваемый SP. Но SP ожидает дату для первого параметра, и вы получаете исключение

Вам необходимо изменить порядок вставки в коллекцию параметров или изменить порядок объявления параметров в SP

command.Parameters.Add("@invDt", OleDbType.Date).Value = invDate;     
if (repRIS.Length > 0)
    command.Parameters.AddWithValue("@repRIS", repRIS);
else
    command.Parameters.AddWithValue("@repRIS", DBNull.Value);

И еще одна вещь, которую нужно сделать, это взглянуть на эту статью Можем ли мы прекратить использовать AddWithValue уже?

...