使用MySQL Connector C ++导致程序崩溃的原因是什么?

时间:2011-05-12 19:14:07

标签: c++ mysql linux

我有一个简单的代码块,我尝试访问本地数据库以更改和查询数据库表。我成功连接到主机,可以成功查询整数值,以及对事情如何发展相当乐观。当我尝试通过sql::ResultSet::GetString()读取表格列中的值时出现问题。该程序在第一次调用此函数后终止。

我找到了导致此问题的原因的可能性:我必须使用sql::PreparedStatement而不是sql::Statement,因为每次调用sql::Statement::execute(string)都会产生同样的问题行为。 SQLString->字符串映射有问题吗?我在这里完全失去了,任何帮助都会受到赞赏。

我在Eclipse Helios CDT中使用适当的.so设置在CentOS 5.5中编写此代码。

编辑:我测试了下面的代码而没有调用sql :: ResultSet :: getString(),输出如下:

Starting MySQLTest 
Id: 1
Id: 2
Id: 3
Id: 10
Id: 222
Id: 333
MySQLTest Exiting...

表格如下:

+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       | 
| name  | char(30) | YES  |     | NULL    |       | 
+-------+----------+------+-----+---------+-------+
2 rows in set (0.13 sec)

当前状态为:

+------+--------+
| id   | name   |
+------+--------+
|    1 | FIRST  | 
|    2 | SECOND | 
|    3 | THIRD  | 
|   10 | JUMP   | 
|  222 | TEST   | 
|  333 | TEST3  | 
+------+--------+

控制台中的输出是:

Starting MySQLTest 
Id: 1
Name: FIRST

来源包含在下面:

#include <iostream>
#include <sstream>
#include <memory>
#include <string>
#include <stdexcept>

#include <stdlib.h>

//MySQL connection headers

#include <cppconn/driver.h>
#include <cppconn/connection.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>
#include <cppconn/resultset.h>
#include <cppconn/metadata.h>
#include <cppconn/resultset_metadata.h>
#include <cppconn/exception.h>
#include <cppconn/warning.h>

using namespace std;

int main()
{
    cout << "Starting MySQLTest \n";
    try
    {
        sql::Driver *driver;
        sql::Connection *connection;
        sql::PreparedStatement *prepStatement;
        sql::ResultSet *result;

        //Attempt to create a connection
        driver = get_driver_instance();
        connection = driver->connect("HOST", "USER", "PASS");
        connection->setSchema("testdb");

        prepStatement = connection->prepareStatement("insert into testtable(id, name) values(333, 'TEST3')");
        prepStatement->execute();
        prepStatement = connection->prepareStatement("select * from testtable");
        result = prepStatement->executeQuery();

        while(result->next())
        {
            cout << "Id: " << result->getInt("id") << "\n";
                    //TERMINATE AFTER THE FOLLOWING LINE
            cout << "Name: " << result->getString("name") << "\n";
        }

        delete result;
        delete connection;
    }
    catch(sql::SQLException &e)
    {
cout << e.what() << "\n";
    }

    cout << "MySQLTest Exiting...";

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您无需根据需要使用预准备语句。我正在为字符串字段使用SQL语句,而不使用预准备语句。我只使用BLOB的预准备语句。

将您要发送的文本发送到数据库并将其粘贴到MySQL控制台中。我相信您会发现您没有正确使用select和准备好的语句,尤其是在检索数据时。

在我的程序中,我通过将 visitor 应用于记录中的每个字段来构造SQL SELECT语句。以下是我的代码示例:

       insert_visitor.begin(rid);
       rid.accept_visitor(insert_visitor);
       insert_visitor.end();
       std::string             insertion_sql_text;
       insertion_sql_text += insert_visitor.get_query();
       std::cout << "\n" << insertion_sql_text << std::endl;
       sql::Connection *       p_db_connection(get_db_connection());
       boost::scoped_ptr<sql::Statement>               sql_stmt(p_db_connection->createStatement());
       if (!sql_stmt)
       {
               break;
       }
       try
       {
               sql_stmt->execute(insertion_sql_text);
       }
       catch (sql::SQLException exception)
       {
               wxLogDebug("SQL Exception thrown for executing: \"%s\"",
                                       insertion_sql_text.c_str());
       }

       //-------------------------------------------------------------
       //      Retrieve the new value of the auto incremented ID field.
       //-------------------------------------------------------------
       int new_id = -1;
       boost::scoped_ptr<sql::ResultSet>               query_results(sql_stmt->executeQuery("SELECT LAST_INSERT_ID()"));
       query_results->next();
       new_id = query_results->getInt(1);
       rid.set_record_id(new_id);

其中rid是我的记录。

编辑1:

绝对输入您的语句到控制台。这将显示数据库中的输出(记录),这可能与您认为的不同。

另见MySQL Prepared Statement Syntax