Member 11071741 Ответов: 2

Фатальная ошибка при выполнении команды на языке Си#


У меня есть ошибка при сохранении данных в моей базе данных mysql с помощью хранимой процедуры с использованием функции ниже



Он показывает ошибку во время выполнения "фатальная ошибка во время выполнения команды"..

Пожалуйста помочь

Что я уже пробовал:

public int Save(string sqlQuery, CommandType cmdtype, ArrayList arrIN)
        {
            int recAffected = 0;
            //SqlConnection con = new SqlConnection(connectionString);
            MySqlCommand sqlCmd = CreateCommand();
            try
            {
                sqlCmd.CommandText = sqlQuery;
                sqlCmd.CommandType = cmdtype;
                MySqlCommandBuilder.DeriveParameters(sqlCmd);
                for (int i = 0; i < arrIN.Count; i++)
                {
                    sqlCmd.Parameters[i].Value = arrIN[i];
                }
                recAffected = sqlCmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Exception("Exception occured @ save " + ex.Message);
            }
            finally
            {
                sqlCmd.Dispose();
            }
            return recAffected;
        }




Хранимая процедура выглядит следующим образом

CREATE DEFINER = 'root'@'localhost'
PROCEDURE escort.sp_escortreqdets_ins(
  IN intRqstN int(10), 
  IN dtofEscor DATE, 
  IN tmofEscor TIME, 
  IN varCour VARCHAR(50), 
  IN varCourtPlac VARCHAR(50), 
  IN intCountPrsnr int(5), 
  IN varTyp VARCHAR(30), 
  IN intStron INT(2), 
  IN varRmk VARCHAR(255), 
  IN varStatu VARCHAR(20), 
  IN yrYea YEAR, 
  IN intUse int(5), 
  IN dtofRe DATE)
BEGIN
  IF EXISTS(select intRqstN from tb_escortreq_dets where intRqstNo=intRqstN and yrYear=yrYea) THEN
              BEGIN
                UPDATE escort.tb_escortreq_dets SET
                     intRqstNo=intRqstN
                     ,dtofEscort=dtofEscor
                     ,tmofEscort=tmofEscor
                     ,varCourt=varCour
                     ,varCourtPlace=varCourtPlac
                     ,intCountPrsnrs=intCountPrsnr
                     ,varType=varTyp
                     ,varStatus=varStatu
                     ,intStrong=intStron
                     ,varRmks=varRmk
                     ,varStatus=varStatu
                     ,yrYear=yrYea
                     ,intUser=intUse
                     ,dtofReg=dtofReg;
                END;
              ELSE
                BEGIN
                    INSERT INTO escort.tb_escortreq_dets
                    (
                      intRqstNo
                     ,dtofEscort
                     ,tmofEscort
                     ,varCourt
                     ,varCourtPlace
                     ,intCountPrsnrs
                     ,varType
                     ,intStrong
                     ,varRmks
                     ,varStatus
                     ,yrYear
                     ,intUser
                     ,dtofReg
                    )
                    VALUES
                    (
                     intRqstN
                     ,dtofEscor
                     ,tmofEscor
                     ,varCour
                     ,varCourtPlac
                     ,intCountPrsnr
                     ,varTyp
                     ,intStron
                     ,varRmk
                     ,varStatu
                     ,yrYea
                     ,intUse
                     ,dtofRe
                    );
                    END;
  END IF;
END

Maciej Los

Пробовали ли вы отлаживать свой код, чтобы выяснить, что количество параметров и их имена совпадают с инструкцией SQL?

2 Ответов

Рейтинг:
1

Jochen Arndt

Убедитесь, что sqlQuery это имя вашей хранимой процедуры и что cmdtype является StoredProcedure.

Убедитесь также, что количество элементов массива соответствует количеству параметров процедуры, что они представлены в правильном порядке и что они имеют правильный формат.

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

,varRmks=varRmk
где имя поля отличается от имени параметра.

В крайнем случае вы можете использовать "обычную" команду для обновления и, когда это сработает, скопировать команду в хранимую процедуру. Преимущество этого заключается в том, что вы получаете более подробное сообщение об ошибке, указывающее также, где в командной строке произошла ошибка.


Member 11071741

Спасибо за ваш ценный комментарий.
Хранимая процедура прекрасно работает в окне запроса mysql, но не в моем приложении.

Jochen Arndt

Тогда наиболее вероятной причиной являются недопустимые параметры.
Я предлагаю проверить их, распечатав или записав в журнал.

Проверка правильного количества параметров может быть выполнена путем сравнения sqlCmd.Parameters.Считай с аррином.Рассчитывать.

Member 11071741

Спасибо.
Я нашел причину.
Проблема заключается в линии
ArIn.Add(Конвертировать.Объект todatetime(mtTime.Текст).ToString("HH:mm:ss"))
В хранимой процедуре mysql это поле находится в формате времени.
Избегая этого поля, он работает.
пожалуйста помочь

Jochen Arndt

Поле времени использует этот формат. Так что это должно сработать. Чтобы быть уверенным, вы должны распечатать строку.

Рейтинг:
1

#realJSOP

Попробовать это:

public int Save(string sqlQuery, CommandType cmdtype, ArrayList arrIN)
{
    int recAffected = 0;
    try
    {
        using (SqlConnection con = new SqlConnection(connectionString))
        {
            using (MySqlCommand sqlCmd = CreateCommand())
            {
                sqlCmd.CommandText = sqlQuery;
                sqlCmd.CommandType = cmdtype;
                MySqlCommandBuilder.DeriveParameters(sqlCmd);
                for (int i = 0; i < arrIN.Count; i++)
                {
                    sqlCmd.Parameters[i].Value = arrIN[i];
                }
                recAffected = sqlCmd.ExecuteNonQuery();
            }
        }
    }
    catch (Exception ex)
    { // put a breakpoint on this bracket and examine <code>ex</code>. It will tell you what 
      // went wrong. You may have to look at the InnerException to find out the root cause 
      // of the problem.
        throw new Exception(string.Format("Exception occured @ save {0}", ex.Message), ex);
    }
    return recAffected;
}


Используя using оператор автоматически обрабатывает всю очистку, требуемую одноразовыми объектами, и требует меньше кода для загрузки.

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