如何配置ODBC数据源??

apche CN 2000-12-13 08:33:00
BOOL CXXXXXX::SetupDSN()
{
HKEY hKey=NULL;
HKEY hODBC;

LONG lRet, lRet2;
DWORD dwLength, dwDataType;
TCHAR szPrevValue[32],szBuffer[32];
//======================================================
/* const TCHAR gzDatabase[] = _T("Database");
const TCHAR gzDriver[] = _T("Driver");
const TCHAR gzLastUser[] = _T("LastUser");
const TCHAR gzServer[] = _T("Server");

const TCHAR Database[] = _T("Notify");
const TCHAR Driver[] = _T("C:\\WINNT\\System32\\sqlsrv32.dll");
const TCHAR LastUser[] = _T("sa");
const TCHAR Server[] = _T("192.168.1.70"); */
//=======================================================
char szLangDLL[_MAX_PATH+14]; // Note: 8.3 name
GetSystemDirectoryA(szLangDLL, sizeof(szLangDLL));
CString str;
str.Format("%s\\sqlsrv32.dll",szLangDLL);
//Driver=(LPCSTR)str;

//================================================================
// 打开注册表键,不存在则创建!
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, NotifyDSN,0, KEY_READ|KEY_WRITE, &hKey );

if( lRet != ERROR_SUCCESS )//不存在则创建!
{
RegOpenKeyEx(HKEY_LOCAL_MACHINE, gzODBC,0, KEY_READ|KEY_WRITE, &hODBC );
DWORD dw;
lRet=RegCreateKeyEx(hODBC,NotifyDSN,0, REG_NONE,REG_OPTION_NON_VOLATILE,
KEY_WRITE|KEY_READ, NULL,&hKey, &dw);
}
//1 查询数据源名是否存在
dwLength = sizeof( szBuffer );//不存在则创建!
lRet = RegQueryValueEx(hKey, gzDatabase, NULL, &dwDataType, (LPBYTE)szBuffer, &dwLength );

if( lRet != ERROR_SUCCESS )
lRet2 = RegSetValueEx( hKey, gzDatabase, 0, REG_SZ,(LPBYTE)Database, strlen( Database ) );
else // 存在, 比较二者是否相同
{
dwLength = sizeof( szPrevValue );
lRet2 = RegQueryValueEx( hKey, gzDatabase, 0, &dwDataType, (LPBYTE)szPrevValue, &dwLength );
// 不相同则替换
if( lstrcmp( Database, szPrevValue ) )
{
lRet2 = RegDeleteValue( hKey, gzDatabase );
lRet2 = RegSetValueEx( hKey, gzDatabase, 0, REG_SZ,(LPBYTE)Database, strlen( Database ) );
}
}

// 2查询驱动器是否存在
dwLength = sizeof( szBuffer );
lRet = RegQueryValueEx(hKey, gzDriver, NULL, &dwDataType, (LPBYTE)szBuffer, &dwLength );

if( lRet != ERROR_SUCCESS )//不存在则创建!
lRet2 = RegSetValueEx( hKey, gzDriver, 0, REG_SZ,(LPBYTE)(LPCSTR)str, strlen(str) );
else
{
// 存在, 比较二者是否相同
dwLength = sizeof( szPrevValue );
lRet2 = RegQueryValueEx( hKey, gzDriver, 0, &dwDataType, (LPBYTE)szPrevValue, &dwLength );
// 不相同则替换
if( lstrcmp( Database, szPrevValue ) )
{
lRet2 = RegDeleteValue( hKey, gzDriver );
lRet2 = RegSetValueEx( hKey, gzDriver, 0, REG_SZ,(LPBYTE)(LPCSTR)str, strlen( str ) );
}
}

//3 查询用户是否存在
dwLength = sizeof( szBuffer );
lRet = RegQueryValueEx(hKey, gzLastUser, NULL, &dwDataType, (LPBYTE)szBuffer, &dwLength );

if( lRet != ERROR_SUCCESS )//不存在则创建!
lRet2 = RegSetValueEx( hKey, gzLastUser, 0, REG_SZ,(LPBYTE)LastUser, strlen(LastUser ) );
else
{
// 存在, 比较二者是否相同
dwLength = sizeof( szPrevValue );
lRet2 = RegQueryValueEx( hKey, gzLastUser, 0, &dwDataType, (LPBYTE)szPrevValue, &dwLength );
// 不相同则替换
if( lstrcmp( Database, szPrevValue ) )
{
lRet2 = RegDeleteValue( hKey, gzLastUser );
lRet2 = RegSetValueEx( hKey, gzLastUser, 0, REG_SZ,(LPBYTE)LastUser, strlen( LastUser ) );
}
}

//4 查询服务器是否存在
dwLength = sizeof( szBuffer );
lRet = RegQueryValueEx(hKey, gzServer, NULL, &dwDataType, (LPBYTE)szBuffer, &dwLength );

if( lRet != ERROR_SUCCESS )//不存在则创建!
lRet2 = RegSetValueEx( hKey, gzServer, 0, REG_SZ,(LPBYTE)Server, strlen(Server ) );
else
{
// 存在, 比较二者是否相同
dwLength = sizeof( szPrevValue );
lRet2 = RegQueryValueEx( hKey, gzServer, 0, &dwDataType, (LPBYTE)szPrevValue, &dwLength );
// 不相同则替换
if( lstrcmp( Database, szPrevValue ) )
{
lRet2 = RegDeleteValue( hKey, gzServer );
lRet2 = RegSetValueEx( hKey, gzServer, 0, REG_SZ,(LPBYTE)Server, strlen(Server ) );
}
}
// 关闭注册表键
RegCloseKey( hKey );
return TRUE;
}
//=================================================================
我想动态配置ODBC,使用户可以访问SQL server 数据库。

我在应用程序通过以上命令将ODBC dada source 写入注册表,从而动态配置ODBC,
跨越 window NT 域的用户无需手动配置ODBC即可访问数据库。
但问题是:SQL server 却省使用 named pipe 方式访问,named pipe 方式不能跨越 window NT 域,我想使用TCP/IP客户访问方式,TCP/IP客户访问能跨越 window NT 域
,应该如何配置???

...全文
5779 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
SunnyWay 2000-12-14
  • 打赏
  • 举报
回复
再加一篇参考文章:http://www.yesky.com/33554432/34603008/34668544/90591.htm
土豆 2000-12-13
  • 打赏
  • 举报
回复
转载:

用Visual C++程序实现设置ODBC数据源
苏州供电局信息中心
唐一均
---- ODBC(Open Database Conectivity)即开放式数据库互联,作为Windows开放性结构的一个重要部分已经为很多的Windows程序员所熟悉,ODBC的工作依赖于数据库制造商提供的驱动程序,使用ODBC API的时候,Windows的ODBC管理程序,把数据库访问的请求传递给正确的驱动程序,驱动程序再使用SQL语句指示DBMS完成数据库访问工作,因此,ODBC的存在为我们开发应用数据库程序提供了非常强大的能力和灵活性。

---- 为了使ODBC能与数据库一起工作,必须把数据库注册到ODBC驱动程序管理器,这项工作可以通过定义一个DSN或数据源名字来完成。通常,我们只能手动打开系统控制面板,运行其中的ODBC数据源管理器,手工配置数据源,但是这项工作对用户而言过于复杂,我们必须考虑用程序替用户完成这些配置工作。

---- 因此许多程序员在发布自己编写的数据库软件时候都希望能有一个优秀的安装程序能够自动设置好ODBC数据源,虽然现在InstallShield等一些优秀的安装制作软件可以帮助我们实现此类功能,但毕竟缺少灵活,程序员不能完全控制它,事实上,我们完全可以自己编写一些程序实现此类功能,实现的方法有几种,一种办法是用程序修改Windows注册表,程序员可以用Windows API函数增改HKEY_LOCAL_MACHINE\Software\ODBC下的ODBC.INI中的键值,这种方法比较烦琐。我现在推荐一种在程序中使用ODBC API的方法,程序员可以在任何时候都可以用Visual C++编写的程序调用这些API函数来设置ODBC数据源。

---- 下面我用MFC写一个程序来演示如何实现这个功能:

---- 首先,打开Visual C++,在File菜单上选New,然后选定MFC AppWizard(exe)类的项目,Project name我们定为try,按下OK键,下一Step 1屏幕中选Dialog based,由于不必用到后面的选项,此时即可按下Finish键,结果系统将生成一个新的项目。完成上述工作后,在左侧Workspace窗口中,选择ResourceView,打开try resources中的Dialog资源,选择并打开IDD_TRY_DIALOG对话窗口,在Controls菜单窗口中点选按键图标,回到IDD_TRY_DIALOG对话窗口并点击此窗口,将生成一个名叫Button1的按键,选中此按键再按鼠标右键,在弹出式菜单上选Properties选项,在出现的对话框中把Caption项的Button1值改为Setup ODBC,关闭此对话框,再选中此按键按鼠标右键,选择ClassWizard,在出现的对话窗口中,Object Ids选IDC_BUTTON1,Messages中双击BN_CLICKED,此时弹出Add Member Function对话窗,Member function name是OnButton1,按OK键。在Member functions选项中双击onButton1 ON_IDC_BUTTION1:BN_CLICKED,在出现的void CTryDlg::OnButton1()函数中用以下ODBC API函数语句替换 //TODO: Add your control notification handler code here这条注释语句:

  SQLConfigDataSource(NULL,ODBC_ADD
_SYS_DSN,"Microsoft Access Driver (*.mdb)\0","
DSN=TryDB\0DBQ=D:\\Database\try.mdb\0DEFAULTDIR=D:\\DATABASE\0\0");
  '

---- 您可以根据您不同的设置需要修改上面的语句,SQLConfigDataSource一般有以下几个许可的参数: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: 删除省缺的数据源说明部分。需要注意的是,当我们使用SQLConfigDataSource ODBC API函数时必须声明包含系统的odbcinst.h头文件,所以我们再选择workspace窗口中FileView打开Header Files中try.h,在其中加入#include "odbcinst.h",如果不加入这个头文件,系统编译时就会显示undeclared identifier错误,在完成上述步骤后,假如我们立即编译并Link这个项目,会发现出现下面的错误:
tryDlg.obj : error LNK2001: unresolved
external symbol _SQLConfigDataSource@16
Debug/try.exe : fatal error LNK1120:
1 unresolved externals

----  有些人可能因为找不出错误而放弃了,其实这是因为当我们使用SQLConfigDataSource 这个API函数时候必须用到odbccp32.dll,它是Microsoft提供的32位ODBC安装和管理的DLL,如果是16位必须用到odbcinst.dll,odbccp32.dll有一个import library,所以解决的办法就是把这个odbccp32.lib加到我们的项目中,我们可以打开Project系统菜单项,选Add to Project子菜单,在其中选Files项,打开VC安装目录下的\vc\lib\目录,文件类型选Library Files(.lib), 选择其中Odbccp32.lib后按OK键,然后重新编译即可通过,运行这个程序,将弹出对话窗,按下Setup ODBC按键,之后,您就可以通过控制面板的ODBC数据源管理器或注册表查看运行结果,您会发现,您的数据库已经成功的注册了。
---- 以上代码均在WIN98,VC5.0上编译通过,您可以灵活应用这些办法,让您编写的软件更易于安装维护和使用。

vcmfc 2000-12-13
  • 打赏
  • 举报
回复
使用ODBC API:SQLConfigDataSource()

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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