我有一个简单的代码块,我尝试访问本地数据库以更改和查询数据库表。我成功连接到主机,可以成功查询整数值,以及对事情如何发展相当乐观。当我尝试通过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;
}
答案 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
是我的记录。
绝对输入您的语句到控制台。这将显示数据库中的输出(记录),这可能与您认为的不同。