Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C# ошибка в вызове хранимой процедуры 
:(
    Опции темы
KingLamer
Дата 23.8.2011, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.8.2011

Репутация: нет
Всего: нет



Добрый день, мастера С#. Не знаю даже с чего начать, в общем работаю сейчас над слиянием двух одинаковых баз. Для переноса информации из одной базы в другую использую хранимые процедуры.(база MS SQL 2005). Но возникает вот какая проблема, первую запись мой вызов добавляет нормально, зато следующую не хочет, пишет вот какую ошибку

String or binary data would be truncated.
Warning: Null value is eliminated by an aggregate or other SET operation.
The statement has been terminated.



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


Код

 cmd.Connection = connect2;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "ADD_RESOLUTION";
            cmd.Parameters.Add("@an_kind_resolution", SqlDbType.Int); 
            cmd.Parameters.Add("@an_isn_ref_doc", SqlDbType.Int);   
            cmd.Parameters.Add("@an_isn_parent_resolution", SqlDbType.Int);
            cmd.Parameters.Add("@an_isn_author", SqlDbType.Char);
 
 for (int j = 0; j <= dataSet.Tables[0].Rows.Count; j++)
   {
  cmd.Parameters["@an_kind_resolution"].Value = dataSet.Tables[0].Rows[j]["KIND_RESOLUTION"];
  cmd.Parameters["@an_isn_ref_doc"].Value = dataSet.Tables[0].Rows[j]["ISN_REF_DOC"];
 
        if (dataSet.Tables[0].Rows[j]["ISN_PARENT_RESOLUTION"].ToString().Length > 0)
           {
   int index = Isn_Resol_Old.IndexOf(dataSet.Tables[0].Rows[j]"ISN_PARENT_RESOLUTION"].ToString());
   string isn_parent_resol = Isn_Resol_New[index].ToString();
   cmd.Parameters["@an_isn_parent_resolution"].Value = isn_parent_resol;                    
            }
            else
      cmd.Parameters["@an_isn_parent_resolution"].Value = System.DBNull.Value;
      cmd.Parameters["@an_isn_author"].Value = dataSet.Tables[0].Rows[j]["Author"];
      cmd.Prepare();
      cmd.ExecuteNonQuery();
}



Это сообщение отредактировал(а) KingLamer - 23.8.2011, 11:31
PM MAIL   Вверх
KingLamer
Дата 23.8.2011, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.8.2011

Репутация: нет
Всего: нет



Сейчас кстати для примера попробовал создать мелкую процедуру 



Код

CREATE PROCEDURE MyProc ( 
@inggggg INTEGER,
@out INTEGER OUTPUT)
as
begin
set @out = @inggggg + 1
end


Код

 connect2.ConnectionString = ConnStr_New;
            connect2.Open();
            cmd.Connection = connect2;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "MyProc";
            //описание параметров   
            cmd.Parameters.Add("@inggggg", SqlDbType.Int);
            cmd.Parameters.Add("@out", SqlDbType.Int);
            cmd.Parameters["@out"].Direction = ParameterDirection.Output;

            for (int j = 0; j < 10; j++)
            {
                cmd.Parameters["@inggggg"].Value = 1;
                cmd.Parameters["@out"].Value = null;
                
                cmd.ExecuteReader();
                cmd.Dispose();
                string gfg = cmd.Parameters["@out"].Value.ToString();
            }


И вот только начинаю делать повторный вызов данной процедуры, как он выдает мне вот такую ошибку.

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

Это сообщение отредактировал(а) KingLamer - 23.8.2011, 11:58
PM MAIL   Вверх
jonie
Дата 23.8.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(KingLamer @  23.8.2011,  12:30 Найти цитируемый пост)

String or binary data would be truncated.
Warning: Null value is eliminated by an aggregate or other SET operation.
The statement has been terminated.


это ошибка MSSQL, а не C#. В одном случае ты пихаешь строку длинную в более короткую колонку (переменную), в другом используешь агрегат на наборе, содержащем NULL-ы. Бери трассировщик (MSSQL Server Profiler) и смотри с какими параметрами вызываешь хранимку (или в дебаге смотри) и почему твоя хранимка валится с такими ошибками.

Цитата


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

а это потому что возращаемый IDataReader не закрываешь тут:
Цитата

  
Код

              cmd.ExecuteReader();


используй ExecuteNonQuery() если тебе не нужны возращаемые из MSSQL данные.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
KingLamer
Дата 23.8.2011, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.8.2011

Репутация: нет
Всего: нет



Цитата(jonie @  23.8.2011,  12:07 Найти цитируемый пост)

это ошибка MSSQL, а не C#. В одном случае ты пихаешь строку длинную в более короткую колонку (переменную), в другом используешь агрегат на наборе, содержащем NULL-ы. Бери трассировщик (MSSQL Server Profiler) и смотри с какими параметрами вызываешь хранимку (или в дебаге смотри) и почему твоя хранимка валится с такими ошибками.



а почему он выдает такую ошибку только на второй проход? Даже если у меня в первый и второй раз выполнения передаются абсолютно идентичные записи?

Цитата(jonie @  23.8.2011,  12:07 Найти цитируемый пост)
используй ExecuteNonQuery() если тебе не нужны возращаемые из MSSQL данные. 


Ой, да, что-то я тупанул слегка
PM MAIL   Вверх
KingLamer
Дата 23.8.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.8.2011

Репутация: нет
Всего: нет



Код

  cmd.Connection.Close();
                    cmd.Connection.Open();


Добавил вот эти 2 строчки после cmd.ExecuteNonQuery(); перестала выпадать ошибка, следовательно, у меня идет обращение к процедуре, такое ощущение как-будто она запоминает те параметры что я передавал и из-за этого идет переполнение и следовательно вызов ошибки. 
Как нибудь это возможно исправить?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0896 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.