Asp sqlserver はストアド プロシージャを実行して、レコード セット オブジェクトが閉じられているときは操作が許可されないという一時的な解決策を返します。もっと良い方法があれば教えてください。
戻り値を取得したい場合は、Command メソッドを使用する必要があります。
まず、戻り値には2種類あります。 1 つは、C や VB の関数の戻り値と同じように、ストアド プロシージャで値を直接返す方法で、もう 1 つは複数の値を返す方法で、これらの値を格納する変数名を最初に呼び出しパラメータで指定する必要があります。 。
この例では、複数のパラメータ、入力パラメータ、出力パラメータ、戻りレコード セット、および直接戻り値を処理する必要があります (十分に完成していますか?)
ストアド プロシージャは次のとおりです。
次のようにコードをコピーします。
パブを利用する
行く
-- ストアド プロシージャを作成する
プロシージャ sp_PubsTest を作成する
-- 3 つのパラメーター変数を定義します。3 番目の変数は出力用に特別にマークされていることに注意してください。
@au_lname varchar (20)、
@intID int、
@intIDOut int 出力
として
SELECT @intIDOut = @intID + 1
選択 *
著者から
WHERE au_lname LIKE @au_lname + ''%''
-- 値を直接返す
戻り値 @intID + 2
このストアド プロシージャを呼び出す ASP プログラムは次のとおりです。
次のようにコードをコピーします。
<%@ 言語=VBScript %>
<%
ディムコマンドSP
ディマドRS
Dim adCmdSPStoredProc
ディム adParamReturnValue
薄暗い広告パラメータ入力
ディム adParamOutput
薄暗い広告整数
ディム・イヴァル
薄暗い楕円形
ディム・アドフィールド
ディム adVarChar
'これらの値は VB で事前定義された定数であり、直接呼び出すことができますが、VBScript では事前定義されていません
adCmdSPStoredProc = 4
adParamReturnValue = 4
adParaminput = 1
adParam出力 = 2
adInteger = 3
adVarChar = 200
iVal = 5
oVal = 3
'' コマンドオブジェクトを作成します
set CmdSP = Server.CreateObject("ADODB.Command")
''リンクの作成
CmdSP.ActiveConnection = "ドライバー={SQL Server};サーバー=(ローカル);Uid=sa;Pwd=;データベース=Pubs"
''コマンドオブジェクトの呼び出し名を定義します
CmdSP.CommandText = "sp_PubsTest"
''コマンド呼び出しタイプをストアド プロシージャに設定します (adCmdSPStoredProc = 4)
CmdSP.CommandType = adCmdSPStoredProc
''コマンドオブジェクトにパラメータを追加します
'' 直接の戻り値を持つストアド プロシージャを定義します。デフォルト値は 4 です。
CmdSP.Parameters.Append CmdSP.CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue, 4)
''文字入力パラメータを定義します
CmdSP.Parameters.Append CmdSP.CreateParameter("@au_lname", adVarChar, adParaminput, 20, "M")
''整数入力パラメータを定義します
CmdSP.Parameters.Append CmdSP.CreateParameter("@intID", adInteger, adParamInput, , iVal)
''整数出力パラメータを定義します
CmdSP.Parameters.Append CmdSP.CreateParameter("@intIDOut", adInteger, adParamOutput, oVal)
'' ストアド プロシージャを実行し、返されたレコードセットを取得します
adoRS = CmdSP.Execute を設定します
'' 各レコードを出力します。フィールドは仮想的なものなので無視できます。
adoRS.EOF ではない間
adoRS.Fields の各 adoField について
Response.Write adoField.Name & "= & adoField.Value & "<br>" & vbCRLF
次
応答。「<br>」と書いてください。
adoRS.MoveNext
ウェン
'' 2 つの出力値を出力します。
Response.Write "<p>@intIDOut = " & CmdSP.Parameters("@intIDOut").Value & "</p>"
Response.Write "<p>戻り値 = " & CmdSP.Parameters("RETURN_VALUE").Value & "</p>"
''クリーニング
adoRS = 何も設定しない
CmdSP.ActiveConnection = なしを設定します
CmdSP = 何も設定しない
%>
ASP を使用してストアド プロシージャを呼び出し、レコード セットを返すと、「オブジェクトが閉じられているときは操作は許可されません」というエラーが報告され続けます。多くの質問を検索しましたが、適切な解決策が見つかりませんでした。より信頼性の高いコードを作成します。
最後に、ストアド プロシージャで問題が発生していることがわかりました。例のストアド プロシージャでは問題はありませんでしたが、独自のストアド プロシージャを使用するとエラーが発生しました。
最終的な解決策は、私が使用するストアドプロシージャにそれを置くことです
各 Insert ステートメントの前に、set nocount on 文を追加します。つまり、カーソル ループ内に文を追加します。
具体的な理由はまだ掘り下げていないので、知っている人は指摘してください。