Обходной путь для ASP, вызывающего исключение MySQL

#c# #asp.net #mysql #exception #error-handling

#c# #asp.net #mysql #исключение #обработка ошибок

Вопрос:

Это потребует некоторых объяснений. Я новичок в ASP, пришел с PHP. Совершенно другой мир. Используя библиотеку MySQL Connecter / Net, я решил создать оболочку базы данных, которая имела бы достаточное количество методов выборки, одним из которых был метод «FetchColumn ()», который просто принимает строку в качестве своего параметра и использует следующую реализацию:

 public object FetchColumn(string query)
        {
            object result = 0;

            MySqlCommand cmd = new MySqlCommand(query, this.connection);

            bool hasRows = cmd.ExecuteReader().HasRows;

            if (!hasRows)
            {
                return false;
            }

            MySqlDataReader reader = cmd.ExecuteReader();

            int count = 0;

            while(reader.HasRows)
            {
                result = reader.GetValue(count);
                count  ;
            }

            return resu<
        }�          return resu<
        }public object FetchColumn(string query)
  

То, что я ищу, — это способ вернуть false ТОГДА и только тогда, когда запрос пытается получить результат, которого не существует. Проблема в том, что в моей реализации он выдает ошибку / исключение. Мне нужно, чтобы это, так сказать, «завершилось корректно» во время выполнения. Одна вещь, которую я должен упомянуть, это то, что при этой реализации приложение выдает ошибку, как только присваивается логическое значение «HasRows». Почему это так, я понятия не имею.

Итак, есть идеи?

Комментарии:

1. Боюсь, вам нужно ознакомиться с основами c #. Я не думаю result , что это будет то, что вы думаете. Вы должны иметь возможность пропустить второй вызов ExecutReader() . И для чего именно вы используете count ?

2. Команды выборки, которые принимают строки, опасны. Вы обнаружите, что ваша база данных очень быстро отключена, если вы не будете осторожны. Узнайте, как выполнить параметризованный запрос.

Ответ №1:

Трудно сказать наверняка, поскольку вы не опубликовали точное исключение, которое оно выдает, но я подозреваю, что проблема в том, что вы вызываете ExecuteReader команду, которая уже используется. Как говорится в документации:

Пока используется MySqlDataReader, связанное соединение MySqlConnection занято обслуживанием MySqlDataReader. В этом состоянии никакие другие операции с MySqlConnection, кроме его закрытия, выполняться не могут. Это имеет место до MySqlDataReader.Вызывается метод закрытия MySqlDataReader.

Вы вызываете, cmd.ExecuteReader() чтобы проверить, есть ли строки, а затем ExecuteReader() снова вызываете, чтобы получить данные из строк. Это не только не работает, потому что нарушает условия, изложенные выше, это было бы ужасно неэффективно, если бы это сработало, потому что для этого потребовалось бы два обращения к базе данных.

Следуя примеру, показанному в документе, на который я ссылался, я бы сказал, что вы хотите что-то вроде:

 public object FetchColumn(string query)
{
    MySqlCommand cmd = new MySqlCommand(query, this.connection);
    MySqlDataReader reader = cmd.ExecuteReader();
    try
    {
        bool gotValue = false;
        while (reader.Read())
        {
            // do whatever you're doing to return a value
            gotValue = true;
        }
        if (gotValue)
        {
            // here, return whatever value you computed
        }
        else
        {
            return false;
        }
    }
    finally
    {
        reader.Close();
    }
}
  

Я не уверен, что вы пытаетесь вычислить с HasRows помощью и count и т. Д., Но Это должно направить вас в правильном направлении.

Ответ №2:

вам нужно окружить код, вызывающий ошибку, предложением try

 try { 
    //The error throwing Code 
} 
catch (exception e)
{
    //Error was encountered
    return false   
}
  

Если код, вызывающий ошибку, выдает ошибку и выполняется оператор catch, если ошибка не выдается, оператор catch игнорируется

Ответ №3:

Прежде всего, попробуйте и поймайте

 try
        {
            //code
        }
        catch (Exception exp)
        {
            //show exp as message
        }
  

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

ПРИМЕЧАНИЕ: отметьте как ответ, если это решит вашу проблему