对象、引用和引用计数

下一版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

任何 COM 应用程序都会接收对象引用,通过对象引用,这些应用程序可控制 SQL 分布式管理对象 (SQL-DMO) 对象的实例。无论使用何种应用程序开发工具,情况均是如此。

COM 将引用计数定义为 COM 服务器所创建对象的生存期管理机制。当 COM 客户端应用程序收到一个对象引用时,会隐式地将对象实例的引用计数加一。当 COM 客户端结束了对相应对象的引用后,它会使用 Release 函数将引用计数减一。当引用计数为零时,COM 服务器可能(根据其判断)释放用于实现该对象实例的资源。

如果使用 OLE 自动化控制器,如 Microsoft Visual Basic,控制器通常会按照引用该对象的变量的作用域的指示来维护引用和引用计数。例如,以下 Visual Basic 子例程演示的是一个应用程序接收对一个 Databases 集合的引用和对多个 SQL-DMO Database 和 OLE BSTR 对象的引用的情形:

复制
Private Sub ListDatabases(oSQLServer as SQLDMO.SQLServer)
    Dim oDatabase as SQLDMO.Database
    For Each oDatabase in oSQLServer.Databases
        lstDatabases.AddItem oDatabase.Name
    Next oDatabase
End Sub

开发人员永远无需显式地释放任何引用。相反,Database 对象引用作为在 For Each 循环中重新赋值的对象变量被释放。对 Databases 集合维护的引用和对 Database 对象获得的最后一个引用在 End Sub 语句执行之后作为作用域之外的变量被释放。OLE BSTR 对象引用甚至会得到更有效的隐藏和处理。

C/C++ 应用程序开发人员必须具有引用计数的意识并根据需要来控制引用计数。在从 SQL-DMO 库收到对象引用之后,应用程序将隐式地增加 SQL-DMO 对象实例的引用计数,如以下所示:

复制
void CDlgSelectDatabase::GetDatabases(LPSQLDMOSERVER pServer)
    {
    LPSQLDMODATABASE    pDatabase;
    BSTR                bstrDBName;
    LONG                nDatabase;
    LONG                nDatabases;

    HRESULT             hr;

    if (FAILED(hr = pServer->GetDatabaseCount(&nDatabases)))
        return;

    for (nDatabase = 0; nDatabase < nDatabases && SUCCEEDED(hr);
        nDatabase++)
        {
        pDatabase = NULL;
        bstrDBName = NULL;

        // Getting the next Database object from the collection
        // increases the client initiated reference count by one.
        hr = pServer->GetDatabaseByOrd(nDatabase, &pDatabase);

        // Getting a string back from SQL-DMO is also getting a
        // reference on an object. Be sure to release it.
        if (SUCCEEDED(hr))
            hr = pDatabase->GetName(&bstrDBName);

        if (SUCCEEDED(hr))
            m_listboxDatabases->AddString(bstrDBName);

        if (bstrDBName != NULL)
            SysFreeString(bstrDBName);

        if (pDatabase != NULL)
            pDatabase->Release();
        }
    }

为方便 C++ 开发人员使用,SQL-DMO 在 Sqldmo.h 中定义了可简化开发过程和感知作用域的模板类 CTempOLERefCTempBSTR

你可能感兴趣的:(sql,server,Microsoft,database,basic,reference,程序开发)