首页 文章

MySql C连接器getString()无法正常工作,而getInt工作正常

提问于
浏览
2

我试图将C连接到MySql,但我无法使其正常工作 . 我从Oracle站点使用了最新的MySql和C / Connector for Windows . 我也用VS2010 .

它编译,一切都工作除了getString!我使用了他们提供的一些调整的例子:

#include "stdafx.h"


#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <stdexcept>

#include <driver/mysql_public_iface.h>

#include "examples.h"

using namespace std;

int main(int argc, const char **argv)
{
string url(argc >= 2 ? argv[1] : EXAMPLE_HOST);
const string user(argc >= 3 ? argv[2] : EXAMPLE_USER);
const string pass(argc >= 4 ? argv[3] : EXAMPLE_PASS);
const string database(argc >= 5 ? argv[4] : EXAMPLE_DB);

/* sql::ResultSet.rowsCount() returns size_t */
size_t row;
stringstream sql;
stringstream msg;
int i, affected_rows;

cout << boolalpha;
cout << "1..1" << endl;
cout << "# Connector/C++ connect basic usage example.." << endl;
cout << "#" << endl;

try {
    sql::Driver * driver = sql::mysql::get_driver_instance();
    /* Using the Driver to create a connection */
    std::auto_ptr< sql::Connection > con(driver->connect("localhost", "root", "root"));

    /* Creating a "simple" statement - "simple" = not a prepared statement */
    std::auto_ptr< sql::Statement > stmt(con->createStatement());

    /* Create a test table demonstrating the use of sql::Statement.execute() */
    stmt->execute("USE publications");
    cout << "#\t Test table created" << endl;

    /* Populate the test table with data */

    cout << "#\t Test table populated" << endl;

    {
        /*
        Run a query which returns exactly one result set like SELECT
        Stored procedures (CALL) may return more than one result set
        */
        std::auto_ptr< sql::ResultSet > res(stmt->executeQuery("SELECT id, task FROM to_do_list ORDER BY id ASC"));
        cout << "#\t Running 'SELECT id, task FROM to_do_list ORDER BY id ASC'" << endl;

        /* Number of rows in the result set */
        cout << "#\t\t Number of rows\t";
        cout << "res->rowsCount() = " << res->rowsCount() << endl;
        if (res->rowsCount() != EXAMPLE_NUM_TEST_ROWS) {
            msg.str("");
            msg << "Expecting " << EXAMPLE_NUM_TEST_ROWS << "rows, found " << res->rowsCount();
            throw runtime_error(msg.str());
        }

        /* Fetching data */
        row = 0;
        while (res->next()) {
            cout << "#\t\t Fetching row " << row << "\t";
            /* You can use either numeric offsets... */
            cout << "id = " << res->getInt("id");
            /* ... or column names for accessing results. The latter is recommended. */
            cout << ", task = '" << res->getString("task") << "'" << endl;
            row++;
            system("PAUSE");
        }
    }

... //其余部分不相关,因为它在这里打破了 .

这是输出:

1..1
# Connector/C++ connect basic usage example..
#
#        Test table created
#        Test table populated
#        Running 'SELECT id, task FROM to_do_list ORDER BY id ASC'
#                Number of rows res->rowsCount() = 4
#                Fetching row 0 id = 3, task = ''
Press any key to continue . . .
#                Fetching row 1 id = 7, task = ''
Press any key to continue . . .
   ☼   Ñ╤½x R=  I>             ☼   £I> task  ↕ 4å@ xQ@ ♦   ☼   ☻    ocalhost ½xÇ
'
Press any key to continue . . .

这就是表格看起来很清楚,它不能正常工作 . 我只是无法从MySql获取varchar(120)的字符串:

mysql> use publications
Database changed
mysql> select id, task from to_do_list;
+----+---------------------------+
| id | task                      |
+----+---------------------------+
|  9 | prepare for calculus      |
|  3 | buy jeans                 |
|  8 | buy new scale             |
|  7 | buy Ethics book for class |
+----+---------------------------+
4 rows in set (0.00 sec)

我试过VS2008,这就是我得到的:

msvcp90d.dll!104e8dcb()[下面的框架可能不正确和/或缺失,没有为msvcp90d.dll加载符号] try_mysql_native.exe!std :: operator <<(std :: basic_ostream>&os = ,const sql :: SQLString&str = )第196行0x1f字节C try_mysql_native.exe!main(int argc = 1,const char * * argv = 0x003e63e8)第115行0xa5字节C try_mysql_native.exe!__ tmainCRTStartup ()第586行0x19字节C try_mysql_native.exe!mainCRTStartup()第403行C kernel32.dll!7c817077()

还有这个:

'try_mysql_native.exe':已加载'C:\ Documents and Settings \ Eugene \ My Documents \ Visual Studio 2008 \ Projects \ try_mysql_native \ Debug \ try_mysql_native.exe',已加载符号 . 'try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ ntdll.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ kernel32.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ mysqlcppconn.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ libmysql.dll',已加载符号 . 'try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ advapi32.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ rpcrt4.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ secur32.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ ws2_32.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ msvcrt.dll''try_mysql_native.exe' :已加载'C:\ WINDOWS \ system32 \ ws2help.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ WinSxS \ x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.4974_x-ww_d889290f \ msvcp90.dll''try_mysql_native.exe' :已加载'C:\ WINDOWS \ WinSxS \ x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.4974_x-ww_d889290f \ msvcr90.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ WinSxS \ x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x -ww_f863c71f \ msvcr90d.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ WinSxS \ x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f \ msvcp90d.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ mswsock.dll''try_mysql_na tive.exe':已加载'C:\ WINDOWS \ system32 \ dnsapi.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ winrnr.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ wldap32.dll''try_mysql_native.exe':已加载'C:\ Program Files \ Bonjour \ mdnsNSP.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ iphlpapi.dll''try_mysql_native.exe' :已加载'C:\ WINDOWS \ system32 \ user32.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ gdi32.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ imm32 . dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ rasadhlp.dll''try_mysql_native.exe':已加载'C:\ WINDOWS \ system32 \ hnetcfg.dll''try_mysql_native.exe':已加载'C: \ WINDOWS \ system32 \ wshtcpip.dll在try_mysql_native.exe中的0x104e8dcb处的第一次机会异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb处的未处理异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb的第一次机会异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb处的未处理异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb的第一次机会异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb处的未处理异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb的第一次机会异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb处的未处理异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb的第一次机会异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb处的未处理异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb的第一次机会异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb处的未处理异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb的第一次机会异常:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb处的未处理异常:0xC0000005:访问冲突读取位置0x6e61656a . 0x104e8dcb的第一次机会异常在try_mysql_native.exe中:0xC0000005:访问冲突读取位置0x6e61656a . try_mysql_native.exe中0x104e8dcb处的未处理异常:0xC0000005:访问冲突读取位置0x6e61656a .

4 回答

  • 0

    您确定任务列没有设置二进制排序规则吗?如果是,则连接器可以返回同一列的不同元数据 .

    Update:

    另外,检查Connector是否已使用与项目相同的运行时进行编译 . 如果使用VS,我打赌另一个用/ MT编译,另一个用/ MD编译 . 这样,他们使用不同的堆,它将无法工作 .

  • 4

    以下代码对我有用:

    sql::ResultSet *res;
    res->getString("Column name").c_str();
    

    只是 using res->getString("Column name") 正在崩溃我的申请 .

  • 0

    我试用了"mysql-connector-c++-8.0.13-win32"环境"mysql-connector-c++-8.0.13-win32"和Visual C 2015中的演示源代码 .

    我也遇到了同样的问题 .

    在调试模式下,它应该使用

    std::string version = result->getString( COLUMN_NAME ).c_str();
    

    但在发布模式下,这没关系:

    sql::SQLString sString  = result->getString( COLUMN_NAME );
    

    我相信这是因为我的项目必须使用与MySQL C Connector库相同的运行时编译 .

  • 8

    我有一个类似的问题,该程序将给出一个内存异常 . 这是我做的修复它:

    std::string version = result->getString( COLUMN_NAME ).c_str();
    

    这不起作用:

    sql::SQLString sString  = result->getString( COLUMN_NAME ); <<<memory exception
    std::string version = sString;
    

相关问题