zoukankan      html  css  js  c++  java
  • 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)
    请按任意键继续. . .

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    数据库存储过程分页
    C#.net随机数函数
    文件下载文件名兼容中英文空格
    win7安装SQL2005出现29506错误
    SQL2008清空日志文件
    C#数字类型输出字符串时保留指定小数位数的方法
    对.NET中导出数据到EXCEL的几种方法探讨
    六种删除数据库重复行的方法 .
    修改表联合主键
    增加联合主键
  • 原文地址:https://www.cnblogs.com/itdef/p/7697746.html
Copyright © 2011-2022 走看看