m_Connection->Execute("CREATE DATABASE [ST_Weather_DB]", NULL, adCmdText);其中m_Connection是一个连接对象,连接的数据库不是ST_Weather_DB,而是master数据库。结果报错,意思是无法删除ST_Weather_DB数据库,因为它正在被使用!

解决方案 »

  1.   

    CREATE DATABASE [ST_Weather_DB]//创建??
      

  2.   

    //全局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;
    }
      

  3.   

    写错了,应该是:
    ->Execute("DROP DATABASE [ST_Weather_DB]", NULL, adCmdText);就这样一条简单的语句,执行不成功,说数据库正在被使用。
    我确定,除了m_Connection建立了与数据库服务器的连接外(我连接的是master数据库),其它没有地方正在使用ST_Weather_DB数据库。我的连接也不应该算是在使用ST_Weather_DB数据库吧,因为我连接的是master数据库。
      

  4.   

    以下代码,清除访问进程和删除数据库我写成了两个步骤,也可以合并,不过这里为了描述方便。代码在本机测试成功
    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();