mcrblog

vcpp-ml

2003年01月

31

[vcpp 00060297] RE: [C++からストアドプロシージャ実行]


お世話になりまくっております。  藤沢@駄目プログラマーです。

島野様

ゲットできました!
ありがとうございます。

return値はずっと一番最後に取得していたのですが、引数の順番
も関係あるのかと思い、一番最初、途中など試したはずなのです
が、、、
ちゃんとコンパイルされてなかったのでしょうか?
パラメータ設定の前にreturn値取得を行い、リビルドしたら動作し
ました。

おもいっきりreturn値が取得できてました。
私も悔しいのでMSDNやSQLのOnlineHelpなど読みあさったのです
が、特に順序らしいことは記載されていませんでしたね。

return値は一番最初に取得せねばならないなんて知りませんでした。
(常識?私は最後が常識だと思ってました。だって最後にreturnする
から・・・)

おおぉぉ・・・
また知識が増えました。
ここ1週間である程度ADOを使用したプログラムが書けるようになった
気でいます。(怒られそ~)

まだまだお話頂いて思うことは、基本がなってないです。わたし。。。
プログラム初めて4月で丸2年ですがこれからも精進します。
31

[vcpp 00060297] RE: [C++からストアドプロシージャ実行]


お世話になりまくっております。  藤沢@駄目プログラマーです。

島野様

ゲットできました!
ありがとうございます。

return値はずっと一番最後に取得していたのですが、引数の順番
も関係あるのかと思い、一番最初、途中など試したはずなのです
が、、、
ちゃんとコンパイルされてなかったのでしょうか?
パラメータ設定の前にreturn値取得を行い、リビルドしたら動作し
ました。

おもいっきりreturn値が取得できてました。
私も悔しいのでMSDNやSQLのOnlineHelpなど読みあさったのです
が、特に順序らしいことは記載されていませんでしたね。

return値は一番最初に取得せねばならないなんて知りませんでした。
(常識?私は最後が常識だと思ってました。だって最後にreturnする
から・・・)

おおぉぉ・・・
また知識が増えました。
ここ1週間である程度ADOを使用したプログラムが書けるようになった
気でいます。(怒られそ~)

まだまだお話頂いて思うことは、基本がなってないです。わたし。。。
プログラム初めて4月で丸2年ですがこれからも精進します。
31

[vcpp 00060296] Re: WM_QUERYENDSESSION の拾い方について

自己レスです。

そもそもの問題だったシャットダウン時に Socket Notification Sink というダイア
ログ発生ですが、下記サイトによると、MFC 内部でソケット通信時にウィンドウを
作っているらしく、それが悪さしているようですので、
思い切って、MFCを使わないでwinsock 関数でソケット通信をするようにしたら、
その後発生しなくなりました。

マルチスレッドアプリで、MFCのソケット通信を行うのは鬼門かも・・

http://www.apteryxware.com/xva/knowledgebase/topics/HELP__Socket_Notificatio
n_Sink_Error_Being_Generated_By_Windows.htm

皆様お騒がせいたしました。

by西田
31

[vcpp 00060296] Re: WM_QUERYENDSESSION の拾い方について

自己レスです。

そもそもの問題だったシャットダウン時に Socket Notification Sink というダイア
ログ発生ですが、下記サイトによると、MFC 内部でソケット通信時にウィンドウを
作っているらしく、それが悪さしているようですので、
思い切って、MFCを使わないでwinsock 関数でソケット通信をするようにしたら、
その後発生しなくなりました。

マルチスレッドアプリで、MFCのソケット通信を行うのは鬼門かも・・

http://www.apteryxware.com/xva/knowledgebase/topics/HELP__Socket_Notificatio
n_Sink_Error_Being_Generated_By_Windows.htm

皆様お騒がせいたしました。

by西田
31

[vcpp 00060295] RE: [C++からストアドプロシージャ実行]

島野です。補足です。

「引数が多すぎます」の件ですが、こちらでも現象が再現しました。
どうやら「戻り値」を指定する順番に関係あるようです。

  cd.Parameters.Append result     ' 戻り値
  cd.Parameters.Append paramIn    ' 引数1(入力)
  cd.Parameters.Append paramInOut ' 引数2(入出力)
  cd.Parameters.Append paramOut   ' 引数3(出力)

のように、戻り値、引数1、引数2、引数3・・・と、
Command オブジェクトにパラメータを追加する場合は、問題ありませんが、

  cd.Parameters.Append paramIn    ' 引数1(入力)
  cd.Parameters.Append paramInOut ' 引数2(入出力)
  cd.Parameters.Append paramOut   ' 引数3(出力)
  cd.Parameters.Append result     ' 戻り値

のように、順番を替えると「引数が多すぎます」のエラーになりました。
( result が「出力」パラメータとして扱われるようです。)
「「戻り値」パラメータは先頭で Append する必要がある」という明示的な
記述がヘルプに見当たらないのですが、恐らくこれが原因かと思います。

また、CreateParameter の第1引数の名称ですが、必ずしも
SP の引数の名前(パラメータ名)にする必要はありません。
逆に、明示的に NamedParameters(名前付きパラメータ)を True にセット
した場合は、SP のパラメータ名を指定する必要があります。

/*---------------------------------------------------------/
/* パラメータに入力、入出力、出力を持つSP(sp_test4.sql) */
/*---------------------------------------------------------/
create procedure sp_test4( @in integer, @inout integer output, @out integer output )
as
set @inout = @inout * 10
set @out = @in * 10
return @in

' ----------------------------------------------
' 戻り値を取得するサンプル(adotest4.vbs)
' ----------------------------------------------
Main

const adCmdStoredProc = 4
const adInteger = 3
const adParamInput = 1
const adParamOutput = 2
const adParamInputOutput = 3
const adParamReturnValue = 4

Sub Main()
  Dim cn
  Dim cd
  Set cn = CreateObject("ADODB.Connection")
  Set cd = CreateObject("ADODB.Command")
  cn.Open "SERVER=(local);DATABASE=db_test;PROVIDER=SQLOLEDB;", "sa", "passwordpassword"
  cd.CommandText = "sp_test4"
  cd.CommandType = adCmdStoredProc
  Dim paramIn    ' ADODB.Parameter
  Dim paramInOut ' ADODB.Parameter
  Dim paramOut   ' ADODB.Parameter
  Dim result
  Dim value1
  Dim value2
  value1 = 10 ' 初期値
  value2 = 20 ' 初期値
  ' CreateParameter により、Parameter オブジェクトを作成する。
  Set result     = cd.CreateParameter( "戻り値", adInteger, adParamReturnValue )
  Set paramIn    = cd.CreateParameter( "引数1", adInteger, adParamInput, , value1 )
  Set paramInOut = cd.CreateParameter( "引数2", adInteger, adParamInputOutput, , value2 )
  Set paramOut   = cd.CreateParameter( "引数3", adInteger, adParamOutput )

' 名前付きパラメータを利用した場合
'  cd.NamedParameters = True
'  Set result     = cd.CreateParameter( "戻り値", adInteger, adParamReturnValue )
'  Set paramIn    = cd.CreateParameter( "@in", adInteger, adParamInput, , value1 )
'  Set paramInOut = cd.CreateParameter( "@inout", adInteger, adParamInputOutput, , value2 )
'  Set paramOut   = cd.CreateParameter( "@out", adInteger, adParamOutput )

  ' 「戻り値」は常に先頭で Append しなければならないらしい(調査中)
  ' NamedParameters(名前付きパラメータ)を True にセットした場合は、
  ' 2番目以降の Append の順番を変更することができる。
  ' 
  cd.Parameters.Append result     ' 戻り値
  cd.Parameters.Append paramIn    ' 引数1(入力)
  cd.Parameters.Append paramInOut ' 引数2(入出力)
  cd.Parameters.Append paramOut   ' 引数3(出力)
  Set cd.ActiveConnection = cn

  WScript.Echo "<SP 実行前>"
  WScript.Echo result.Name     + ":" + CStr(result.Value)     ' 戻り値
  WScript.Echo paramIn.Name    + ":" + CStr(paramIn.Value)    ' 引数1
  WScript.Echo paramInOut.Name + ":" + CStr(paramInOut.Value) ' 引数2
  WScript.Echo paramOut.Name   + ":" + CStr(paramOut.Value)   ' 引数3

  ' SP を実行
  cd.Execute

  WScript.Echo "<SP 実行後>"
  WScript.Echo result.Name     + ":" + CStr(result.Value)     ' 戻り値
  WScript.Echo paramIn.Name    + ":" + CStr(paramIn.Value)    ' 引数1
  WScript.Echo paramInOut.Name + ":" + CStr(paramInOut.Value) ' 引数2
  WScript.Echo paramOut.Name   + ":" + CStr(paramOut.Value)   ' 引数3

  Set cd.ActiveConnection = Nothing
End Sub

--
記事検索
Amazon.co.jp
  • ライブドアブログ