...具体来说,是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。这解决了我原来的问题,然后我继续下一步。 :)
答案 0 :(得分:1)
尝试为fn_listextendedproperty的每个参数指定NULL而不是default。这应该可以毫无错误地执行,只需让您在下一步检索结果。
答案 1 :(得分: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 ++代码中调用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 ++调用系统函数,我将接受它作为答案。否则我会接受这个。