当前位置: 首页 > article >正文

MFC(1)-odbc-ado-调用mysql,sqlserver

1.odbc调用mysql,sqlserver

1.1配置odbc

2.控制面板->管理工具->ODBC数据源管理程序->驱动配置与测试
 


 


1.2程序实现步骤

 

分配环境句柄 (SQLAllocHandle)
​分配连接句柄 (SQLAllocHandle)
​设置连接属性 (可选)
​建立数据库连接 (SQLConnect/SQLDriverConnect)
​分配语句句柄 (SQLAllocHandle)
​执行SQL语句 (SQLExecDirect/SQLPrepare+SQLExecute)
​处理结果集 (SQLBindCol+SQLFetch)
​释放语句句柄 (SQLFreeHandle)
​断开数据库连接 (SQLDisconnect)
​释放连接句柄 (SQLFreeHandle)
​释放环境句柄 (SQLFreeHandle)


1.3odbc-mysql实例代码

#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <stdio.h>

void MySQL_ODBC_Example() {
    SQLHENV henv = NULL;
    SQLHDBC hdbc = NULL;
    SQLHSTMT hstmt = NULL;
    SQLRETURN retcode;
    
    // 1. 分配环境句柄
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        printf("分配环境句柄失败\n");
        return;
    }
    
    // 设置ODBC版本
    SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
    
    // 2. 分配连接句柄
    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        printf("分配连接句柄失败\n");
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        return;
    }
    
    // 3. 连接MySQL数据库
    retcode = SQLConnect(hdbc, 
                        (SQLCHAR*)"MySQL_DSN", SQL_NTS,  // 数据源名称
                        (SQLCHAR*)"username", SQL_NTS,   // 用户名
                        (SQLCHAR*)"password", SQL_NTS);  // 密码
                        
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        printf("连接MySQL数据库失败\n");
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        return;
    }

     // 3. 连接MySQL数据库
     SQLCHAR connStr[] = 
     "DRIVER={MySQL ODBC 8.0 Unicode Driver};"
     "SERVER=127.0.0.1;"
     "PORT=3306;"
     "DATABASE=mydb;"
     "USER=root;"
     "PASSWORD=123456;"
     "OPTION=3;";
 
 SQLDriverConnect(hdbc, NULL, connStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
    
    // 4. 分配语句句柄
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        printf("分配语句句柄失败\n");
        SQLDisconnect(hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        return;
    }
    
    // 5. 执行查询
    retcode = SQLExecDirect(hstmt, (SQLCHAR*)"SELECT * FROM users", SQL_NTS);
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        printf("执行查询失败\n");
        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
        SQLDisconnect(hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        return;
    }
    
    // 6. 处理结果集
    SQLCHAR name[256];
    SQLLEN age;
    SQLBindCol(hstmt, 1, SQL_C_CHAR, name, sizeof(name), NULL);
    SQLBindCol(hstmt, 2, SQL_C_LONG, &age, 0, NULL);
    
    while (SQLFetch(hstmt) == SQL_SUCCESS) {
        printf("Name: %s, Age: %d\n", name, age);
    }
    
    // 7. 清理资源
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
}


1.4odbc-sqlserver 实例代码

#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <stdio.h>

void SQLServer_ODBC_Example() {
    SQLHENV henv = NULL;
    SQLHDBC hdbc = NULL;
    SQLHSTMT hstmt = NULL;
    SQLRETURN retcode;
    
    // 1. 分配环境句柄
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        printf("分配环境句柄失败\n");
        return;
    }
    
    // 设置ODBC版本
    SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
    
    // 2. 分配连接句柄
    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        printf("分配连接句柄失败\n");
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        return;
    }
    
    // 3. 连接SQL Server数据库 (使用连接字符串)
    SQLCHAR connStr[1024] = "DRIVER={ODBC Driver 17 for SQL Server};"
                           "SERVER=your_server_name;"
                           "DATABASE=your_database_name;"
                           "UID=your_username;"
                           "PWD=your_password;";
    
    SQLCHAR outConnStr[1024];
    SQLSMALLINT outConnStrLen;
    
    retcode = SQLDriverConnect(hdbc, NULL, connStr, SQL_NTS, 
                              outConnStr, sizeof(outConnStr), 
                              &outConnStrLen, SQL_DRIVER_NOPROMPT);
                              
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        printf("连接SQL Server数据库失败\n");
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        return;
    }
    
    // 4. 分配语句句柄
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        printf("分配语句句柄失败\n");
        SQLDisconnect(hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        return;
    }
    
    // 5. 执行存储过程
    retcode = SQLExecDirect(hstmt, (SQLCHAR*)"EXEC sp_GetUserData @UserId=123", SQL_NTS);
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        printf("执行存储过程失败\n");
        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
        SQLDisconnect(hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        return;
    }
    
    // 6. 处理结果集
    SQLCHAR userName[256];
    SQLCHAR email[256];
    SQLBindCol(hstmt, 1, SQL_C_CHAR, userName, sizeof(userName), NULL);
    SQLBindCol(hstmt, 2, SQL_C_CHAR, email, sizeof(email), NULL);
    
    while (SQLFetch(hstmt) == SQL_SUCCESS) {
        printf("User: %s, Email: %s\n", userName, email);
    }
    
    // 7. 清理资源
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
}



1.5odbc-mysql-sqlserver区别
 

1.连接字符串格式不同:

MySQL: "DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=localhost;DATABASE=testdb;..."
SQL Server: "DRIVER={ODBC Driver 17 for SQL Server};SERVER=your_server;DATABASE=your_db;..."

2.​认证方式:

MySQL通常使用用户名/密码
SQL Server可能使用Windows集成认证(Trusted_Connection=yes)

3.​特殊功能:

SQL Server支持存储过程、分布式事务等高级功能





 

2.ado调用mysql,sqlserver


2.1程序实现步骤

/*1.初始化COM库
​创建连接对象
​设置连接字符串
​打开数据库连接
​执行SQL命令
​处理结果集
​关闭连接
​释放COM资源
*/





 

2.2ado-mysql实例代码

#import "msado15.dll" no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF")

BOOL ExecuteMySQLQuery()
{
    // 1. 初始化COM
    ::CoInitialize(NULL);
    
    _ConnectionPtr pConn = NULL;
    _RecordsetPtr pRs = NULL;

    _ConnectionPtr pConn(__uuidof(Connection));
    _RecordsetPtr pRst(__uuidof(Recordset));
    
    try {
        // 2. 创建连接对象
        HRESULT hr = pConn.CreateInstance(__uuidof(Connection));
        if (FAILED(hr)) throw _com_error(hr);

        // 3. 设置连接字符串
        _bstr_t strConn = "Provider=MSDASQL;" //使用 MSDASQL Provider 桥接ODBC驱动。
                         "DRIVER={MySQL ODBC 8.0 Unicode Driver};" // 根据实际驱动版本调整
                         "SERVER=localhost;"//驱动名称需与系统安装的MySQL ODBC驱动一致(如MySQL ODBC 8.0 Unicode Driver)。
                         "DATABASE=testdb;"
                         "UID=username;"
                         "PWD=password;"
                         "OPTION=3;";

        // 4. 打开连接
        pConn->Open(strConn, "", "", adConnectUnspecified);

    
       // 5. 执行查询
    // 示例1:执行SELECT查询
    pRst = pConn->Execute("SELECT * FROM users", NULL, adCmdText);
    
    // 遍历结果集
    while (!pRst->adoEOF) {
        //处理数据...
        _bstr_t name = pRst->Fields->GetItem("name")->Value;
        long age = pRst->Fields->GetItem("age")->Value;
        pRst->MoveNext();
    }

    // 示例2:执行INSERT操作(参数化查询)
    _CommandPtr pCmd(__uuidof(Command));
    pCmd->ActiveConnection = pConn;
    pCmd->CommandText = "INSERT INTO products (name, price) VALUES (?, ?)";
    
    // 添加参数
    ParametersPtr params = pCmd->Parameters;
    params->Append(pCmd->CreateParameter("name", adVarChar, adParamInput, 255, "New Product"));
    params->Append(pCmd->CreateParameter("price", adDecimal, adParamInput, , 19.99));
    
    pCmd->Execute(NULL, NULL, adCmdText);
        
        // 6. 关闭连接
        pRs->Close();
        pConn->Close();
    }
    catch (_com_error &e) {
        printf("Error: %s\n", (char*)e.Description());
        return FALSE;
    }
    
    // 7. 释放资源
    if (pRs) pRs.Release();
    if (pConn) pConn.Release();
    ::CoUninitialize();
    
    return TRUE;
}

2.3ado-sqlserver实例代码

 

        只是sql 语句不同



3.ADO-ODBC-区别

 

- 1.检查头文件

- 有 #include <afxdb.h> → ODBC
     #include <sql.h>
     #include <sqlext.h>
     include <QSqlDatabase>  // Qt的ODBC封装 
- 有 #import "msado15.dll" → ADO
    #import "msado15.dll" no_namespace rename("EOF", "adoEOF")  → ADO  COM组件接口

2. 依赖库

- ODBC 依赖 odbc32.lib
- ADO 依赖 msado15.lib

 

- 3.查看连接字符串

- 包含 DRIVER= → ODBC
"DRIVER={SQL Server};SERVER=myserver;DATABASE=mydb;"  // 使用驱动

- 包含 Provider= → ADO
"Provider=SQLOLEDB;Data Source=myserver;Initial Catalog=mydb;User ID=user;Password=pass;"  // SQL Server
"Provider=MSDASQL;Driver={MySQL ODBC 5.3 Driver};Server=myserver;Database=mydb;User=user;Password=pass;"  // 通过ODBC的ADO


- 4.观察对象类型

特征	        ODBC	                         ADO
初始化	SQLAllocHandle, SQLConnect   CoCreateInstance, Connection.Open
执行查询	SQLExecDirect	         Recordset.Open
错误处理	SQLGetDiagRec	         Errors集合
事务控制	SQLTransact	            Connection.BeginTrans


- CDatabase / CRecordset → ODBC


- _ConnectionPtr / _RecordsetPtr → ADO

Windows: 依赖odbc32.dll
Linux: 依赖libodbc.so (通过unixODBC)
Qt: 需启用QODBC插件


- 5.看错误处理

- catch (CDBException* e) → ODBC
- catch (_com_error &e) → ADO








 


http://www.kler.cn/a/613471.html

相关文章:

  • AI大模型从0到1记录学习 day08
  • Go 语言标准库中encoding/xml模块详细功能介绍与示例
  • 【QT5 多线程示例】异步编程
  • Java 实现将Word 转换成markdown
  • fyrox 2D和3D游戏的制作
  • uvm factory
  • android studio调试aosp手机userdebug版本无法查看局部变量和参数问题如何解决?
  • 设置github 代理
  • 解决PLC通信会断然后报错的问题
  • 相对位置2d矩阵和kron运算的思考
  • MFC中的窗口线程安全性与CWnd类
  • 从 YOLO11 模型格式导出到TF.js 模型格式 ,环境爬坑,依赖关系已经贴出来了
  • 智慧养老时代:老年人慢性病预防与生活方式优化
  • 【今日EDA行业分析】2025年3月28日
  • 基于扩散模型的光照编辑新突破:IC-Light方法解析与优化
  • DeepSeek大模型应用开发新模式
  • 智能舵机:AI融合下的自动化新纪元
  • ADZS-ICE-2000和AD-ICE2000仿真器在线升级固件
  • Error:Flash Download failed
  • AIGC-广告助手创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)