pTheConn.CreateInstance(__uuidof(Connection)); // 创建实例
_bstr_t conn="DSN=ybs1;UID=sa;PWD=";
pTheConn->Open(conn,"","",-1);
现在数据源名我固定了一个ybs1,现在我想通过打开文件操作来找到数据源,也就是说当数据源名改动时程序不用改动。如何做。谢谢。
_bstr_t conn="DSN=ybs1;UID=sa;PWD=";
pTheConn->Open(conn,"","",-1);
现在数据源名我固定了一个ybs1,现在我想通过打开文件操作来找到数据源,也就是说当数据源名改动时程序不用改动。如何做。谢谢。
如果这样的话你建一个文本文件即可,然后openfile, read
CFileDlg FileDlg(TRUE,".mdb","*.mdb",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"mdb文件");
FileDlg.DoModal();
CString strDBPath;
strDBPath = FileDlg.GetPathName();
HKEY hKey;
DWORD nLabel; CString strBaseKey = _T("SOFTWARE\\ODBC\\ODBC.INI");
CString strMid = strBaseKey + _T("\\ODBC Data Sources") ; if(strDBPath.IsEmpty()) return; CString strDataSource = strBaseKey + _T("\\jxj") ; CString strMdb = _T("Microsoft Access Driver (*.mdb)");
CString strDBDriver = _T("C:\\WINDOWS\\System32\\odbcjt32.dll");
CString strFIL = _T("Ms Access;");
CString strUID = _T(""); RegCreateKeyEx(HKEY_LOCAL_MACHINE,
strMid,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
&nLabel ); //获取数据源键值句柄 RegSetValueEx(hKey,
"jxj",
0,
REG_SZ,
(const unsigned char *)((LPCTSTR)strMdb),
strlen((LPCTSTR)strMdb)+1); //设置数据源类型 RegCreateKeyEx(HKEY_LOCAL_MACHINE,
strDataSource,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
&nLabel ); //创建数据源子键 RegSetValueEx(hKey,
_T("DBQ"),
0,
REG_SZ,
(const unsigned char *)((LPCTSTR)strDBPath),
strlen((LPCTSTR)strDBPath)+1); //数据库表的全路径 RegSetValueEx(hKey,
_T("Driver"),
0,
REG_SZ,
(const unsigned char *)((LPCTSTR)strDBDriver),
strlen((LPCTSTR)strDBDriver)+1); //ODBC驱动的全路径 RegSetValueEx(hKey,
_T("FIL"),
0,
REG_SZ,
(const unsigned char *)((LPCTSTR)strFIL),
strlen((LPCTSTR)strFIL)+1);//表的类型 RegSetValueEx(hKey,
_T("UID"),
0,
REG_SZ,
(const unsigned char *)((LPCTSTR)strUID),
strlen((LPCTSTR)strUID)+1);//必须项
DWORD DriverId = (DWORD)25;
RegSetValueEx(hKey,
_T("DriverId"),
0,
REG_DWORD,
(const BYTE *)(&DriverId),
sizeof(DWORD));//必须项
DWORD SafeTrans = (DWORD)0;
RegSetValueEx(hKey,
_T("SafeTransactions"),
0,
REG_DWORD,
(const BYTE *)(&SafeTrans),
sizeof(DWORD));//可选项
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
strDataSource + "\\Engines\\Jet",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
&nLabel ); //创建数据源子键
DWORD MaxBufferSize = (DWORD)800;
RegSetValueEx(hKey,
_T("MaxBufferSize"),
0,
REG_DWORD,
(const BYTE *)(&MaxBufferSize),
sizeof(DWORD)); DWORD PageTimeout = (DWORD)5;
RegSetValueEx(hKey,
_T("PageTimeout"),
0,
REG_DWORD,
(const BYTE *)(&PageTimeout),
sizeof(DWORD)); DWORD Threads = (DWORD)5;
RegSetValueEx(hKey,
_T("Threads"),
0,
REG_DWORD,
(const BYTE *)(&Threads),
sizeof(DWORD)); RegSetValueEx(hKey,
_T("UserCommitSync"),
0,
REG_SZ,
(const unsigned char *)("yes"),
strlen("yes"));
DBServer: 数据库所在主机
DBName: 数据库名称
DSN: 数据源名称
UID: 登陆用户
返回值:
-1: 没有安装SQL Server驱动程序
-2: 其他错误
0: 成功实现函数:
int MakeSQLServerODBCDSN(LPCTSTR DBServer,LPCTSTR DBName,LPCTSTR DSN,LPCTSTR UID)
{
BOOL bInstallDriver=TRUE;
CRegKey regKey; LONG lRet=regKey.Open(HKEY_LOCAL_MACHINE,"Software\\ODBC\\ODBCINST.INI\\SQL Server");
if(lRet!=ERROR_SUCCESS)
{
bInstallDriver=FALSE;
}
else
{
char szDirverPath[MAX_PATH]="";
DWORD dwCount=100;
lRet=regKey.QueryValue(szDirverPath,"Driver",&dwCount);
if((lRet!=ERROR_SUCCESS)||(dwCount<1))
{
DWORD dwErr=GetLastError();
bInstallDriver=FALSE;
}
regKey.Close();
}
if(!bInstallDriver)
{
return -1;
}
CString strKeyValueName="Software\\ODBC\\ODBC.INI\\";
strKeyValueName+=DSN;
lRet=regKey.Create(HKEY_LOCAL_MACHINE,strKeyValueName);
if(lRet!=ERROR_SUCCESS)
{
return -2;
}
regKey.SetValue(DBName,"Database");
regKey.SetValue("SQLSrv32.dll","Driver");
regKey.SetValue(DBServer,"Server");
regKey.SetValue(UID,"LastUser");
regKey.m_hKey=HKEY_LOCAL_MACHINE;
regKey.SetKeyValue("Software\\ODBC\\ODBC.INI\\ODBC Data Sources","SQL Server",DSN);
regKey.Close();
return 0;
}