首页 > 系统相关 >windows odbc配置

windows odbc配置

时间:2024-09-28 14:13:01浏览次数:7  
标签:windows 配置 odbc ret SQLCHAR https SQL article

配置数据源

看这里:https://blog.csdn.net/buptlihang/article/details/80275641

代码

在windows下sqlext.h依赖于windows.h。详情看我的另一篇文章
示例代码:

#include <iostream>

#if defined(_WIN16) || defined(_WIN32) || defined(_WIN64)
#include <windows.h>
#endif
#include <sqlext.h>

using namespace std;

int main() {
    SQLHENV serverhenv;
    SQLHDBC serverhdbc;
    SQLHSTMT serverhstmt;
    SQLRETURN ret;

    static SQLCHAR dname[45], dno[10];

    SQLLEN length;

    //分配环境句柄
    ret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&serverhenv);

    //设置环境属性
    ret = SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
    if(!SQL_SUCCEEDED(ret))
    {
        cout<<"AllocEnvHandle error!"<<endl;
		return 0;
    }

    //分配连接句柄
    ret = SQLAllocHandle(SQL_HANDLE_DBC,serverhenv,&serverhdbc);
    if(!SQL_SUCCEEDED(ret))
    {
        cout<<"AllocDbcHandle error!"<<endl;
		return 0;
    }

    //数据库连接
    //第二个参数是之前配置的数据源,后面是数据库用户名和密码,如果数据源中已经指定了就直接写NULL即可。
    ret = SQLConnect(serverhdbc,(SQLCHAR*)"company",SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS);
    if(!SQL_SUCCEEDED(ret))
    {
        cout<<"SQL_Connect error!"<<endl;
		return 0;
    }

    //分配执行语句句柄
    ret = SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);

    //执行SQL语句
    ret=SQLExecDirect(serverhstmt,(SQLCHAR*)"select dname, dno from company.department;",SQL_NTS);
    if(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO){
        //绑定数据
        SQLBindCol(serverhstmt,1, SQL_C_CHAR, (void*)dname,sizeof(dname), &length);
        SQLBindCol(serverhstmt,2, SQL_C_CHAR, (void*)dno,sizeof(dno), &length);
        //将光标移动到下行,即获得下行数据
        cout << "dname\t\tdno\n";
        while(SQL_NO_DATA != SQLFetch(serverhstmt))
        {
            cout << dname << "\t\t" << dno << endl;
        }
    }

    //释放语句句柄
    ret=SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);
    if(SQL_SUCCESS!=ret && SQL_SUCCESS_WITH_INFO != ret)
        cout<<"free hstmt error!"<<endl;
    //断开数据库连接
    ret=SQLDisconnect(serverhdbc);
    if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
        cout<<"disconnected error!"<<endl;
    //释放连接句柄
    ret=SQLFreeHandle(SQL_HANDLE_DBC,serverhdbc);
    if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
        cout<<"free hdbc error!"<<endl;
    //释放环境句柄句柄
    ret=SQLFreeHandle(SQL_HANDLE_ENV,serverhenv);
    if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
        cout<<"free henv error!"<<endl;

    cout << "done" << endl;

    return 0;
}

编译

g++ main.cpp C:\Windows\System32\odbc32.dll -o main.exe

执行

.\main.exe

前面的.\千万不能少。

如果正确输出说明配置成功了。

在Qt中使用

我使用的是Qt creator。

设置使用utf-8编译

Qt creator的编辑器默认使用utf-8,但是编译时默认使用unicode(无语
如果不修改的话,大概率会出现这个编译错误

D:\git\small_projects\qt\db\dbap_company\odbc.cpp:35: error: cannot convert 'SQLCHAR* {aka unsigned char*}' to 'SQLWCHAR* {aka wchar_t*}' for argument '2' to 'SQLRETURN SQLConnectW(SQLHDBC, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT)'
     ret = SQLConnect(serverhdbc,(SQLCHAR*)dataSource,SQL_NTS,(SQLCHAR*)user,SQL_NTS,(SQLCHAR*)passwd,SQL_NTS);
                                                                                                             ^

说明编译器用了UNICODE。
修改方法是在xxxx.pro文件中加入

DEFINES  -= UNICODE

参考:
https://blog.csdn.net/seamanj/article/details/65861275
https://stackoverflow.com/questions/9770636/cannot-convert-char-to-wchar-qt-c

vs里的修改方法:https://blog.csdn.net/bzkmjczldxl/article/details/52053404

链接odbc

我这里使用的是odbc32
xxxx.pro中加入

LIBS += -lodbc32

总结

判断操作系统类型看我的另一篇文章
xxxx.pro中加入

win32 {
    DEFINES  -= UNICODE
    LIBS += -lodbc32
}
unix {
    LIBS += -lodbc
}

即可同时支持windows和linux。

其他问题

查询结果乱码

把odbc的数据源驱动从unicode版切换成ansi版

在这里插入图片描述

执行sql语句时odbc返回HY000错误

参考:https://blog.csdn.net/jiazhangyierzi/article/details/81215831
一般是因为数据库的字符集的问题。把数据库中所有的列的字符集都换成utf8即可。

在workbench中修改列字符集

在这里把所有列的charset修改成uft8

在这里插入图片描述

然后把数据库的默认编码设置成utf8

在这里插入图片描述

然后点击下面的apply。

通过命令

似乎可以一次性把所有字段都设置为utf8(我没试过)
https://jingyan.baidu.com/article/574c521976eea16c8d9dc1a1.html

标签:windows,配置,odbc,ret,SQLCHAR,https,SQL,article
From: https://www.cnblogs.com/searchstar/p/18437899

相关文章

  • STM32 f407 多通道ADC采集+DMA传输 基于HAL库和Cubemx配置
    在实际应用中ADC往往是要和DMA一起使用的,DMA将ADC转换值放入预设好的变量中,该过程不占用CPU资源,需要读取ADC输入时再让CPU读取变量即可。下面记录使用cubemx配置多通道ADC采集的具体流程,并编写对ADC采样值进行滤波的程序(选择开发板、开启外部时钟和SW调试接口、ProjectManage......
  • STM32 f407 多通道PWM输出 基于HAL库和Cubemx配置
    STM32PWM的相关理论知识可以参考江科大的视频教程,或者正点和野火的HAL库开发手册,以下是相关链接:[6-4]PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机_哔哩哔哩_bilibili31.TIM—高级定时器—[野火]STM32HAL库开发实战指南——基于野火F4系列开发板文档下面记录一下使......
  • 解决安装windows后Linux引导被覆盖的问题
    强烈谴责windows的霸道行径!!!首先安装windows时提示检测到EFI分区为NTFS格式,请格式化为FAT32后重试。但是所有的EFI分区都是FAT32的。然后我尝试着把之前安装Linux时设置的EFI分区删了,使用windows安装程序自己生成的EFI分区,然后就安装成功了,但是Linux就进不去了。方法一:再安装一个......
  • Node.js安装及详细配置(测试环境搭建)
    文章目录前言一、下载二、安装三、配置环境新建文件夹配置环境变量1.用户变量修改2.系统变量增加3.path路径增加修改默认文件夹测试默认位置是否更改成功报错解决方法npm源为更换国内镜像1.查看当前使用的镜像路径2.修改默认源全局安装基于淘宝源的cnpm1.cnpm安装意义......
  • Android SDK工具(SDK Manager)下载与配置安装(测试环境搭建)
    文章目录一、前言二、下载三、SDKManager1.SDKTools2.SDKPlatformTools3.SDKBuildTools4.Adroid系统四.环境配置1.ANDROID_HOME设置2.Path配置3.验证配置一、前言在安卓开发和测试中,AndroidSDK起着关键作用。如今,AndroidStudio已将AndroidSDK合并......
  • 【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
    ......
  • ClioSoft SOS深度解析:从基础入门到高级配置全攻略
    这个目录为用户提供了全面的ClioSoftSOS学习指南,涵盖了从基础概念到高级配置的所有方面。以下是每个部分的简要总结,每个目录内容将持续更新,欢迎大家收藏关注专栏《ClioSoftSOS深度解析:从基础入门到高级配置全攻略》,专栏地址:https://blog.csdn.net/qq_24766857/category_12......
  • 什么是ClioSoft SOS?它在硬件配置管理中扮演什么角色?
    ClioSoftSOS(SoftwareOptimizationSystem)是一种硬件配置管理(HardwareConfigurationManagement,HCM)软件,专为电子设计自动化(EDA)行业中的集成电路(IC)设计团队提供数据管理和版本控制功能。SOS帮助设计团队有效地管理项目文件和库,确保设计过程中数据的一致性、完整性和可追溯性......
  • Ini文件读写配置工具类 - C#小函数类推荐
          此文记录的是INI文件的读写工具类。/***Ini文件读写配置工具类AustinLiu刘恒辉ProjectManagerandSoftwareDesignerE-Mail:[email protected]:http://lzhdim.cnblogs.comDate:2024-01-1515:18:00使用说明:......
  • 要优化和配置Windows蓝牙设备的注册表设置,可以创建一个.reg文件,帮助修改相关的注册表
    要优化和配置Windows蓝牙设备的注册表设置,可以创建一个.reg文件,帮助修改相关的注册表项。以下是详细说明及示例代码。1.创建 .reg 文件您可以使用文本编辑器(如记事本)来创建一个.reg文件。下面是一些常见的蓝牙相关注册表路径和设置。2.常用蓝牙注册表路径蓝牙服务设置:......