在VC中如何自动配置ODBC?

zhucunwang2008 2008-11-10 06:13:48
请问:在VC++6.0中如何自动配置ODBC?
...全文
209 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
内存泄漏 2008-11-12
  • 打赏
  • 举报
回复
自动添加数据源的代码如下:

#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);
ddszhan 2008-11-11
  • 打赏
  • 举报
回复
直接写注册表也可以:
#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);
scq2099yt 2008-11-11
  • 打赏
  • 举报
回复
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文件后再用记事本打开按它的格式自己写就行了。
samuellei 2008-11-11
  • 打赏
  • 举报
回复
在ODBC数据源管理器建DSN
liuweibit 2008-11-11
  • 打赏
  • 举报
回复
学习!
ypine 2008-11-11
  • 打赏
  • 举报
回复
up
lirongjun1985 2008-11-10
  • 打赏
  • 举报
回复
先在控制面板---管理工具 建立ODBC数据源
xsc2001 2008-11-10
  • 打赏
  • 举报
回复
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文件后再用记事本打开按它的格式自己写就行了。
Kudeet 2008-11-10
  • 打赏
  • 举报
回复
SQLConfigDataSource 函数

http://dev.21tx.com/2005/06/02/12666.html

还有很多的示例,网上搜

4,012

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧