最简单的插入数据库。
键值不能重复。具体代码省略
try {
mysqlpp::Query query = con.query();
.....
query.insert(row);
....
}
catch()
{
}
实际执行中,就算是同一条记录,重复执行插入几次,不报错,虽然没有写入数据库,但是我希望
捕获这个异常,
如何才能捕获重复插入记录的异常?
谢谢。

解决方案 »

  1.   

    你的语句是什么? 如果是语句错误或者其它错误MYSQL会返回,应该可以在CATCH中捕获。
      

  2.   

    try {
      sql::Driver *driver;
      sql::Connection *con;
      sql::Statement *stmt;
      sql::ResultSet *res;  /* Create a connection */
      driver = get_driver_instance();
      con = driver->connect("tcp://127.0.0.1:3306", "root", "root");
      /* Connect to the MySQL test database */
      con->setSchema("test");  stmt = con->createStatement();
      res = stmt->executeQuery("SELECT 'Hello World!' AS _message");
      while (res->next()) {
        cout << "\t... MySQL replies: ";
        /* Access column data by alias or column name */
        cout << res->getString("_message") << endl;
        cout << "\t... MySQL says it again: ";
        /* Access column fata by numeric offset, 1 is the first column */
        cout << res->getString(1) << endl;
      }
      delete res;
      delete stmt;
      delete con;} catch (sql::SQLException &e) {
      cout << "# ERR: SQLException in " << __FILE__;
      cout << "(" << __FUNCTION__ << ") on line " »
         << __LINE__ << endl;
      cout << "# ERR: " << e.what();
      cout << " (MySQL error code: " << e.getErrorCode();
      cout << ", SQLState: " << e.getSQLState() << " )" << endl;
    }
      

  3.   

    int inserUsr(){UpdateData(TRUE);

    std::string strSql;
    string strTemp; try
    {
     mysqlpp::Connection con(true); 
     
     
     
      con.connect("tempfortest","localhost","root","admin",3306); 
     //AfxMessageBox(sUsrId);
     strSql="select * from usrInfo where usrId='";
    strTemp= m_UsrId.GetBuffer(0) ;
    strSql=strSql+strTemp+" ' and usrPass='"+m_UsrPass.GetBuffer(0)+"'" ;


    usrInfo row(m_UsrId.GetBuffer(0), m_UsrName.GetBuffer(0), "AU",m_UsrPass.GetBuffer(0)); // Form the query to insert the row into the stock table.
    mysqlpp::Query query = con.query();
    query.insert(row); // Show the query about to be executed.
    cout << "Query: " << query << endl; // Execute the query.  We use execute() because INSERT doesn't
    // return a result set.
    query.execute();



    // strSql=strSql+strTemp;
     //strSql=strSql+" where usrId='";
     //strSql+=sUsrId.GetBuffer(0);
     //strSql=strSql+"' ";
     //mysqlpp::Query query = con.query(strSql); 
     
     /*
     cout << "the it members as bellow :" << endl; 
     
     for (size_t i = 0; i < res.num_rows(); ++i) 
     
     { 
     
     cout << '\t' << res[i][0] << endl; 
     
     } 
     */
     

     
     
     
     //cout<<'\t'<< "show complete, press any key toexit."<<endl; 
     MessageBox("添加用户成功");
     
     
     
     con.disconnect(); 
     
    } catch(ConnectionFailed  e){
            MessageBox("数据库连接失败!");
        }
    catch (const mysqlpp::BadQuery& er) {
    // Handle any query errors
    cerr << "Query error: " << er.what() << endl;
    return -1;
    }
    catch (const mysqlpp::BadConversion& er) {
    // Handle bad conversions; e.g. type mismatch populating 'stock'
    cerr << "Conversion error: " << er.what() << endl <<
    "\tretrieved data size: " << er.retrieved <<
    ", actual size: " << er.actual_size << endl;
    return -1;
    }
    catch (const mysqlpp::Exception& er) {
    // Catch-all for any other MySQL++ exceptions
    cerr << "Error: " << er.what() << endl;
    return -1;
    }    return 0;
    }
    我的问题是,我先增加了一个用户usr001,成功,然后我再新增一个usr001(还是同一个用户),在数据库中。我设定了usrId是key,理论上是插入不成功的,而实际上也是插入不成功,但是并没有任何报错,也就是简单的执行了一遍插入语句,并且运行结束,我怎么提示用户,之前已经增加过同一个用户?使用逻辑控制插入前先检查一遍,这种方法不想采用。谢谢了
      

  4.   

    语句直接到MYSQL中去执行一下,看看是否报错?
      

  5.   

    肯定会错的,Duplicate entry 'usr001' for key "Primary"
    毕竟是重复插入,但我不知道为什么用mysql++所带的例子 insert没有报错,
    mysqlpp::Exception& er 这个例外应该捕获了呀。搞不懂。
      

  6.   

    问题解决。
    const mysqlpp::BadQuery& er
    这一段捕获到了错误。