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

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 に答える