Ошибка преобразования в процедуре SQL при выполнении из С#

У меня есть хранимая процедура SQL, которая использует команду openrowset, извлекает значения из листа Excel и вставляет их в базу данных.

Я создал приложение C#, которое будет вызывать процедуру и выполнять ее.

ПРОБЛЕМА!

Когда я выполняю процедуру из студии управления SQL, ошибок нет. Это происходит прекрасно. Но когда я запускаю его через приложение С#, я получаю сообщение об ошибке: «Ошибка преобразования при преобразовании даты и/или времени из символьной строки».

Код

SQL-запрос (только часть вставки)

insert into  tbl_item ([Item code],[Dt Created])

select[Item code] ,

case when [Dt Created] is null or [Dt Created]='' then null when ISDATE(CONVERT(nvarchar,CONVERT(datetime, [Dt Created],103))) =1 then CONVERT(datetime, [Dt Created],103) else null end as [Dt Created]    

FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0; Database=C:\Upload\Report.xlsx;HDR=YES;IMEX=1;',
                    'select * from [Sheet1$]')

Код C#

public int updateItem()
{
        SqlCommand cmd; cmd = new SqlCommand("usp_updateItem", conn); 
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
        returnParameter.Direction = ParameterDirection.ReturnValue;
        try
        {
            if (conn.State.Equals(ConnectionState.Closed))
                conn.Open();
            cmd.ExecuteNonQuery();
            ret = Convert.ToInt32(returnParameter.Value);
        }
        catch (Exception e)
        {
            err = "Error: " + e.Message;
            return -1;
        }
        finally
        {
            conn.Close();
        }
        return ret;
    }

person Linda    schedule 18.11.2015    source источник
comment
Я думаю, вы забыли вставить свой КОД :D :P   -  person Mohit Shrivastava    schedule 18.11.2015
comment
Код C # - это просто ExecuteNonQuery... Просто вызов процедуры SQL.. Так что не стал его публиковать :)   -  person Linda    schedule 18.11.2015


Ответы (3)


Какой формат у вас в переменной [Dt Created].

оператор convert, который у вас есть в этом случае, будет преобразовывать только следующие типы ниже

ГГГГ-ММ-ДД

ГГГГ-ДД-ММ

ДД-ММ-ГГГГ

Ошибка, которую вы получаете, связана с тем, что у вас есть дата в формате MM-DD-YYYY, что-то вроде «12-24-2015». Из-за этого вы получаете ошибку преобразования.

person Karthik Venkatraman    schedule 18.11.2015

Извините, я хочу остановить вас здесь. Теперь ваша проблема решена, но все, что сказал Картик Венкатраман, верно. Каким-то образом вы получили решение, но для целей обучения я рекомендовал изучить немного больше. Это не относится к тому, что вы сказали, но, черт возьми, это относится к формату даты.

**

Одна хитрость

Создайте одну DateTimeVariable и после ее инициализации просто проанализируйте ее с помощью класса DateTimeParse в соответствии с записями, существующими в базе данных.

Я уверен, что вы получите решение .. Спасибо :)

person Karna    schedule 25.11.2015

Вот как я наконец решил это...

Сообщение об ошибке SQL «Ошибка преобразования» было абсолютно неправильным указателем. Это не имело никакого отношения к рассматриваемой проблеме. [Если бы я только знал это раньше :( ]

Фактическая проблема заключалась в том, что я вызвал другую процедуру в основной процедуре, которую я разместил выше. Эта установка отлично работала в студии управления SQL, которая работала под моими учетными данными. Теперь в приложении C# я создал еще один идентификатор пользователя для входа в SQL для его запуска. И у этого идентификатора пользователя не было разрешения на выполнение подпроцедуры. И по иронии судьбы, SQL дал мне вводящую в заблуждение ошибку преобразования. Как только я дал правильное разрешение, все заработало отлично.

person Linda    schedule 25.11.2015