2011-01-27 14 views
2

C++をMySqlに接続しようとしましたが、正しく動作しません。 Oracleのサイトから最新のMySqlおよびC++/Connector for Windowsを使用しました。 VS2010も使用しています。MySql C++コネクタgetString()は正常に動作しません。getIntは完全に動作します。

コンパイルされ、すべてが機能します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å@ [email protected] ♦ ☼ ☻ 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 ::オペレータ< <(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とSettings \ユージン\プロジェクト\ try_mysql_native \ \のVisual Studio 2008 \マイドキュメント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_Micros oft.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' ' 'C:\ WINDOWS \ system32 \ mswsock.dll'をロードしました。 'try_mysql_native.exe': 'C:\ WINDOWS \ system32 \ dnsapi.dll'をロードしました。 ' ' try_mysql_native。'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 'をロードしました First- try_myの0x104e8dcbのチャンス例外sql_native.exe: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の場所を読み取っているアクセス違反。 try_mysql_native.exeの0x104e8dcbの最初の例外:0xC0000005:0x6e61656aの場所を読み取るアクセス違反。 try_mysql_native.exeの0x104e8dcbで未処理の例外が発生しました。0xC0000005:0x6e61656aの場所を読み取っているアクセス違反。

+0

MySQLサーバ5.5 のMySQLコネクタC++ 1.1.0 が使用されています。 – Eugene

答えて

4

タスク列にバイナリ照合セットが設定されていませんか?その場合、コネクターは同じ列の異なるメタデータを戻すことがあります。

更新:

また、コネクタは、プロジェクトと同じランタイムでコンパイルされていることを確認してください。 VSを使用している場合は、もう一方は/ MTでコンパイルされ、もう一方は/ MDでコンパイルされていると確信しています。この方法では、別のヒープを使用し、動作しません。

+0

utf8_general_ciを使用しています latin1_swedish_ci – Eugene

+1

私はMTからMTdに変更しなければなりませんでした:)))))))))))))))) THANKS !!!!!! <3 – Eugene

7

プログラムでメモリ例外が発生するという同様の問題がありました。ここで私はそれを修正するために何をしたかである:

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

これは動作しませんでした:

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

これはちょっと古いですが、これが助けになりました。私はそれがなぜ働いたのか知​​りたいです。 –