2009-03-26 28 views
0

...特に、MSSQL 2005のfn_listextendedpropertyシステム関数です。ADO/C++からMSSQLシステム関数を呼び出す方法は?

データベースオブジェクトに '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 : ========================================================== 

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 

を...そして私の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++から直接システム関数を呼び出す方法を私に示してもらえれば、答えとして受け入れます。さもなければ、私はこれを受け入れるだけです。

1

fn_listextendedpropertyの各パラメータにデフォルトではなくNULLを指定してください。これはうまくいけば、エラーなしで実行し、次のステップとして結果を取得できるようにする必要があります。

+0

私はそれは問題ではありません。 –

+0

コマンドテキストからUSEを省略しても、同じエラーが発生します。 –

+0

OK。 –

関連する問題