Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > ExecuteNonQuery


Автор: Atiskara 10.4.2009, 16:43
при выполнении ExecuteNonQuery возникает исключительная ситуация Cannot convert int to tinyint.. Причем есть 2 базы на mssql, одна тестовая, другая боевая. В тестовой никаких ошибок не возникает. В боевой ошибка возникает у последних зарегенных юзеров, у ранних работает норм, точную временную границу между ними не могу сказать. Подскажите, хотя бы где искать ошибку, в базе или в коде? Код не мой, но баг надо найти мне. С шарпом знакома поверхностно, а шарп вс асп вижу вообще впервые. Или как нужно обработать исключение, чтобы значение возвращалось?

наверно кусок кода мало что скажет
Код

StoredProcedure SP = new StoredProcedure("CHANGERECEIVERDATA", pr);
            SP.ConnectionOpen();
            SP.ExecuteNonQuery();
            SP.ConnectionClose();
            
            if((byte)SP.getParameter(1).Value == 0)
            {
                return 0;
            }
            else
            {
                     return 1;
            }    


после обработки SP.ExecuteNonQuery() параметр (byte)SP.getParameter(1).Value не всегда получает значение...

Код

        public int ExecuteNonQuery()
        {
            try
            {
            sqlCmd.ExecuteNonQuery();
            return 1;
            }
            catch (System.Exception uex)
            {
                System.Console.WriteLine("{0} какая то исключительная ситуация", uex.GetType().ToString());
                System.Console.WriteLine(uex.Message);
                return 0;
            }
            
        }

Автор: archeg 10.4.2009, 16:51
До (byte)SP.getParameter(1).Value дебаггер не доходит? Если нет - то ошибка в базе. Покажи код процедуры. И если в одной есть ошибка - а в другой нету, то либо там процедуры разные, либо какие-то настройки. 

Автор: Idsa 10.4.2009, 16:52
Atiskara, посмотрите, какие типы у параметров хранимки и используйте аналогичные типы из .NET: тогда не будет проблем с приведением типов и пропаданием значений.

Автор: Atiskara 10.4.2009, 16:58
Код

        public int ExecuteNonQuery()
        {
         //   try
         //   {
            sqlCmd.ExecuteNonQuery();
          //  return 1;
          

когда я трай кетч убираю, то вот здесь возникает ошибка sqlCmd.ExecuteNonQuery();, ну а если с обработкой, то вот if((byte)SP.getParameter(1).Value == 0)

Добавлено через 12 минут и 42 секунды
Цитата(Idsa @ 10.4.2009,  16:52)
Atiskara, посмотрите, какие типы у параметров хранимки и используйте аналогичные типы из .NET: тогда не будет проблем с приведением типов и пропаданием значений.

Хранимка это наверно процедура, где все это выполняется?

Код

                         private int changerecdata()
        {
            System.Data.SqlClient.SqlParameter [] pr = new System.Data.SqlClient.SqlParameter[14];
            pr[0] = new System.Data.SqlClient.SqlParameter("@transferid",SqlDbType.Int);
            pr[1] = new System.Data.SqlClient.SqlParameter("@result",SqlDbType.TinyInt);  // хм.. тут инт чтоли указать?
            pr[2] = new System.Data.SqlClient.SqlParameter("@rec_sattid",SqlDbType.Int);

            ...

            StoredProcedure SP = new StoredProcedure("CHANGERECEIVERDATA", pr);
            SP.ConnectionOpen();
            SP.ExecuteNonQuery();
            SP.ConnectionClose();
            
            if((byte)SP.getParameter(1).Value == 0)
            {
                return 0;
            }
            else
            {
                     return 1;
            } 
           ... 

Автор: Idsa 10.4.2009, 17:23
Цитата(Atiskara @  10.4.2009,  20:58 Найти цитируемый пост)
 // хм.. тут инт чтоли указать?

Там нужно указать тип, сооветствующий типу, прописанному в хранимой процедуре в СУБД.

Автор: archeg 10.4.2009, 17:23
Цитата(Atiskara @  10.4.2009,  16:58 Найти цитируемый пост)

Хранимка это наверно процедура, где все это выполняется?

Имелся ввиду код процедуры который на сервере ;)

Автор: Atiskara 10.4.2009, 17:30
бррр.. а я не знаю, что с чем сравнивать  smile .. То что я выше привела и есть процедура на сервере.. а вот этот параметр  (byte)SP.getParameter(1).Value должен получать единичку, или хотя бы занчение, и фиг его знает, куда в базе его записывает...

Добавлено через 8 минут и 56 секунд
Код

pr[0].Value = (int)Session["transfer_id"];
            pr[1].Direction = ParameterDirection.Output;
            pr[2].Value = Session["rec_sattid"];


вообще непонятно, как этот Value для pr[1] получает значение... Для старых пользователей, это значение откуда то присваивается при выполнении ExecuteNonQuery, а для последних нигде не присваивается.

Автор: Partizan 10.4.2009, 18:33
Цитата

То что я выше привела и есть процедура на сервере


Нет...код процедуры хранится в самой СУБД....

Автор: Idsa 10.4.2009, 18:37
Цитата(Partizan @  10.4.2009,  22:33 Найти цитируемый пост)
Нет...код процедуры хранится в самой СУБД....

Я бы даже сказал, в самой БД  smile 

Автор: Atiskara 13.4.2009, 06:40
ура, спасибо спасибо люди всем.. нашлась ошибка  smile и не совсем там где я искала

Код

pr[13] = new System.Data.SqlClient.SqlParameter("@user",SqlDbType.Int);


действительно тип в этой строчке, и тип в базе отличались. Конечно осталось загадкой, почему иногда все работало, а иногда нет...

Автор: Idsa 13.4.2009, 06:56
Цитата(Atiskara @  13.4.2009,  10:40 Найти цитируемый пост)
Конечно осталось загадкой, почему иногда все работало, а иногда нет... 

Никакой загадки в этом нет. Просто иногда возвращалось значение, которое умещалось в TinyInt и приведение типов проходило без проблем, а иногда возвращаемое значение превышало границы TinyInt - соответственно, при приведение типа генерировался Exception.

Автор: Atiskara 13.4.2009, 07:06
ааа..  smile все, понял... я люблю этот форум, 3 раза обращалась сюда, и три раза он меня спасал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)