C++ 将行插入非空表时出现mySql连接器异常(mySql的C+;+;库)

C++ 将行插入非空表时出现mySql连接器异常(mySql的C+;+;库),c++,mysql,crash,mysql-connector,C++,Mysql,Crash,Mysql Connector,我根本没有做过多少数据库编程。我正在使用MySQL Connector/C++的一些示例代码 当我运行下面的代码时,我在一些std::string代码的最后一行得到一个崩溃——但它只在表不为空时崩溃。如果表为空,则插入行并正常工作。如果表不为空,则会崩溃。我很困惑。主键或其他值是否有问题?(此处的列名已更改,但除此之外,代码是逐字的) 当我查看std::string模板代码中的变量时(我所能看到的很少),我没有看到我试图插入的任何熟悉的数据值,所以这根本没有帮助。我把“HY000”看作字符串值,

我根本没有做过多少数据库编程。我正在使用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();
这是在使用VisualStudio2008的MS平台上实现的

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

编辑:

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

“使用不支持的缓冲区类型:4191960(参数:3)” 厄尔诺2036

编辑:


我不确定被接受的答案是否正确,但它帮助我找到了解决方案。基本上,我删除了所有非空属性,去掉了零填充,并将主键设置为自动递增。现在它工作正常了

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

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

`val3` INT(10) ZEROFILL ,
其中10是零填充的位置数。我也不确定空值是否必要,所以我在上面排除了它


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

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

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

`val3` INT(10) ZEROFILL ,
其中10是零填充的位置数。我也不确定空值是否必要,所以我在上面排除了它


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

您可以发布val1等的变量声明吗?而且,看起来像是vale1的打字错误。我假设“vale1”(etc)不是他的实际代码的一部分,而是他只是在向外界隐藏他的实际列名。:)是的,只是隐藏了真正的价值。代码编译并运行。int是int,字符串是std::strings。您能为val1等发布变量声明吗?而且,看起来像是vale1的打字错误。我假设“vale1”(etc)不是他的实际代码的一部分,而是他只是在向外界隐藏他的实际列名。:)是的,只是隐藏了真正的价值。代码编译并运行。int是int,字符串是std::strings。谢谢你的建议-我会更新的。奇怪的是,为什么它在表为空时有效,但在表中有行时无效……我将尝试删除表并以不同的方式创建它。我不确定这是否是正确的答案,但它帮助我找到了解决方案。基本上,我删除了所有非空属性,去掉了零填充,并将主键设置为自动递增。现在它工作正常了啊,我没注意到PK没有设置为自动。我不知道为什么它会第一次工作(也不知道这个错误意味着什么),但是你没有手动设置它,肯定违反了PK字段上的NOTNULL。很高兴我能帮上忙,如果我能帮上忙的话:我猜它也是零填充,所以第一次就变成了零。(当有一个条目时,id为0)感谢您的建议-我将更新。奇怪的是,为什么它在表为空时有效,但在表中有行时无效……我将尝试删除表并以不同的方式创建它。我不确定这是否是正确的答案,但它帮助我找到了解决方案。基本上,我删除了所有非空属性,去掉了零填充,并将主键设置为自动递增。现在它工作正常了啊,我没注意到PK没有设置为自动。我不知道为什么它会第一次工作(也不知道这个错误意味着什么),但是你没有手动设置它,肯定违反了PK字段上的NOTNULL。很高兴我能帮上忙,如果我能帮上忙的话:我猜它也是零填充,所以第一次就变成了零。(当有一个条目时,id为0)