如何配置ODBC数据源??
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 域
,应该如何配置???