I tried to connect C++ to MySql and I just can't get this to work properly. I used latest MySql and C++/Connector for Windows from Oracle site. I also use VS2010.
It compiles and everything works EXCEPT getString! I used the example that they supply with some tweaking:
#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");
}
}
... //the rest isn't relevant because it breaks here.
This is the output:
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 . . .
and this is what the table looks like so clearly it's not working properly. I just can't get it to get the strings which are varchar(120) from MySql:
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)
I tried VS2008 and this is what I get:
msvcp90d.dll!104e8dcb()
[Frames below may be incorrect and/or missing, no symbols loaded for msvcp90d.dll]
try_mysql_native.exe!std::operator<<(std::basic_ostream > & os={...}, const sql::SQLString & str={...}) Line 196 + 0x1f bytes C++ try_mysql_native.exe!main(int argc=1, const char * * argv=0x003e63e8) Line 115 + 0xa5 bytes C++ try_mysql_native.exe!__tmainCRTStartup() Line 586 + 0x19 bytes C try_mysql_native.exe!mainCRTStartup() Line 403 C kernel32.dll!7c817077()
and this:
'try_mysql_native.exe': Loaded 'C:\Documents and Settings\Eugene\My Documents\Visual Studio 2008\Projects\try_mysql_native\Debug\try_mysql_native.exe', Symbols loaded. 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\mysqlcppconn.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\libmysql.dll', Symbols loaded. 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\secur32.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\ws2_32.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\ws2help.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.4974_x-ww_d889290f\msvcp90.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.4974_x-ww_d889290f\msvcr90.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcr90d.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcp90d.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\mswsock.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\dnsapi.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\winrnr.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\wldap32.dll' 'try_mysql_native.exe': Loaded 'C:\Program Files\Bonjour\mdnsNSP.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\iphlpapi.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\user32.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\gdi32.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\imm32.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\rasadhlp.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\hnetcfg.dll' 'try_mysql_native.exe': Loaded 'C:\WINDOWS\system32\wshtcpip.dll' First-chance exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. Unhandled exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. First-chance exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. Unhandled exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. First-chance exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. Unhandled exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. First-chance exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. Unhandled exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. First-chance exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. Unhandled exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. First-chance exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. Unhandled exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. First-chance exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. Unhandled exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. First-chance exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a. Unhandled exception at 0x104e8dcb in try_mysql_native.exe: 0xC0000005: Access violation reading location 0x6e61656a.