当前位置: 开源爱好者 » 编程教程 » VC++教程 » 正文

VC++ 代码控制链接ODBC

  • 时间:2016-10-15
  • 简述:ODBC

VC++使用代码控制链接ODBC,在使用VC、VB、Delphi 等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC 数据源。对于一般用户而言,配置ODBC 数据源可能是一件比较困难的工作。而且,在实际应用中,用户往往要求在同一个应用程序中访问不同的数据源,因此采用一般的加载方法存在严重缺陷。为能在程序中完成这一工作,方便应用程序的使用,本例以VC 为开发环境介绍在应用程序中代码控制链接ODBC。本例使用的仍然是前面例子多次使用的students 数据库,为了达到检验本例效果的目的,将控制面板中的students 数据源删除。编译并运行本例程序,实现方法:注册ODBC 数据源有两种方法:
(1)利用函数SQLConfigDataSource。由于VC 的缺省库文件中不包含SQLConfigDataSource 函数,因此使用该函数之前需要将 odbcinst.h 文件包含在工程的头文件中,在工程的Settings 属性对话框Link 属性页的Object/library modules 编辑框中增加odbc32.lib,同时保证系统目录system32 下有文件odbccp32.dll。该函数的原型如下:

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

hwndParent 参数是父窗口句柄。如果该值为NULL,将不会显示与父窗口有关的对话框。fRequest 参数可以设置为下面的数值之一:

ODBC_ADD_DSN:增加一个新的用户数据源。
ODBC_CONFIG_DSN:修改(配置)一个已经存在的用户数据源。
ODBC_REMOVE_DSN:删除一个已经存在的用户数据源。
ODBC_ADD_SYS_DSN:增加一个新的系统数据源。
ODBC_CONFIG_SYS_DSN:修改(配置)一个已经存在的系统数据源。
ODBC_REMOVE_SYS_DSN:删除一个已经存在的系统数据源。

lpszDriver 参数用于传递数据库引擎的名字,等同于方法一中strDbType 变量。lpszAttirbutes 参数是关键字的值。
(2)修改注册表。一般情况下,当用户在控制面板中配置好ODBC 数据源后,Windows 系统便在注册表中加入了一些子键来存储用户的配置结果。当应用程序需要用到数据源时,Windows 便会通知底层接口查阅注册表中该数据源的配置。如果用户删除了某个ODBC 数据源,那么也会在注册表中有所反应。如果读者配置的数据源是用户数据源, 则Windows 系统便会修改系统注册表的HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI 子键; 如果配置的数据源是系统数据源,Windows 系统便会修改注册表的HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI 主键。因此可以在应用程序中使用Windows API 中的注册表编辑函数来完成Windows 所做的工作,这样就可以达到动态加载数据源的目的。
鉴于第二种方法使用的普遍性和复杂性,本例介绍第二种方法。编写程序代码如下:
(1)使用以上介绍的students 数据库。
(2)通过AppWizard 生成基于对话框的应用程序CodeCtrlOdbc。
(3)给对话框增加两个编辑框控件,分别用来显示学号和姓名(测试注册数据源是否成功),分别生成对应的整型变量m_nID 和m_strName。
(4)给对话框增加注册数据源的函数LoadDbSource,其代码如下:

BOOL CCodeCtrlOdbcDlg::LoadDbSource(
CString strSourceName, //数据源名
CString strSourceDb, //数据库存放路径
CString strDescription //数据源描述字符串
)
{
HKEY hKey;
DWORD lDisp;
//注册数据源名
CString strSubKey="SOFTWARE\\ODBC\\ODBC.INI\\"+strSourceName;
RegCreateKeyEx(HKEY_CURRENT_USER,
strSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
&lDisp);
//注册ODBC 驱动程序
CString value1("C:\\WINNT\\System32\\odbcjt32.dll");
RegSetValueEx(hKey,
"Driver",
0,
REG_SZ,
(const unsigned char *)((LPCTSTR)value1),
strlen((LPCTSTR)value1)+1);
//注册数据库文件
CString value2 = strSourceDb;
RegSetValueEx(hKey,
"DBQ",
0,
REG_SZ,
(const unsigned char *)((LPCTSTR)value2),
strlen((LPCTSTR)value2)+1);
DWORD value3=(DWORD)25;
RegSetValueEx(hKey,
"DriverID",
0,
REG_DWORD,
(const BYTE *)&value3,
sizeof(DWORD));
CString value4("Ms Access");
RegSetValueEx(hKey,
"FIL",
0,
REG_SZ,
(const unsigned char *)((LPCTSTR)value4),
strlen((LPCTSTR)value4)+1);
DWORD value5=(DWORD)0;
RegSetValueEx(hKey,
"SafeTransactions",
0,
REG_DWORD,
(const BYTE *)&value5,
sizeof(DWORD));
CString value6("");
RegSetValueEx(hKey,
"UID",
0,
REG_SZ,
(const unsigned char *)((LPCTSTR)value6),
strlen((LPCTSTR)value6)+1);
return TRUE;
}

(5)使用ADO 链接数据库,在stdafx.h 文件中用#import 引入ADO 库文件,其代码如下:

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
rename("BOF","FirstOfFile")
#include "ICRSINT.H"

(6)给对话框类声明数据库连接和记录集的成员变量。

_ConnectionPtr m_pCon; //连接对象
_RecordsetPtr m_pRs; //记录集对象

(7)在对话框的OnInitialUpdate 函数中注册数据源,并打开数据库,显示第一条记录,其代码如下:

BOOL CCodeCtrlOdbcDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//其他初始化代码
//⋯⋯
//注册数据源
if(!LoadDbSource("students","F:\\vc 百例\\第八章\\students.mdb",""))
{
EndDialog(0);
return FALSE;
}
//初始化环境
::CoInitialize(NULL);
//创建并打开数据库连接对象
_variant_t vFieldValue;
CString strFieldValue;
m_pCon.CreateInstance(__uuidof(Connection));
m_pCon->Open("students","","",NULL);
//创建并打开记录集对象
m_pRs.CreateInstance(__uuidof(Recordset));
m_pRs->Open("select* from table1",m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
if(VARIANT_FALSE == m_pRs->EndOfFile)
{
//获得第一条记录并显示
vFieldValue = m_pRs->GetCollect("id");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_nID = atoi(strFieldValue.GetBuffer(0));;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("name");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_strName = strFieldValue;
vFieldValue.Clear();
}
UpdateData(FALSE);
return TRUE;
}

CopyRight 2018© 开源爱好者 All Rights Reserved 豫ICP备16030607号 隐私声明 网站地图