如题,我的程序是用sql-server数据库来操纵数据的,在发布程序的时候,想做一个自动添加数据库的程序,让用户可以直接运行这个程序,就可以在ODBC里注册数据源并且把数据库加到服务器上,而不必去操作sql-server来实现安装数据库,谢谢各位了!!!!!!
解决方案 »
- 求助:异常: 0xC0000005: 读取位置 0x66542990 时发生访问冲突
- 急!Tab控件显示不了!!!请各位帮我看看原因
- 如何CString转16进制Byte?
- 我用GetMessage打算捕捉几个鼠标输入点,但期间窗口不能刷新
- 窗口分割后,如何对其中的某一个框架窗口操作?
- 谁有jpeg2000源代码,急求!!
- com/dcom怎么入门?
- 关于RichEdit的问题?
- 如何修改所有窗口的系统菜单?
- 怎样用DCOM传输大批量数据最好,比如long *p = new[0x12345];Init(p);传输p?
- CString::Format( _T( "%.100f" ), double )好象有BUG还有什么函数可以把double刑转换成String 么?
- 求教执行错误原因:Debug Assertion Failed!
ODBC数据源的一些信息都存放在注册表中。
HKEY_LOCAL_MECHINE\Software\ODBC\ODBCINST.INI
从此键下可得知系统是否已经安装SQL Server驱动程序
HKEY_LOCAL_MECHINE\Software\ODBC\ODBC.INI
从此键下可得知系统已经建立的数据源.
实现函数如下:
//////////////////////////////////////////////////////////////////
//Function: MakeSQLServerODBCDSN
//
//Purpose: 配置SQL Server数据源
//Parameters:
// [in]
// strDBServer: 数据库所在主机
// strDBName: 数据库名称
// strDSN: 数据源名称
// strUID: 登陆用户
//Return Value:
// -1: 没有安装SQL Server驱动程序
// -2: 其他错误
// 0: 成功
//////////////////////////////////////////////////////////////////
int MakeSQLServerODBCDSN(LPCTSTR strDBServer,LPCTSTR strDBName,LPCTSTR strDSN,LPCTSTR strUID)
{
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+=strDSN;
lRet=regKey.Create(HKEY_LOCAL_MACHINE,strKeyValueName);
if(lRet!=ERROR_SUCCESS)
{
return -2;
}
regKey.SetValue(strDBName,"Database");
regKey.SetValue("SQLSrv32.dll","Driver");
regKey.SetValue(strDBServer,"Server");
regKey.SetValue(strUID,"LastUser");
regKey.m_hKey=HKEY_LOCAL_MACHINE;
regKey.SetKeyValue("Software\\ODBC\\ODBC.INI\\ODBC Data Sources","SQL Server",strDSN);
regKey.Close();
return 0;
}