如何从ADO/C++调用MSSQL系统函数?

如何从ADO/C++调用MSSQL系统函数?,c++,sql,sql-server,tsql,ado,C++,Sql,Sql Server,Tsql,Ado,…具体而言,fn_在MSSQL 2005中列出了扩展属性系统函数 我向数据库对象添加了一个扩展属性,名为“schemaVersion”。在我的MSVC应用程序中,使用ADO,我需要确定扩展属性是否存在,如果存在,则从中返回字符串值 这是我想要的T-SQL代码。我该如何用C++/ADO编写这篇文章,或者以其他方式完成这项工作 select value as schemaVer from fn_listextendedproperty(default, default, default, defau

…具体而言,fn_在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错误集合中剥离的错误。输出来自我的小实用程序函数,它添加了额外的文本,如线程ID等,所以忽略它

(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更改为schemaVer,以仅选择值


编辑:根据建议将Execute的第一个参数更改为NULL。这解决了我原来的问题,我接着下一个问题

尝试为fn_listendedproperty的每个参数指定NULL而不是默认值。希望这样执行时不会出现错误,只是让您在下一步检索结果。

我还没有找到直接执行的方法。为了继续我的生活,我编写了一个调用函数的存储过程:

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
…然后从ADO/C++代码中调用thst存储过程:

_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++调用系统函数,我会接受这个答案。否则我就接受它。

我可以,这不是问题。即使我在命令文本中省略了使用,也会发生同样的失败。如果在执行调用中指定NULL作为第一个参数,会发生什么?这次我遇到了不同的错误。我将编辑原版。