Обходной путь для ASP, бросающего исключение MySQL - PullRequest
0 голосов
/ 13 октября 2011

Это займет некоторое объяснение. Я новичок в 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 result;
        }�          return result;
        }public object FetchColumn(string query)

То, что я ищу, это способ возврата false IF, и только если запрос пытается получить результат, который не существует. Проблема в том, что в моей реализации выдается ошибка / исключение. Мне нужно, чтобы это "изящно провалилось" во время выполнения, так сказать. Я должен упомянуть одну вещь: в этой реализации приложение выдает ошибку, как только присваивается логическое значение hasRows. Почему это так, я понятия не имею.

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

Ответы [ 3 ]

0 голосов
/ 13 октября 2011

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

Пока MySqlDataReader используется, связанный MySqlConnection занят обслуживанием MySqlDataReader. В этом состоянии никакие другие операции с MySqlConnection не могут быть выполнены, кроме как его закрытие. Это происходит до тех пор, пока не будет вызван метод MySqlDataReader.Close для 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, счетчика и т. Д., Но это должно указать вам правильное направление.

0 голосов
/ 13 октября 2011

Прежде всего попытайтесь поймать

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

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

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

0 голосов
/ 13 октября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...