Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > C# ошибка в вызове хранимой процедуры


Автор: KingLamer 23.8.2011, 11:30
Добрый день, мастера С#. Не знаю даже с чего начать, в общем работаю сейчас над слиянием двух одинаковых баз. Для переноса информации из одной базы в другую использую хранимые процедуры.(база 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:57
Сейчас кстати для примера попробовал создать мелкую процедуру 



Код

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, который требуется предварительно закрыть.

Автор: jonie 23.8.2011, 12:07
Цитата(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 данные.

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

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



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

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


Ой, да, что-то я тупанул слегка

Автор: KingLamer 23.8.2011, 13:36
Код

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


Добавил вот эти 2 строчки после cmd.ExecuteNonQuery(); перестала выпадать ошибка, следовательно, у меня идет обращение к процедуре, такое ощущение как-будто она запоминает те параметры что я передавал и из-за этого идет переполнение и следовательно вызов ошибки. 
Как нибудь это возможно исправить?

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