• 【数据库】MFC ODBC(一)


    一、动态创建ODBC数据源

    ODBC API提供了动态创建数据源的函数SQLConfigDataSource。该函数的原型如下:

    BOOL SQLConfigDataSource ( HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes );

    参数说明如下:

    (1)hwndParent

    指定父窗口句柄,在不需要创建数据源对话框时,可以将该参数指定为NULL。

    (2)fRequest

    指定函数的操作内容,取值如下:

    ODBC_ADD_DSN: 加入一个新的用户数据源;

    ODBC_CONFIG_DSN:修改一个存在的用户数据源;

    ODBC_REMOVE_DSN:除一个存在的用户数据源;

    ODBC_ADD_SYS_DSN:增加一个新的系统数据源;

    ODBC_CONFIG_SYS_DSN:配置或者修改一个存在的系统数据源;

    ODBC_REMOVE_SYS_DSN:删除一个存在的系统数据源;

    ODBC_REMOVE_DEFAULT_DSN:删除省缺的数据源说明部分。

    (3)lpszDriver

    指定ODBC数据引擎名称。例如:Microsoft Access Driver (*.mdb)、SQL Server,Microsoft ODBC for Oracle等。

    (4)lpszAttributes

    指定ODBC数据源属性,包含配置数据源所必要的一组关键字-值的列表。部分关键字描述如下:

    DSN:数据源名称;

    FILEDSN:文件数据源名称;

    DRIVER:数据驱动的描述;例如:SQL Server, ORACLE等。

    UID:用户ID;

    PWD:UID对应的口令,如果没有口令,也可为空字符串;

    SAVEFILE:保存维持当前成功连接的关键字属性值的.dsn文件名称;

    DATABASE:数据库名称;

    DBQ:数据库文件绝对路径(包含文件名);

    DEFAULTDIR:缺省数据库文件路径(不包含文件名);

    注意:

    1)如果lpszAttributes提供的信息不够完善,在创建过程中就会出现对话框要求用户提供相应信息。

    2)每两个Key-Name值之间用''隔开,最后一个Key-Name值后面有两个''。

    3)运行regedit打开注册表,依次打开HKEY_CURRENT_USER->Software->ODBC->ODBC.INI,可以看到已注册的DSN,可以仿照已注册的DSN属性来设置lpszAttributes。

    4)DSN的名字必须唯一,如果要注册的DSN已被注册过,那么SQLConfigDataSource就修改原来DSN的属性。

    注意:

    1、使用SQLConfigDataSource函数时必须声明包含系统的odbcinst.h头文件。

    2、使用SQLConfigDataSource函数时必须用到odbccp32.dll,它是Microsoft 提供的32 位ODBC安装和管理的DLL,如果是16 位必须用到odbcinst.dll,odbccp32.dll 有一个import library。解决办法是把odbccp32.lib加到我们的项目中,我们可以打开Project系统菜单项,选Add to Project子菜单,在其中选Files项,打开VC安装目录下的vclib目录,文件类型选Library Files(.lib) , 选择其中odbccp32.lib后按OK键。同时将ODBCCP32.DLL放于系统子目录下。

    举例如下:

    CString strDir;
    ::GetCurrentDirectory(MAX_PATH, strDir.GetBuffer(MAX_PATH + 1));
    strDir.ReleaseBuffer();
    
    TCHAR szTempPath[MAX_PATH + 1] = {''};
    sprintf(szTempPath, "DSN=%s!DBQ=%s!DEFAULTDIR=%s!!", CString("SOWM") 
            , strDir + CString("\SOWM.mdb"), strDir);
    
    int szTempPathLen = strlen(szTempPath);
    for (int i = 0; i < szTempPathLen; ++i) {
        if (szTempPath[i] == '!')
            szTempPath[i] = '';
    }
    
    if (!SQLConfigDataSource(NULL, ODBC_ADD_SYS_DSN
        , "Microsoft Access Driver (*.mdb)"
        , (LPCSTR)szTempPath)) {
        AfxMessageBox("配置ODBC数据源失败!");
        return FALSE;
    }

    如果要访问局域网上的Access文件,lpszAttributes可加入:Data Source=\IP地址\共享文件夹\SOWM.mdb。


    二、连接数据源

    举例如下:

    //测试是否处于打开状态
    if (!m_Database.IsOpen()) {
        TRY 
        {
            if (!m_Database.OpenEx(_T("SOWM"), CDatabase::noOdbcDialog))
                AfxMessageBox("Database Opened Failed.
    ");
        }
        CATCH (CMemoryException, e)
        {
            TRACE("Database Opened Memory Exception occur.
    ");
        }
        CATCH (CDBException, e)
        {
            TRACE("Database Opened DB Exception occur: %s
    ", e->m_strError);
        }
        END_CATCH
    }

     析构函数中加入:

    if (m_Database.IsOpen())
        m_Database.Close();

     注意:在stdafx.h中加入#include <afxdb.h>以支持数据库操作。

  • 相关阅读:
    base64是什么东东,base64 图片显示,在线编辑器
    中文字符 与 十六进制Unicode编码 相互转换
    全面理解Python中self的用法
    Python之使用元类MetaClass
    Python之MySQL数据库连接驱动aiomysql的使用
    Python实战网站开发:Day2编写Web App骨架
    Python实战网站开发:Day3编写ORM
    Python之MySQL数据库连接驱动pymysql的使用
    【CV基础】为什么一些深度学习的图像预处理使用mean=[0.485, 0.456, 0.406] and std=[0.229, 0.224, 0.225]来正则化?
    与人合作创业是一门大艺术(转)
  • 原文地址:https://www.cnblogs.com/mengwang024/p/4856112.html
Copyright © 2020-2023  润新知