Как вы вызываете системную функцию MSSQL из ADO / C ++? - PullRequest
0 голосов
/ 27 марта 2009

... в частности, системная функция fn_listextendedproperty в MSSQL 2005.

Я добавил в свой объект базы данных расширенное свойство с именем schemaVersion. В моем приложении MSVC, используя ADO, мне нужно определить, существует ли это расширенное свойство, и, если оно существует, вернуть из него строковое значение.

Вот код T-SQL, который делает то, что я хочу. Как мне написать это в C ++ / ADO или иным образом выполнить работу?

select value as schemaVer
from fn_listextendedproperty(default, default, default, default, default, default, default)
where name=N'schemaVersion'

Вот код, который я сначала попробовал. Не удалось с ошибкой, указанной ниже кода:

_CommandPtr cmd;
cmd.CreateInstance(__uuidof(Command));
cmd->ActiveConnection = cnn;

cmd->PutCommandText("select value "
    "from fn_listextendedproperty(default, default, default, default, default, default, default) "
    "where name=N'schemaVersion'");
VARIANT varCount;
cmd->Execute(NULL, NULL, adCmdText);

... вот ошибки, которые я вычеркнул из коллекции ошибок ADO. Вывод из моей маленькой служебной функции, которая добавляет дополнительный текст, такой как идентификатор потока и т. Д., Поэтому игнорируйте это.

(Proc:0x1930, Thread:0x8A0) INFO : ===   1 Provider Error Messages : =======================
(Proc:0x1930, Thread:0x8A0) INFO : [  1]   (-2147217900) 'Incorrect syntax near the keyword 'default'.'
(Proc:0x1930, Thread:0x8A0) INFO :         (SQLState = '42000')
(Proc:0x1930, Thread:0x8A0) INFO :         (Source = 'Microsoft OLE DB Provider for SQL Server')
(Proc:0x1930, Thread:0x8A0) INFO :         (NativeError = 156)
(Proc:0x1930, Thread:0x8A0) INFO : ==========================================================

РЕДАКТИРОВАТЬ : Обновлен вызов в соответствии с предложениями. Также изменено «SELECT value AS schemaVer» на просто «SELECT value».

РЕДАКТИРОВАТЬ : изменен первый параметр Execute () на NULL для каждого предложения. Это исправило мою первоначальную проблему, и я перешел к следующему. :)

Ответы [ 2 ]

1 голос
/ 27 марта 2009

Попробуйте указать NULL, а не значение по умолчанию для каждого параметра fn_listextendedproperty. Надеемся, что это должно быть выполнено без ошибок, просто оставив вам возможность получить результат как следующий шаг.

0 голосов
/ 27 марта 2009

Я до сих пор не понял, как сделать это напрямую. Чтобы продолжить свою жизнь, я написал хранимую процедуру, которая вызвала функцию:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER PROCEDURE [dbo].[mh_getSchemaVersion]
@schemaVer VARCHAR(256) OUTPUT
AS
    select @schemaVer = CAST( (select value from fn_listextendedproperty(default, default, default, default, default, default, default) where name=N'schemaVersion') AS varchar(256) )
    return @@ROWCOUNT

... а затем вызвал thst sproc из моего кода ADO / C ++:

_CommandPtr cmd;
cmd.CreateInstance(__uuidof(Command));
cmd->ActiveConnection = cnn;
cmd->PutCommandText("mh_getSchemaVersion")_l

_variant_t schemaVar;
_ParameterPtr schemaVarParam = cmd->CreateParameter("@schemaVer", adVarChar, adParamOutput, 256);
cmd->GetParameters()->Append((IDispatch*)schemaVarParam);

cmd->Execute(NULL, NULL, adCmdStoredProc);

std::string v = (const char*)(_bstr_t)schemaVarParam->GetValue();

ver->hasVersion_ = true;

... что работает, но я не хотел развертывать новую хранимую процедуру.

Так что, если кто-то может найти решение исходной проблемы и показать мне, как вызывать системную функцию напрямую из ADO / C ++, я приму это в качестве ответа. В противном случае я просто приму это.

...