代码之家  ›  专栏  ›  技术社区  ›  Chinjoo

insert语句上C应用程序中mysql odbc 5.1驱动程序的内存分配错误

  •  5
  • Chinjoo  · 技术社区  · 15 年前

    我在C中有一个.NET Wndows应用程序。这是一个使用MySQL5.1数据库社区版的简单Windows应用程序。我已经下载了mysql-odbc驱动程序,并在本地计算机上创建了一个DSN到我的数据库。在我的应用程序上,我可以毫无问题地执行get-type查询,但是当我执行一个给定的insert语句(我没有尝试执行任何其他语句)时,我会得到以下错误:

    “error[hy001][mysql][odbc 5.1 driver][mysqld-5.0.27-community-nt]memory allocation error”

    我在Windows XP计算机上运行。我的机器有1 GB的内存。 有人有什么想法吗?见下面的代码

    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 回复  |  直到 7 年前
        1
  •  9
  •   Chinjoo    15 年前

    因为有些字段接受空值,所以我将它们作为空值传递,在这里它们应该作为dbnull.value传递。对于所有允许空值的字段,应检查空值,如果找到空值,则应传递dbnull.value。

        2
  •  2
  •   bluish dmajkic    7 年前

    为了完整起见,Chinjoo的SQL语句可能如下所示:

    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);
    

    至少在我的代码中(稍有不同),需要内部强制转换为类型对象,否则编译器不确定是哪种类型?:操作员应返回。

    希望这能帮助那些对参数化等相对陌生的人。

    对金珠的批评完全没有暗示——他的帖子帮了我一把!只是想和经验不足的人分享。我决不是专家,所以我说的每一句话都要加点盐。