2012-05-05 6 views
0

私は、Visual C++ 2010でmySQLデータベースに接続するために必要なC++コンソールアプリケーションを開発しています。私はmysqlとmySQL C++コネクターにwampサーバーを使用しています。コードはデータベースを読み込むためにうまく動作しますが、データを挿入しようとすると予期しないエラーが発生します。誰もそのような経験を持っていましたか?ここでC++プログラムとmysqlの接続で予期しないエラーが発生しました

は私の完全なコードです: (コードの出力は次のとおりです。「SQLエラー:エラーメッセージ:不明な例外」)

// Standad C++ includes 
#include <iostream> 
#include <cstdlib> 
#include <string> 
using namespace std; 

// Include the Connector/C++ headers 
#include "cppconn/driver.h" 
#include "cppconn/exception.h" 
#include "cppconn/resultset.h" 
#include "cppconn/statement.h" 
#include "cppconn/sqlstring.h" 

// Link to the Connector/C++ library 
#pragma comment(lib, "mysqlcppconn.lib") 

// Specify our connection target and credentials 
const string server = "tcp://127.0.0.1:3306"; 
const string username = "cashif"; 
const string password = "111222"; // No password - NEVER DO THIS ON A PRODUCTION SERVER! 

int main() 
{ 
    sql::Driver  *driver; // Create a pointer to a MySQL driver object 
    sql::Connection *dbConn; // Create a pointer to a database connection object 
    sql::Statement *stmt; // Create a pointer to a Statement object to hold our SQL commands 
    sql::ResultSet *res; // Create a pointer to a ResultSet object to hold the results of any queries we run 

    // Try to get a driver to use to connect to our DBMS 
    try 
    { 
     driver = get_driver_instance(); 
    } 
    catch (sql::SQLException e) 
    { 
     cout << "Could not get a database driver. Error message: " << e.what() << endl; 
     system("pause"); 
     exit(1); 
    } 

    // Try to connect to the DBMS server 
    try 
    { 
     dbConn = driver->connect(server, username, password); 
    } 
    catch (sql::SQLException e) 
    { 
     cout << "Could not connect to database. Error message: " << e.what() << endl; 
     system("pause"); 
     exit(1); 
    } 

    stmt = dbConn->createStatement(); // Specify which connection our SQL statement should be executed on 

    // Try to query the database 
    try 
    { 
     stmt->execute("use dengue_test");    // Select which database to use. Notice that we use "execute" to perform a command. 

     stmt->execute("insert into patients values(3,\"Amina\",\"Iqbal Town\""); // Perform a query and get the results. Notice that we use "executeQuery" to get results back 
    } 
    catch (sql::SQLException e) 
    { 
     cout << "SQL error. Error message: " << e.what() << endl; 
     system("pause"); 
     exit(1); 
    } 

    // While there are still results (i.e. rows/records) in our result set... 
/* 
    while (res->next()) 
    { 
     // ...get each field we want and output it to the screen 
     // Note: The first field/column in our result-set is field 1 (one) and -NOT- field 0 (zero) 
     // Also, if we know the name of the field then we can also get it directly by name by using: 
     // res->getString("TheNameOfTheField"); 
     cout << res->getString(1) << " - " << res->getString(2) << " - " << res->getString(3) << endl;     
    } 
    */ 
    // Clean up after ourselves 
    //delete res; 
    delete stmt; 
    delete dbConn; 

    system("pause"); 
    return 0; 
} 
+0

テーブル患者の構造を投稿することはできますか? – Raam

答えて

1

あなたはSQLで2つのエラー、MySQLはあなたをできるようになるものを持っています逃げようとするものと、そうしないものがあります。あなたはまた、悪い習慣を拾っています。

両方のバグはここです:SQLで

stmt->execute("insert into patients values(3,\"Amina\",\"Iqbal Town\""); 

文字列リテラルは、単一引用符、二重引用符ではないを使用します。 MySQLはあなたがこれを離れて得ることができます。しかし、あなたも欠落している閉じ括弧があり、MySQLはその1ビットを気に入らない。あなたがこれを言っされなければならないので、SQLのINSERT内の列を指定しない

stmt->execute("insert into patients values(3, 'Amina', 'Iqbal Town')"); 

は悪い習慣です:

insert into patients (col1, col2, col3) values (...) 
col1や友人はもちろん、実際のコラムです

あなたはこれを言う必要があります名前。テーブルの列には明確な順序がありませんので、面白いバグやメンテナンスの悪夢を避けるために具体的にする必要があります。

+0

ありがとうございます。これらは本当にばかげた過ちでした。そのすべての今働いている。もう一つ、リリースモードでは動作しません。その問題は何ですか? –

+0

@CashifIlyas:リリースモードで問題が発生する理由を知るには、VSをよく知りません。申し訳ありません。 –

関連する問題