您的位置:首页 > 其它

程序自动配置数据源——修改注册表法

2011-01-17 02:24 253 查看
如果您使用过ODBC(Open Database Connectivity),那么对数据源一定不陌生。ODBC数据源就是命名的一组信息,包括需要连结的数据库所在位置、对应的ODBC驱动程序以及访问数据库所需的其他相关信息,用户可以通过数据源的名称来指定所需的ODBC连接。我们可以把数据源理解为一种数据连接的抽象。基于ODBC的应用程序要访问一个数据库都必须注册一个数据源。
DSNs(Data Source Names)按照其保存方式和作用范围分为三种:用户DSN、系统DSN和文件DSN。每个文件DSN保存在单独的一个文件中,文件可以在网络范围内共享;用户DSN保存在注册表中,只对当前用户可见;系统DSN页保存在注册表中,但对系统中的所有用户可见。用户DSN和系统DSN的区别在于,用户DSN保存在注册表的HKEY_CURRENT_USER下,而系统DSN保存在HKEY_LOCAL_MACHINE下。
通常可以通过控制面板中的ODBC Data Source来配置ODBC的数据源,也可以安装程序来完成。不管是手工还是由安装程序来配置数据源,都缺乏灵活性。其实我们还可以在程序中自动配置数据源。这里就将介绍如何通过修改注册表来配置数据源。
函数功能:配置ACCESS2000系统数据源
函数原形:BOOL CreateSource(CString strSourceName, CString strFileName, CString strDescription)
函数参数说明:
1. strSourceName: 数据源的名字
2. strSourceDb: 带完整路径的数据库名
3. strDescription:数据源描述
BOOL CreateSource(CString strSourceName, CString strFileName, CString strDescription)
{
HKEY hKey;
DWORD dw;
// 存放注册表 API函数执行的返回值
LONG lreturn;
CString strSubKey;
// 检测是否安装了 MS Access ODBC driver:odbcjt32.dll
char sysDir[MAX_PATH];
char drvName[] = "//odbcjt32.dll";
GetSystemDirectory(sysDir, MAX_PATH);
strcat(sysDir, drvName);
CFileFind findFile;
if (!findFile.FindFile(sysDir))
{
AfxMessageBox("未安装MS Access的ODBC驱动程序odbcjt32.dll,无法注册数据源。", MB_OK | MB_ICONSTOP);
return FALSE;
}
strSubKey = "SOFTWARE//ODBC//ODBC.INI//" + strSourceName;
// 创建ODBC数据源在注册表中的子键
lReturn = RegCreateKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR) strSubKey, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dw);
if (lReturn != ERROR_SUCCESS)
{
return FALSE;
}
// 设置数据源的各项参数
CString strDbq = strFileName;
CString strDriver = sysDir;
DWORD dwDriverId = 25;
CString strFil = "MS Access;";
CString strPwd = strSourceName;
DWORD dwSafeTransactions = 0;
CString strUid = "";
::RegSetValueEx(hKey, "DBQ", 0L, REG_SZ, (CONST BYTE*) ((LPCTSTR) strDbq), strDbq.GetLength());
::RegSetValueEx(hKey, "Description", 0L, REG_SZ, (CONST BYTE*) ((LPCTSTR)strDescription), strDescription.GetLength());
::RegSetValueEx(hKey, "Driver", 0L, REG_SZ, (CONST BYTE*) ((LPCTSTR)strDriver), strDriver.GetLength());
::RegSetValueEx(hKey, "DriverId", 0L, REG_DWORD, (CONST BYTE*) (&dwDriverId), sizeof(dw));
::RegSetValueEx(hKey, "FIL", 0L, REG_SZ, (CONST BYTE*) ((LPCTSTR) strFil), strFil.GetLength());
::RegSetValueEx(hKey, "SafeTransactions", 0L, REG_DWORD, (CONST BYTE*) (&dwSafeTransactions), sizeof(dw));
::RegSetValueEx(hKey, "UID", 0L, REG_SZ, (CONST BYTE*) ((LPCTSTR) strUid), strUid.GetLength());
::RegCloseKey(hKey);
// 创建ODBC数据源的Jet子键
strSubKey += "//Engines//Jet";
lReturn = RegCreateKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR) strSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dw);
if (lReturn != ERROR_SUCCESS)
{
return FALSE;
}
// 设置该子键下的各项参数
CString strImplict = "";
CString strUserCommit = "Yes";
DWORD dwPageTimeout = 5;
DWORD dwThreads = 3;
DWORD dwMaxBufferSize = 2048;
::RegSetValueEx(hKey, "ImplicitCommitSync", 0L, REG_SZ, (CONST BYTE*) ((LPCTSTR) strImplict), strImplict.GetLength() + 1);
::RegSetValueEx(hKey, "MaxBufferSize", 0L, REG_DWORD, (CONST BYTE*) (&dwMaxBufferSize), sizeof(dw));
::RegSetValueEx(hKey, "PageTimeout", 0L, REG_DWORD, (CONST BYTE*) (&dwPageTimeout), sizeof(dw));
::RegSetValueEx(hKey, "Threads", 0L, REG_DWORD, (CONST BYTE*) (&dwThreads), sizeof(dw));
::RegSetValueEx(hKey, "UserCommitSync", 0L, REG_SZ, (CONST BYTE*) ((LPCTSTR) strUserCommit), strUserCommit.GetLength());
::RegCloseKey(hKey);
// 设置ODBC数据库引擎名称
strSubKey = "SOFTWARE//ODBC//ODBC.INI//ODBC Data Sources";
lReturn = RegCreateKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR) strSubKey, 0L, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dw);
if (lReturn != ERROR_SUCCESS)
{
return FALSE;
}
CString strDbType = "Driver do Microsoft Access (*.mdb)";
::RegSetValueEx(hKey, strSourceName, 0L, REG_SZ, (CONST BYTE*) ((LPCTSTR) strDbType), strDbType.GetLength());
return TRUE;
}
函数功能:删除ACCESS2000系统数据源
函数原形:BOOL DeleteSource(CString strSourceName)
函数参数说明:
1. strSourceName: 数据源的名字
BOOL DeleteSource(CString strSourceName)
{
HKEY hKey;
long lReturn;
// 删除相关键值
CString strSubKey = "SOFTWARE//ODBC//ODBC.INI//ODBC Data Sources//";
lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR) strSubKey, 0, KEY_WRITE, &hKey);
if (lReturn != ERROR_SUCCESS)
{
return FALSE;
}
if (RegDeleteValue(hKey, strSourceName) != ERROR_SUCCESS)
{
RegCloseKey(hKey);
return FALSE;
}
RegCloseKey(hKey);
// 删除相关主键
strSubKey = "SOFTWARE//ODBC//ODBC.INI//" + strSourceName;
if (RegDeleteKey(HKEY_LOCAL_MACHINE, strSubKey + "//Engines" + "//Jet") != ERROR_SUCCESS)
{
return FALSE;
}
if (RegDeleteKey(HKEY_LOCAL_MACHINE, strSubKey + "//Engines") != ERROR_SUCCESS)
{
return FALSE;
}
if (RegDeleteKey(HKEY_LOCAL_MACHINE, strSubKey) != ERROR_SUCCESS)
{
return FALSE;
}
return TRUE;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: