在VC中如何自动配置ODBC? 请问:在VC++6.0中如何自动配置ODBC? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SQLConfigDataSource 函数http://dev.21tx.com/2005/06/02/12666.html还有很多的示例,网上搜 ODBC API提供了动态创建数据源的函数SQLConfig DataSource。该函数的原型如下: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数据源的驱动 程序类别,例如,为了指定Access数据源,该参数应赋以字符串“Microsoft Access Driver (*.mdb)\0”;对SQL SERVER数据源,则应赋以字符串“SQL Server”。(4)参数lpszAttributes用于指定ODBC数据源属性。这个是具体的ODBC数据源连接字符串,如果不会写可以先用Windows提供有ODBC配置生成一个ODBC文件后再用记事本打开按它的格式自己写就行了。 先在控制面板---管理工具 建立ODBC数据源 ODBC API提供了动态创建数据源的函数SQLConfig DataSource。该函数的原型如下: 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数据源的驱动 程序类别,例如,为了指定Access数据源,该参数应赋以字符串“Microsoft Access Driver (*.mdb)\0”;对SQL SERVER数据源,则应赋以字符串“SQL Server”。 (4)参数lpszAttributes用于指定ODBC数据源属性。这个是具体的ODBC数据源连接字符串,如果不会写可以先用Windows提供有ODBC配置生成一个ODBC文件后再用记事本打开按它的格式自己写就行了。 直接写注册表也可以:#define REG_ODBC _T("SOFTWARE\\ODBC\\ODBC.INI\\MyDB")#define REG_ODBC_NAME _T("MyDB") HKEY hKey; char lstrPath[255]={0}; GetCurrentDirectory(255, lstrPath); strcat(lstrPath, _T("\\")); strcat(lstrPath, MDBFILE_NAME); // 查找数据源 LONG lResult=RegOpenKey(HKEY_LOCAL_MACHINE, REG_ODBC, &hKey); if (lResult == ERROR_SUCCESS) { DWORD nLength=0; char lstrDBQ[255]={0}; // 验证数据库文件位置 lResult=::RegQueryValueEx(hKey,_T("DBQ"),0L,0L,(BYTE * )(lstrDBQ),&nLength); RegCloseKey(hKey); if (lResult==ERROR_SUCCESS && !_tcscmp(lstrDBQ,lstrPath)) { return TRUE; } else { ::RegDeleteKey(HKEY_LOCAL_MACHINE,REG_ODBC); } } DWORD dwValue; CString strSubKey; char sysDir[MAX_PATH]; char drvName[]=_T("\\ODBCJT32.dll"); ::GetSystemDirectory(sysDir,MAX_PATH); strcat(sysDir, drvName); CFileFind findFile; if (!findFile.FindFile(sysDir)) { AfxMessageBox(LoadString(IDS_LOADDBDRV), MB_OK|MB_ICONSTOP); return FALSE; } strSubKey=REG_ODBC; lResult=::RegCreateKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)strSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwValue); if (lResult != ERROR_SUCCESS) { RegCloseKey(hKey); return FALSE; } // 添加数据源 CString strDbq=lstrPath; CString strDriver=sysDir; DWORD dwDriverId = 25; CString strFil=_T("MS Access;"); DWORD dwSafeTransactions=0; CString strUid=_T(""); CString strPwd=_T(""); CString strDescript=_T("My Demo Database"); ::RegSetValueEx(hKey,_T("DBQ"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR) strDbq),strDbq.GetLength()+1); ::RegSetValueEx(hKey,_T("Description"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR)strDescript),strDescript.GetLength()+1); ::RegSetValueEx(hKey,_T("Driver"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR)strDriver),strDriver.GetLength()+1); ::RegSetValueEx(hKey,_T("DriverId"),0L,REG_DWORD,(CONST BYTE * )(&dwDriverId),sizeof(dwValue)); ::RegSetValueEx(hKey,_T("FIL"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR)strFil),strFil.GetLength()+1); ::RegSetValueEx(hKey,_T("SafeTransactions"),0L,REG_DWORD,(CONST BYTE *)(&dwSafeTransactions),sizeof(dwValue)); ::RegSetValueEx(hKey,_T("UID"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strUid),strUid.GetLength()+1); ::RegSetValueEx(hKey,_T("PWD"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strPwd),strPwd.GetLength()+1); ::RegCloseKey(hKey); // 子键 strSubKey += _T("\\Engines\\Jet"); lResult=::RegCreateKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)strSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwValue); if (lResult != ERROR_SUCCESS) { RegCloseKey(hKey); return FALSE; } //设置子键下的各项参数 CString strImplict=_T(""); CString strUserCommit=_T("Yes"); DWORD dwPageTimeout=5; DWORD dwThreads=3; DWORD dwMaxBufferSize=2048; ::RegSetValueEx(hKey,_T("ImplicitCommitSync"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strImplict),strImplict.GetLength() + 1); ::RegSetValueEx(hKey,_T("MaxBufferSize"),0L,REG_DWORD , (CONST BYTE *)(&dwMaxBufferSize),sizeof(dwValue)); ::RegSetValueEx(hKey,_T("PageTimeout"),0L,REG_DWORD,(CONST BYTE *)(&dwPageTimeout),sizeof(dwValue)); ::RegSetValueEx(hKey,_T("Threads"),0L,REG_DWORD,(CONST BYTE * )(&dwThreads),sizeof(dwValue)); ::RegSetValueEx(hKey,_T("UserCommitSync"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strUserCommit),strUserCommit.GetLength()); ::RegCloseKey(hKey); //设置odbc数据库引擎名称 lResult=::RegCreateKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources"),0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwValue); if (lResult != ERROR_SUCCESS) { RegCloseKey(hKey); return FALSE; } CString strDbType=_T("Microsoft Access Driver (*.mdb)"); ::RegSetValueEx(hKey,REG_ODBC_NAME,0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strDbType),strDbType.GetLength()); RegCloseKey(hKey); 自动添加数据源的代码如下:#include <odbcinst.h>char szDesc[223];int mlen;sprintf(szDesc,"DSN=%s? DBQ=%s? DEFAULTDIR=%s?? ","TryDB","D:\\Database\\try.mdb","D:\\DATABASE");mlen = strlen(szDesc);for (int i=0; i<mlen; i++){ if (szDesc[i] == '?') szDesc[i] = '\0';}SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc); List control问题 获取直线长度 求Cmemfile用法详解 如何使用SOCKET在局域网传送文件????? VC++6.0编译报错 afx.h与windows.h的问题? 请大虾帮忙解决这个问题!马上结贴。再次送上100分 一个关于OLE服务器程序激活的问题,各位OLE高手们可以来看看吗? 有关icmp的问题 char* GetString(char cIn);到底返回什麼? 真的不想这样----------- MFC重画按钮
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数据源的驱动 程序类别,例如,为了指定Access数据源,该参数应赋以字符串“Microsoft Access Driver (*.mdb)\0”;对SQL SERVER数据源,则应赋以字符串“SQL Server”。(4)参数lpszAttributes用于指定ODBC数据源属性。这个是具体的ODBC数据源连接字符串,如果不会写可以先用Windows提供有ODBC配置生成一个ODBC文件后再用记事本打开按它的格式自己写就行了。
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数据源的驱动 程序类别,例如,为了指定Access数据源,该参数应赋以字符串“Microsoft Access Driver (*.mdb)\0”;对SQL SERVER数据源,则应赋以字符串“SQL Server”。 (4)参数lpszAttributes用于指定ODBC数据源属性。这个是具体的ODBC数据源连接字符串,如果不会写可以先用Windows提供有ODBC配置生成一个ODBC文件后再用记事本打开按它的格式自己写就行了。
#define REG_ODBC _T("SOFTWARE\\ODBC\\ODBC.INI\\MyDB")
#define REG_ODBC_NAME _T("MyDB") HKEY hKey;
char lstrPath[255]={0};
GetCurrentDirectory(255, lstrPath);
strcat(lstrPath, _T("\\"));
strcat(lstrPath, MDBFILE_NAME);
// 查找数据源
LONG lResult=RegOpenKey(HKEY_LOCAL_MACHINE, REG_ODBC, &hKey);
if (lResult == ERROR_SUCCESS)
{
DWORD nLength=0;
char lstrDBQ[255]={0};
// 验证数据库文件位置
lResult=::RegQueryValueEx(hKey,_T("DBQ"),0L,0L,(BYTE * )(lstrDBQ),&nLength);
RegCloseKey(hKey);
if (lResult==ERROR_SUCCESS && !_tcscmp(lstrDBQ,lstrPath))
{
return TRUE;
}
else
{
::RegDeleteKey(HKEY_LOCAL_MACHINE,REG_ODBC);
}
}
DWORD dwValue;
CString strSubKey;
char sysDir[MAX_PATH];
char drvName[]=_T("\\ODBCJT32.dll");
::GetSystemDirectory(sysDir,MAX_PATH);
strcat(sysDir, drvName);
CFileFind findFile;
if (!findFile.FindFile(sysDir))
{
AfxMessageBox(LoadString(IDS_LOADDBDRV), MB_OK|MB_ICONSTOP);
return FALSE;
}
strSubKey=REG_ODBC;
lResult=::RegCreateKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)strSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwValue);
if (lResult != ERROR_SUCCESS)
{
RegCloseKey(hKey);
return FALSE;
}
// 添加数据源
CString strDbq=lstrPath;
CString strDriver=sysDir;
DWORD dwDriverId = 25;
CString strFil=_T("MS Access;");
DWORD dwSafeTransactions=0;
CString strUid=_T("");
CString strPwd=_T("");
CString strDescript=_T("My Demo Database");
::RegSetValueEx(hKey,_T("DBQ"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR) strDbq),strDbq.GetLength()+1);
::RegSetValueEx(hKey,_T("Description"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR)strDescript),strDescript.GetLength()+1);
::RegSetValueEx(hKey,_T("Driver"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR)strDriver),strDriver.GetLength()+1);
::RegSetValueEx(hKey,_T("DriverId"),0L,REG_DWORD,(CONST BYTE * )(&dwDriverId),sizeof(dwValue));
::RegSetValueEx(hKey,_T("FIL"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR)strFil),strFil.GetLength()+1);
::RegSetValueEx(hKey,_T("SafeTransactions"),0L,REG_DWORD,(CONST BYTE *)(&dwSafeTransactions),sizeof(dwValue));
::RegSetValueEx(hKey,_T("UID"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strUid),strUid.GetLength()+1);
::RegSetValueEx(hKey,_T("PWD"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strPwd),strPwd.GetLength()+1);
::RegCloseKey(hKey);
// 子键
strSubKey += _T("\\Engines\\Jet");
lResult=::RegCreateKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)strSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwValue);
if (lResult != ERROR_SUCCESS)
{
RegCloseKey(hKey);
return FALSE;
}
//设置子键下的各项参数
CString strImplict=_T("");
CString strUserCommit=_T("Yes");
DWORD dwPageTimeout=5;
DWORD dwThreads=3;
DWORD dwMaxBufferSize=2048;
::RegSetValueEx(hKey,_T("ImplicitCommitSync"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strImplict),strImplict.GetLength() + 1);
::RegSetValueEx(hKey,_T("MaxBufferSize"),0L,REG_DWORD , (CONST BYTE *)(&dwMaxBufferSize),sizeof(dwValue));
::RegSetValueEx(hKey,_T("PageTimeout"),0L,REG_DWORD,(CONST BYTE *)(&dwPageTimeout),sizeof(dwValue));
::RegSetValueEx(hKey,_T("Threads"),0L,REG_DWORD,(CONST BYTE * )(&dwThreads),sizeof(dwValue));
::RegSetValueEx(hKey,_T("UserCommitSync"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strUserCommit),strUserCommit.GetLength());
::RegCloseKey(hKey);
//设置odbc数据库引擎名称
lResult=::RegCreateKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources"),0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwValue);
if (lResult != ERROR_SUCCESS)
{
RegCloseKey(hKey);
return FALSE;
}
CString strDbType=_T("Microsoft Access Driver (*.mdb)");
::RegSetValueEx(hKey,REG_ODBC_NAME,0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strDbType),strDbType.GetLength());
RegCloseKey(hKey);
int mlen;
sprintf(szDesc,"DSN=%s? DBQ=%s? DEFAULTDIR=%s?? ","TryDB","D:\\Database\\try.mdb","D:\\DATABASE");mlen = strlen(szDesc);
for (int i=0; i<mlen; i++)
{
if (szDesc[i] == '?')
szDesc[i] = '\0';
}SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc);