2009-03-26 1 views
0

... в частности, системная функция fn_listextendedproperty в MSSQL 2005.Как вы вызываете системную функцию MSSQL из ADO/C++?

Я добавил расширенное свойство в свой объект базы данных с именем «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 : ========================================================== 

EDIT: Обновленный вызов в соответствии с предложениями. Также изменилось значение «SELECT value AS schemaVer» на «SELECT value».

EDIT: Изменен первый параметр Execute() на NULL на предложение. Это фиксировало мою первоначальную проблему, и я перешел к следующему. :)

ответ

0

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

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++, я согласен с этим в качестве ответа. В противном случае я просто соглашусь с этим.

1

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

+0

Я могу, это не проблема. –

+0

Даже когда я опускаю USE из текста команды, происходит тот же самый сбой. –

+0

ОК. Будет копать глубже ... –