mysql mariadb的VC客户端遇到的问题

Posted itdef

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql mariadb的VC客户端遇到的问题相关的知识,希望对你有一定的参考价值。

在使用VS2017编写数据库客户端

具体设置可参见以下内容

https://dev.mysql.com/doc/connector-cpp/en/connector-cpp-apps-windows-visual-studio.html

http://www.cnblogs.com/flipped/p/6810216.html

遇到一些问题

只要涉及到sql的string操作 就会出现非法内存访问

经过一天排查 发现是关联lib有问题  

要注意导入的mysql的lib是32位还是64位 且只能是release版本 比较疑惑的是 那么release如何debug呢? 仅仅靠打印么?

客户端的代码使用例子如下

pstmt = con->prepareStatement("INSERT INTO test(id,name) VALUES (?,?)");

for (int i = 1; i <= 10; i++) {

  pstmt->setInt(1, i);

  pstmt->setString(2, "test string");

 

  pstmt->executeUpdate();

}

在识别类型上 应该使用pstmt->setInt 或者 pstmt->setString 。。。。还需要小小的封装

添加一个简单类型识别封装代码 这里添加一个简单例子作为示范

 1 #include <string>
 2 #include <iostream>
 3 
 4 
 5 template<typename T>
 6 std::enable_if_t<std::is_integral<T>::value && std::is_same<T, int>::value, int>
 7 bind(T item, size_t I)
 8 {
 9     std::cout << "call SetInt(" << I<<","<< item <<")" << std::endl;
10     return 1;
11 }
12 
13 int bind(const std::string& item, size_t I)
14 {
15     std::cout << "call SetString(" << I << "," << item << ")" << std::endl;
16     return 1;
17 }
18 
19 
20 int bind( const char* p, size_t I)
21 {
22     std::cout << "call SetString(" << I << "," << p << ")" << std::endl;
23     return 1;
24 }
25 
26 
27 template<size_t I, typename Arg, typename... Args>
28 void bind(Arg& arg) {
29     bind(arg, I);
30     return;
31 }
32 
33 
34 template<size_t I, typename Arg, typename... Args>
35 void bind(Arg&& arg, Args&&... args) {
36     bind(arg,I);
37     return bind<I + 1>((args)...);
38 }
39 
40 
41 
42 
43 int main()
44 {
45     std::string s = "str1";
46     bind<1>(1,2,"char*",s,std::string("s2"));
47     return 0;
48 }

 

 这里的函数通过变参模板 使用两个函数来遍历输入的变参

template<size_t I, typename Arg, typename... Args>
void bind(Arg& arg) {}

template<size_t I, typename Arg, typename... Args>
void bind(Arg&& arg, Args&&... args) {}

依次获取到参数后 使用模板进行类型TRAIT 获取参数类型 从而调用正确的函数setint()或者setstring()

代码运行结果如下

call SetInt(1,1)
call SetInt(2,2)
call SetString(3,char*)
call SetString(4,str1)
call SetString(5,s2)
请按任意键继续. . .

 

以上是关于mysql mariadb的VC客户端遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

VC+ADO访问数据库发现进程句柄数增加

安装mysql遇到的问题

强制 MariaDB 客户端使用 utf8mb4

linux下MySQL忘记root密码#yyds干货盘点#

Mariadb 连接客户端:mysql 8.0 上的用户访问被拒绝(使用密码:否)

怎么不要mysql,mariadb乱码