如何用_ConnectionPtr的Excute方法来删除一个数据库? m_Connection->Execute("CREATE DATABASE [ST_Weather_DB]", NULL, adCmdText);其中m_Connection是一个连接对象,连接的数据库不是ST_Weather_DB,而是master数据库。结果报错,意思是无法删除ST_Weather_DB数据库,因为它正在被使用! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CREATE DATABASE [ST_Weather_DB]//创建?? //全局connection执行sql语句bool DbTheadCmd(_ConnectionPtr m_MyConnection,CString sql){ _variant_t RecordsAffected; try { m_MyConnection->Execute((_bstr_t)sql,&RecordsAffected,adCmdUnknown); } catch(_com_error e)///捕捉异常 { return false; } RecordsAffected.Clear(); return true;} 写错了,应该是:->Execute("DROP DATABASE [ST_Weather_DB]", NULL, adCmdText);就这样一条简单的语句,执行不成功,说数据库正在被使用。我确定,除了m_Connection建立了与数据库服务器的连接外(我连接的是master数据库),其它没有地方正在使用ST_Weather_DB数据库。我的连接也不应该算是在使用ST_Weather_DB数据库吧,因为我连接的是master数据库。 以下代码,清除访问进程和删除数据库我写成了两个步骤,也可以合并,不过这里为了描述方便。代码在本机测试成功1。使用企业管理器建立数据库ST_Weather_DB2。在企业管理器中打开这个数据库的某个表3。在没有第一个清除进程的步骤下运行,抛出异常 ,连接的数据库为另外一个TESTError info: Cannot drop the database 'ST_Weather_DB' because it is currently in use. Error info: IDispatch error #3092 因为数据库英文版缘故,提示为英文4。增加第一个步骤,清除进程,再运行代码连接的数据库为另外一个TEST,运行无异常,检查数据库'ST_Weather_DB' 已经被删除可能企业管理器里面仍然能看到,可以刷新或者关闭重新打开企业管理器,可以发现数据库被删除。如果你的环境仍然不成功,那只有从其他方面着手了,这需要更多的信息/**********************************************************数据库删除的DEMO***********************************************************/if(FAILED(::CoInitialize(NULL))) return;try{ _ConnectionPtr pConn = NULL ; _CommandPtr comm = NULL ; _ParameterPtr param =NULL ; HRESULT hr = S_OK; _bstr_t strCnn("Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=test;Data Source=(local)"); pConn.CreateInstance(__uuidof(Connection)); pConn->CursorLocation =adUseClient; pConn->ConnectionTimeout =60; pConn->Open (_bstr_t(strCnn),_bstr_t(""),_bstr_t(""),adModeUnknown);//清除指定数据库的进程和会话,以便后续的DROP得以运行 pConn->Execute("DECLARE @DBNAME VARCHAR(100); " "SET @DBNAME='ST_Weather_DB'; /*要关闭进程的数据库名*/" " DECLARE @S NVARCHAR(1000);" " DECLARE TB CURSOR LOCAL FOR" " SELECT S='KILL '+CAST(SPID AS VARCHAR)" " FROM MASTER..SYSPROCESSES " " WHERE DBID=DB_ID(@DBNAME);" " OPEN TB ;" " FETCH NEXT FROM TB INTO @S;" " WHILE @@FETCH_STATUS=0" " BEGIN" " EXEC(@S);" " FETCH NEXT FROM TB INTO @S;" " END" " CLOSE TB;" " DEALLOCATE TB;" ,NULL ,adCmdText);//进行drop数据库 _bstr_t sql("drop database ST_Weather_DB"); pConn->Execute(sql,NULL,adCmdText); if (pConn) if (pConn->State == adStateOpen) pConn->Close();}catch (_com_error pCome){ TRACE("Error info: %s \n", (LPCTSTR)(_bstr_t)(pCome.Description())); TRACE("Error info: %s \n", (pCome.ErrorMessage()));}::CoUninitialize(); 关于WinExec的参数问题 关于线程中消息处理的问题 MFC中UDP接收的问题 各位大侠,小女有一个难题,有关鼠标事件模拟问题 什么意思哦?? 想问问有哪位高手参与过“即插即用”上网? 打算考程序员,请问一个问题 高薪诚聘VC软件开发人才 寻求串口高速数据采集方案,急!!!!!!!!!!!!!!!! DialogBar怎么才能把变量传给主程序,比如说CEdit中的字符窜. .net winxp 和金山词霸一起安装有冲突吗? 我的金山词吧 怎么不能用呢?? 这条SQL语句报错,请问如何更改,我想在某一存储过程不存在是新建存储过程。
{
_variant_t RecordsAffected;
try
{
m_MyConnection->Execute((_bstr_t)sql,&RecordsAffected,adCmdUnknown);
}
catch(_com_error e)///捕捉异常
{
return false;
}
RecordsAffected.Clear();
return true;
}
->Execute("DROP DATABASE [ST_Weather_DB]", NULL, adCmdText);就这样一条简单的语句,执行不成功,说数据库正在被使用。
我确定,除了m_Connection建立了与数据库服务器的连接外(我连接的是master数据库),其它没有地方正在使用ST_Weather_DB数据库。我的连接也不应该算是在使用ST_Weather_DB数据库吧,因为我连接的是master数据库。
1。使用企业管理器建立数据库ST_Weather_DB
2。在企业管理器中打开这个数据库的某个表
3。在没有第一个清除进程的步骤下运行,抛出异常 ,连接的数据库为另外一个TESTError info: Cannot drop the database 'ST_Weather_DB' because it is currently in use.
Error info: IDispatch error #3092
因为数据库英文版缘故,提示为英文4。增加第一个步骤,清除进程,再运行代码连接的数据库为另外一个TEST
,运行无异常,检查数据库'ST_Weather_DB' 已经被删除可能企业管理器里面仍然能看到,可以刷新或者关闭重新打开企业管理器,可以发现数据库被删除。如果你的环境仍然不成功,那只有从其他方面着手了,这需要更多的信息/**********************************************************
数据库删除的DEMO
***********************************************************/
if(FAILED(::CoInitialize(NULL)))
return;
try
{ _ConnectionPtr pConn = NULL ;
_CommandPtr comm = NULL ;
_ParameterPtr param =NULL ; HRESULT hr = S_OK; _bstr_t strCnn("Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=test;Data Source=(local)"); pConn.CreateInstance(__uuidof(Connection));
pConn->CursorLocation =adUseClient;
pConn->ConnectionTimeout =60;
pConn->Open (_bstr_t(strCnn),_bstr_t(""),_bstr_t(""),adModeUnknown);//清除指定数据库的进程和会话,以便后续的DROP得以运行
pConn->Execute("DECLARE @DBNAME VARCHAR(100); "
"SET @DBNAME='ST_Weather_DB'; /*要关闭进程的数据库名*/"
" DECLARE @S NVARCHAR(1000);"
" DECLARE TB CURSOR LOCAL FOR"
" SELECT S='KILL '+CAST(SPID AS VARCHAR)"
" FROM MASTER..SYSPROCESSES "
" WHERE DBID=DB_ID(@DBNAME);"
" OPEN TB ;"
" FETCH NEXT FROM TB INTO @S;"
" WHILE @@FETCH_STATUS=0"
" BEGIN"
" EXEC(@S);"
" FETCH NEXT FROM TB INTO @S;"
" END"
" CLOSE TB;"
" DEALLOCATE TB;"
,NULL
,adCmdText);
//进行drop数据库
_bstr_t sql("drop database ST_Weather_DB");
pConn->Execute(sql,NULL,adCmdText); if (pConn)
if (pConn->State == adStateOpen)
pConn->Close();}
catch (_com_error pCome)
{
TRACE("Error info: %s \n", (LPCTSTR)(_bstr_t)(pCome.Description()));
TRACE("Error info: %s \n", (pCome.ErrorMessage()));}
::CoUninitialize();