Поделиться через


Программирование расширенных объектов SQL-DMO

В следующей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.

Среди распределенных управляющих объектов SQL (SQL-DMO) в Microsoft SQL Server 2000 есть несколько новых объектов, несовместимых с более ранними выпусками. Большинство этих объектов имеют имена в формате ObjectName2 и расширяют функциональность объектов с аналогичными именами, поддерживаемых SQL Server версии 7.0. Например, объект UserDefinedDataType2 расширяет функциональность объекта UserDefinedDataType, предоставляя свойство Collation. Такие объекты, как UserDefinedDataType2, наследуют методы и свойства соответствующих базовых объектов. Поэтому приложение может всегда использовать объект UserDefinedDataType2 для вызова методов и свойств объекта UserDefinedDataType.

Это необходимо, чтобы изменить существующие приложения SQL Server 7.0, так как они не ссылаются на новые объекты, методы и свойства, предоставленные в SQL Server 2000 и более поздних версиях.

Использование C++ с расширенными объектами SQL-DMO

В приложениях C++, которые используют новые объекты SQL-DMO, нет необходимости предпринимать дополнительные программные шаги, если приложение будет использоваться только с экземплярами SQL Server 2000 и более поздними версиями. Но если приложения C++, в которых используются новые объекты SQL-DMO, применяются с SQL Server 7.0, при попытке использовать новый объект возникнет ошибка. Поэтому приложение должно вызвать метод IUnknown::QueryInterface, чтобы использовать объект ObjectName2 со связанным объектом, которому он наследует, и правильно обработать ошибки.

Эти примеры показывают, как применять объекты ObjectName2, использующие свойство Collation объекта UserDefinedDataType2. Первый пример демонстрирует использование в приложении, которое работает с SQL Server 2000 и более поздними версиями. Второй пример демонстрирует использование в приложении, которое может также выполняться с SQL Server 7.0.

Примеры

Ссылки на расширенные объекты SQL-DMO с SQL Server 2000 и более поздними версиями.

//Define variable.
LPSQLDMOUSERDEFINEDDATATYPE2 oUDDT2 = NULL;

// Do CoCreate Instance for UserDefinedDataType.
CoCreateInstance(CLSID_SQLDMOUserDefinedDataType, NULL, CLSCTX_INPROC_SERVER, IID_ISQLDMOUserDefinedDataType2, (LPVOID*) &oUDDT2))

oUDDT2->SetCollation(L"German_Phonebook_CI_AI_KI_WI");

// Now add the UserDefinedDataType object to the UserDefinedDataTypes // collection.

Ссылки на расширенные объекты SQL-DMO с SQL Server 7.0.

// Define variables.
LPSQLDMOUSERDEFINEDDATATYPE oUDDT = NULL;
LPSQLDMOUSERDEFINEDDATATYPE2 oUDDT2 = NULL;
HRESULT hr;

// Do CoCreate Instance for UserDefinedDataType.
CoCreateInstance(CLSID_SQLDMOUserDefinedDataType2, NULL, CLSCTX_INPROC_SERVER, IID_ISQLDMOUserDefinedDataType, (LPVOID*) &oUDDT))

// QueryInterface UserDefinedDataType2.
// Gracefully handle error situations arising from use with version // 7.0.
hr=oUDDT->QueryInterface(IID_ISQLDMOUserDefinedDatatype2,&oUDDT2);
if (SUCCEEDED(hr))
oUDDT2->SetCollation(L"German_Phonebook_CI_AI_KI_WI");
else
// oUDDT2 is not supported. Perform error handling routine.

// Now add the UserDefinedDataType object to the UserDefinedDataTypes // collection.

Использование Visual Basic с расширенными объектами SQL-DMO

В приложениях Visual Basic, которые используют новые объекты SQL-DMO, нет необходимости предпринимать дополнительные программные шаги, если приложение будет использоваться только с экземплярами Microsoft SQL Server 2000 и более поздними версиями. Не требуется дополнительных шагов для приложений Visual Basic, в которых используется позднее связывание. Однако, приложения Visual Basic, в которых используется раннее связывание, должны точно установить переменную объекта ObjectName2. Например, в этом образце кода метод StoredProcedures.Item возвращает объект StoredProcedure, но не объект StoredProcedure2.

Dim oSQLSvr2 as New SQLServer2
oSQLSvr2.Connect "Myserver","sa",""
MsgBox oSQLSrv2.Databases("northwind").StoredProcedures(1).Name

Однако при таком подходе метод StoredProcedures.Item вызывает метод IUnknown::QueryInterface для объекта StoredProcedure2:

Dim oStoredProc2 as SQLDMO.StoredProcedure2
Set oStoredProc2 = oSQLSrv2.Databases("northwind").StoredProcedures(1)
oStoredProc2.IsDeleted