Ошибка выделения памяти из драйвера MySql ODBC 5.1 в приложении C # в операторе вставки - PullRequest
5 голосов
/ 05 июня 2010

У меня есть приложение .NET Wndows в C #. Это простое приложение для Windows, использующее версию сообщества баз данных MySql 5.1. Я скачал драйвер MySql ODBC и создал dsn для своей базы данных на моей локальной машине. В моем приложении я могу без проблем выполнять запросы типа get, но когда я выполняю заданный оператор вставки (не то, что я пытался делать какие-либо другие), я получаю следующую ошибку:

{"ОШИБКА [HY001] [MySQL] [Драйвер ODBC 5.1] [mysqld-5.0.27-community-nt] Ошибка выделения памяти"}

Я работаю на машине с Windows XP. У моей машины 1 ГБ памяти. У кого-нибудь есть идеи? Смотрите код ниже

OdbcConnection MyConn = DBConnection.getDBConnection();
    int result = -1;
    try
    {
        MyConn.Open();
        OdbcCommand myCmd = new OdbcCommand();
        myCmd.Connection = MyConn;
        myCmd.CommandType = CommandType.Text;
        OdbcParameter userName = new OdbcParameter("@UserName", u.UserName);
        OdbcParameter password = new OdbcParameter("@Password", u.Password);
        OdbcParameter firstName = new OdbcParameter("@FirstName", u.FirstName);
        OdbcParameter LastName = new OdbcParameter("@LastName", u.LastName);
        OdbcParameter sex = new OdbcParameter("@sex", u.Sex);
        myCmd.Parameters.Add(userName);
        myCmd.Parameters.Add(password);
        myCmd.Parameters.Add(firstName);
        myCmd.Parameters.Add(LastName);
        myCmd.Parameters.Add(sex);
        myCmd.CommandText = mySqlQueries.insertChatUser;
        result = myCmd.ExecuteNonQuery();
    }
    catch (Exception e)
    {
             //{"ERROR [HY001] [MySQL][ODBC 5.1 Driver][mysqld-5.0.27-community-nt]Memory  
             // allocation error"} EXCEPTION ALWAYS THROWN HERE 
    }
    finally
    {
        try
        {
            if (MyConn != null) MyConn.Close();
        }
        finally { }
    }

Ответы [ 2 ]

9 голосов
/ 10 июня 2010

Поскольку некоторые поля принимают значение NULL, я передал их как NULL, где они должны быть переданы как DBNull.Value. Для всех полей, которые допускают значение NULL, следует проверять наличие NULL, а если найдено значение NULL, следует передавать DBNull.Value.

2 голосов
/ 11 февраля 2011

Просто для полноты SQL-выражение Chinjoo, вероятно, будет выглядеть примерно так:

mySqlQueries.insertChatUser = "insert into ChatUsers (UserName, Password, FirstName, LastName, sex) values (?,?,?,?,?);";

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

Хотя это и менее элегантно, чем использование функции, исправление для его нулевой проблемы выглядело бы примерно так для одного из его параметров:

OdbcParameter LastName = new OdbcParameter("@LastName", u.LastName);

заменяется на

// if the value is "null" return DBNull, else just the value
OdbcParameter LastName = new OdbcParameter("@LastName", 
(u.LastName == null) ? System.DBNull.Value : (object)u.LastName);

По крайней мере, в моем коде (который немного отличается) требуется внутреннее приведение к типу объекта, поскольку в противном случае компилятор не уверен, какой тип должен возвращать оператор?:

Надеюсь, это поможет любому, кто сравнительно не знаком с параметризацией и т. Д.

Никакой критики Чинджу не подразумевалось - его публикации помогли мне! Просто думал, что поделюсь для менее опытных. Я ни в коем случае не эксперт, поэтому примите все, что я скажу, с долей соли.

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