0

...特别是 MSSQL 2005 中的 fn_listextendedproperty 系统函数。

我向我的数据库对象添加了一个扩展属性,名为“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 AS schemaVer”更改为“SELECT value”。

编辑:根据建议将 Execute() 的第一个参数更改为 NULL。这解决了我原来的问题,然后我继续下一个。:)

4

2 回答 2

1

尝试为 fn_listextendedproperty 的每个参数指定 NULL 而不是默认值。这应该希望然后执行没有错误,只是让您检索结果作为下一步。

于 2009-03-26T22:05:09.837 回答
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

...然后从我的 ADO/C++ 代码中调用 thst sproc:

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

于 2009-03-27T14:47:36.120 回答