使用Mysql connector c++ 1.1.3连接数据库实现增、删、改、查过程中会遇到的问题

使用Mysql connector c++ 1.1.3连接数据库实现增、删、改、查过程中会遇到的问题。

最近用c++写服务器时,因为要保存数据所以选择了使用Mysql connector c++ 1.1.3这个工具包来连接mysql数据库,由于是第一次使用这个工具包,网上说这个工具包和java的JDBC连接mysql的机制是差不多的,但是用的时候还是遇到了一些问题。在这里分享一下相关问题和解决方法:

1.从数据看中查询记录返回的结果中文乱码问题:

安装好了boost库和Mysql connector c++ 1.1.3库后,我们配置好工程的属性,就能使用通过sql::Connection::createStatement(),方法创建的sql::Statement*对象,对数据库进行操作,但是如果你数据库中的编码是utf8或者其他支持中文的编码,那么你必需要在执行sql查询语句之前,执行这么一句代码:m_sqlStatement->execute("set names 'gbk'");这里的m_sqlStatement是一个sql::Statement*对象。这样你在执行查询语句,例如:m_sqlStatement->executeQuery("select * from userinfo_tbl"),就不会出现中文乱码了。

2,插入数据时出现Incorrect string value: '\xC0\xAD\xC0\xAD' for column 'user_name' at row 1,数据库无法识别的字符串错误

原因和上面差不多,是程序中对数据库进行操作的对象中使用的字符编码和数据库中的字符编码不一致所导致的,可以想象一下,我们编程时是通过Mysql connector c++ 1.1.3库中提供的对象对数据库进行操作,对数据库的一切操作都是由这些我们实例化出来的对象来完成,但是如果我们创建的对象的字符编码和数据库的编码不一样,那么数据库就无法识别对象想要存到数据库中的字符到底是啥,由于无法识别,数据库自然不会让你插入进去。解决方法和上面一样,在执行插入语句之前,创建一个sql::Statement*对象,执行m_sqlStatement->execute("set names 'gbk'"),这里的m_sqlStatement是一个sql::Statement*对象。无论是使用sql::PreparedStatement*还是使用sql::Statement*对数据库进行操作,基本都要执行这么一句,设置对象使用的编码。可能你们会奇怪为什么不是把编码设置成utf8而是设置成gbk,这个我也不知道,但是我试过了,数据库编码为utf8时,我执行了m_sqlStatement->execute("set names 'utf8'")代替上面的,但是还是会有乱码,只有设置成gbk时才不会乱码,至于为什么我也不太清楚,总之,先用起来再说。

3、使用C++获取系统时间并存进Mysql中DateTime类型的字段

无论是C++库函数还是Mysql connector c++ 1.1.3库中都没有提供DateTime这个数据类型,那么想要将Mysql中的DateTime类型读进C++的类型中,就必须要转换类型,最方便的方法是将DateTime装换成“2018-07-15 22:11:54”这样格式的字符串,存的时候按照字符串的格式存储,取得时候也按照字符串的格式取,具体代码如下:

从查询结果集中取出DateTime的数据:

rlt = statement->executeQuery("select * from userinfo_tbl");//statement是sql::Statement*类型对象
    while (rlt->next())
    {
        std::cout << "   user_name:" << rlt->getString("user_name");
        std::cout << "   user_pwd:" << rlt->getString("user_pwd");
        std::cout << "   user_email:" << rlt->getString("user_email");
        std::cout << "   user_update:" << rlt->getString("user_update") << std::endl;  //user_update字段是DateTime类型的字段,

    }

输出格式如下:

c++获取系统时间存进Mysql中 DateTime类型字段

做法如下:

try
    {
        CTime nowtime = CTime::GetCurrentTime();//获取系统当前时间#include
        CString tstr = nowtime.Format("%Y-%m-%d %H:%M:%S");//格式化时间,将时间格式化成和数据库中格式一样的字符串
        std::cout << tstr << std::endl;
        sql::PreparedStatement* preStatement = jdbc.getPreStatement("INSERT INTO userinfo_tbl VALUES('拉拉','147258','[email protected]',?)");
        preStatement->setString(1, tstr.GetString());
        preStatement->executeUpdate();
    }
    catch (const std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }

这样就能获取系统系统间并将时间存进数据库了。

以上说法纯粹个人摸索理解出来的,有理解不正常或者其他纰漏之处还请大家海涵,用这个套工具开发服务器的人应该不多,遇到问题也是让人蛋疼,分享一下个人经验,还望能帮到有需要之人。

你可能感兴趣的:(个人经验分享)