【问题标题】:mySql Connector exception (C++ library for mysql) when inserting row into non-empty table将行插入非空表时,mySql 连接器异常(mysql 的 C++ 库)
【发布时间】:2009-12-03 03:24:38
【问题描述】:

我根本没有做过太多的数据库编程。我正在编写一些使用 MySQL Connector/C++ 的示例代码。

当我运行以下代码时,我在某些 std::string 代码的最后一行出现崩溃 - 但它仅在表不为空时崩溃。如果表是空的,它会插入行并且工作正常。如果表不为空,则会崩溃。我很困惑。主键或其他值有什么问题吗? (此处列名已更改,否则代码一字不差)

当我查看 std::string 模板代码中的变量时(我几乎看不到),我没有看到我试图插入的任何熟悉的数据值 - 所以这根本没有帮助。我看到像“HY000”这样的字符串值,但我不确定它来自哪里。

最初我认为它可能是日期字符串,但代码在空表上运行良好,然后在非空时崩溃。这表明日期字符串工作正常。

prep_stmt = con->prepareStatement("INSERT INTO 
   sometable(val1, val2, val3, Date, val5, val6, val7) 
   VALUES (?, ?, ?, ?, ?, ?, ?)");

        /*
            `idLicenses` INT NOT NULL ,
            `val1` VARCHAR(45) NOT NULL ,
            `val2` INT NOT NULL ,
            `val3` INT ZEROFILL NULL ,
            `Date` DATETIME NOT NULL ,
            `val5` VARCHAR(45) NOT NULL ,
            `val6` VARCHAR(45) NOT NULL ,
            `val7` VARCHAR(45) NOT NULL ,
        */

        //  val1, val5, val6 and val7 are std::strings, val2 and val3 are ints.
        prep_stmt->setString(1, val1);
        prep_stmt->setInt(2, val2);
        prep_stmt->setInt(3, 0);
        prep_stmt->setDateTime(4, /* I created some date string here*/);
        prep_stmt->setString(5, val5);
        prep_stmt->setString(6, val6);
        prep_stmt->setString(7, val7);
        prep_stmt->execute();

这是在使用 Visual Studio 2008 的 MS 平台上。

数据库已启动并正在运行,我可以使用其他数据库查询工具查看表等。

编辑:

我看到了我得到的 mysql 异常:

“使用不支持的缓冲区类型:4191960(参数:3)” 错误号 2036

编辑:

我不确定接受的答案是否完全正确,但它帮助我找到了解决方案。基本上我删除了所有非空属性,取出零填充并将主键设置为自动增量。现在可以正常使用了

【问题讨论】:

  • 你能发布 val1 的变量声明等吗?另外,看起来像 vale1 的错字。
  • 我假设“vale1”(等)不是他实际代码的一部分,但他只是向世界隐藏了他的实际列名。 :)
  • 是的 - 只是隐藏真正的价值。代码编译并运行。整数是整数,字符串是 std::strings。

标签: c++ mysql crash mysql-connector


【解决方案1】:

我怀疑它是您的零填充 INT 或 DATETIME 列(不确定哪个是第 3 列)。

尝试使用以下内容创建表格:

`val3` INT(10) ZEROFILL ,

其中 10 是要填零的位置数。我也不确定NULL是否必要,所以我在上面排除了它。

另外,如果上述方法不起作用,您可以发布您创建的日期字符串吗?

【讨论】:

  • 感谢您的建议 - 我会更新。奇怪的是为什么它在表格为空时有效,但在表格中有一行时无效......
  • 我会尝试删除表格并以不同的方式创建它。
  • 我不确定这是否是正确的答案,但它帮助我找到了解决方案。基本上我删除了所有非空属性,取出零填充并将主键设置为自动递增。现在它工作正常
  • 啊,我没注意到 PK 没有设置为自动。我不知道为什么它第一次会起作用(也不知道那个错误意味着什么),但你肯定违反了你的 PK 字段中的 NOT NULL ,而不是手动设置它。很高兴我能帮忙,如果我愿意的话:P
  • 我猜它也是零填充,所以它只是将第一个填充为零。 (当有一个条目时,id 为 0)
猜你喜欢
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多