ASP やストアド プロシージャ (Stored Procedure) に関する記事は数多くありますが、著者が実際に実践しているかどうかは疑問です。私が初心者だった頃、多くの関連情報を調べたところ、提供されている方法の多くが実際には同じではないことがわかりました。単純なアプリケーションの場合、これらのマテリアルは役立つかもしれませんが、基本的に同じで相互にコピーされるため、これらのマテリアルはこれに限定されます。少し複雑なアプリケーションの場合は、すべてが不明瞭になります。
ここで、基本的にストアド プロシージャを呼び出して SQL Server にアクセスします。次のテキストは完全に正しいとは保証できませんが、実践の概要であることを願っています。
ストアド プロシージャは、実行可能オブジェクトとしてデータベースに保存された 1 つ以上の SQL コマンドです。
定義は常に抽象的です。ストアド プロシージャは、実際には特定の操作を完了できる SQL ステートメントのセットですが、このステートメントのセットはデータベースに配置されます (ここでは SQL Server についてのみ説明します)。 ASP でストアド プロシージャを作成し、ストアド プロシージャを呼び出すと、SQL ステートメントと ASP コードの混在を避けることができます。これを行うことには少なくとも 3 つの利点があります。
まず、効率が大幅に向上します。ストアド プロシージャ自体の実行速度は非常に高速であり、ストアド プロシージャを呼び出すことでデータベースとの対話の数を大幅に減らすことができます。
第二に、安全性の向上です。 ASP コードに SQL ステートメントを混在させると、コードが侵害されると、ライブラリ構造も侵害されることになります。
第三に、SQL ステートメントの再利用に役立ちます。
ASP では、ストアド プロシージャは通常、コマンド オブジェクトを通じて呼び出されます。状況に応じて、この記事では他の呼び出し方法も紹介します。説明の便宜上、ストアドプロセスの入力と出力に従って次の簡単な分類が行われます。
1. 単一のレコード セットのみを返すストアド プロシージャは、次のストアド プロシージャを想定しています (この記事の目的は T-SQL 構文を説明することではないため、ストアド プロシージャは説明なしでコードのみを示します)
。
プロシージャの作成 dbo.getUserList
として
ノーカウントをオンに設定する
始める
select * from dbo.[ユーザー情報]
終わり
go
ストアド プロシージャは、userinfo テーブル内のすべてのレコードを取得し、レコード セットを返します。コマンド オブジェクトを通じてストアド プロシージャを呼び出すための ASP コードは次のとおりです。
'**コマンド オブジェクトを通じてストアド プロシージャを呼び出す**
DIM MyComm、MyRst
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr はデータベース接続文字列です
MyComm.CommandText = "getUserList" 'ストアド プロシージャ名を指定します
MyComm.CommandType = 4 'これがストアド プロシージャであることを示します
MyComm.Prepared = true '最初に SQL コマンドをコンパイルする必要があります
MyRst = MyComm.Execute を設定します
Set MyComm = Nothing
ストアド プロシージャで取得したレコード セットを MyRst に割り当てます。次に、MyRst を操作できます。
上記のコードでは、CommandType 属性はリクエストのタイプを示します。値と説明は次のとおりです。
-1 は、CommandText パラメータのタイプを決定できないことを示します
1 は、CommandText が一般的なコマンド タイプであることを示します
2 は、CommandText パラメータが既存のテーブル名であることを示します
4 CommandText パラメーターがストアド プロシージャの名前であることを示します
。ストアド プロシージャは、Connection オブジェクトまたは Recordset オブジェクトを通じて呼び出すこともできます。メソッドは次のとおりです。
'**Connection オブジェクトを通じてストアド プロシージャを呼び出します**。
DIM MyConn、MyRst
Set MyConn = Server.CreateObject("ADODB.Connection")
MyConn.open MyConStr 'MyConStr はデータベース接続文字列です
Set MyRst = MyConn.Execute("getUserList",0,4) '最後のパラメータは CommandType と同じ意味です
Set MyConn = Nothing
'**Recordset オブジェクトを通じてストアド プロシージャを呼び出す**
DIM MyRst
Set MyRst = Server.CreateObject("ADODB.Recordset")
MyRst.open "getUserList",MyConStr,0,1,4
'MyConStr はデータベース接続文字列で、最後のパラメータは CommandType と同じ意味を持ちます。
2. 入出力のないストアド プロシージャについては、次のストアド プロシージャを参照してください:
/*SP2*/
プロシージャの作成 dbo.delUserAll
として
ノーカウントをオンに設定する
始める
dbo.[ユーザー情報] から削除
終わり
go
ストアド プロシージャは、入力も出力も行わずに userinfo テーブル内のすべてのレコードを削除します。呼び出し方法は基本的に上記と同じですが、レコード セットを取得する必要がない点が異なります。
'**コマンドを通じてストアド プロシージャを呼び出します。物体**
ディムマイコム
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr はデータベース接続文字列です
MyComm.CommandText = "delUserAll" 'ストアド プロシージャ名を指定します
MyComm.CommandType = 4 'これがストアド プロシージャであることを示します
MyComm.Prepared = true '最初に SQL コマンドをコンパイルする必要があります
MyComm.Execute 'ここで設定されたレコードを取得する必要はありません
Set MyComm = Nothing
もちろん、このようなストアド プロシージャは Connection オブジェクトまたは Recordset オブジェクトを通じて呼び出すこともできますが、レコードセットを取得するために Recordset オブジェクトが作成されます。レコードセットが返されない場合は、Command オブジェクトを使用することをお勧めします。
3. SP2 と同様の操作を実行する場合、戻り値を持つストアド プロシージャは、データの一貫性を維持するために SQL Server の強力なトランザクション処理機能を最大限に活用する必要があります。さらに、実行ステータスを返すためにストアド プロシージャが必要になる場合があります。そのためには、SP2 を次のように変更します:
/*SP3*/。
プロシージャの作成 dbo.delUserAll
として
ノーカウントをオンに設定する
始める
取引を開始する
dbo.[ユーザー情報] から削除
IF @@エラー=0
始める
トランザクションのコミット
1を返す
終わり
それ以外
始める
ロールバックトランザクション
0を返す
終わり
戻る
終わり
go
ストアド プロシージャは、削除が正常に実行された場合は 1 を返し、それ以外の場合は 0 を返し、ロールバック操作を実行します。 ASP で戻り値を取得するには、Parameters コレクションを使用してパラメーターを宣言する必要があります。
'**戻り値を使用してストアド プロシージャを呼び出し、戻り値を取得します**
DIM マイコム、マイパラ
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr はデータベース接続文字列です
MyComm.CommandText = "delUserAll" 'ストアド プロシージャ名を指定します
MyComm.CommandType = 4 'これがストアド プロシージャであることを示します
MyComm.Prepared = true '最初に SQL コマンドをコンパイルする必要があります
'戻り値を宣言する
Set Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.MyPara の追加
MyComm.Execute
'戻り値を取得する
DIM retValue
retValue = MyComm(0) '或retValue = MyComm.Parameters(0)
Set MyComm = Nothing
在MyComm.CreateParameter("RETURN",2,4)中,各参数的含义如下:
第一个参数("RETURE")为参数名。パラメータ名は任意に設定できますが、通常はストアドプロシージャ内で宣言したパラメータ名と同じにする必要があります。これが戻り値です。通常は「RETURE」に設定します。
2 番目のパラメータ (2) はパラメータのデータ型を示します。具体的な型コードについては、ADO リファレンスを参照してください。
adBigInt: 20;
アドバイナリ: 128;
adBoolean: 11;
adChar: 129;
adDBTimeStamp: 135;
adEmpty: 0;
ad整数: 3;
adSmallInt: 2;
adTinyInt: 16;
adVarChar: 200;
戻り値は整数値のみを取ることができ、-1 ~ -99 は予約値です。
3 番目のパラメーター (4) はパラメーターの性質を示し、4 はこれが戻り値であることを示します。このパラメータの値の説明は次のとおりです。
0: タイプを決定できません; 1: 入力パラメータ; 3: 入力パラメータまたは出力パラメータ; 4: 戻り値
上記の ASP コードは、最も複雑なコードであると言えます。実際には、
Set Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara は
MyComm.Parameters.Append MyComm.CreateParameter("RETURN",2,4)
に簡略化でき
、さらに簡略化を続けることもできます。これについては後で説明します。
パラメータ付きのストアド プロシージャの場合、Command オブジェクトを使用してのみ呼び出すことができます (Connection オブジェクトまたは Recordset オブジェクトを通じて呼び出せるという情報もありますが、試していません)。
4. 入力パラメータと出力パラメータを持つストアド プロシージャの戻り値は、実際には特別な入力パラメータです。多くの場合、入力パラメータと出力パラメータの両方を持つストアド プロシージャを使用します。たとえば、ユーザー情報テーブル内の特定の ID を持つユーザーのユーザー名を取得したいとします。 --user ID、および出力パラメータ----ユーザー名。この関数を実装するストアド プロシージャは次のとおりです:
/*SP4*/
プロシージャの作成 dbo.getUserName
@ユーザーID int、
@UserName varchar(40) の出力
として
ノーカウントをオンに設定する
始める
@UserID が null の場合は戻ります
@ユーザー名=ユーザー名を選択してください
dbo より。[ユーザー情報]
ここで、ユーザーID=@ユーザーID
戻る
終わり
go
でストアド プロシージャを呼び出すための ASP コードは次のとおりです。
'**入力パラメータと出力パラメータを使用してストアド プロシージャを呼び出します**
DIM MyComm、ユーザーID、ユーザー名
ユーザーID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr はデータベース接続文字列です
MyComm.CommandText = "getUserName" 'ストアド プロシージャ名を指定します
MyComm.CommandType = 4 'これがストアド プロシージャであることを示します
MyComm.Prepared = true '要求将SQL命令先行编译
'パラメータを宣言する
MyComm.Parameters.append MyComm.CreateParameter("@UserID",3,1,4,UserID)
MyComm.Parameters.append MyComm.CreateParameter("@UserName",200,2,40)
MyComm.Execute
'パラメータを取得します
ユーザー名 = MyComm(1)
Set MyComm = Nothing
上記のコードでは、戻り値の宣言とは異なり、入力パラメーターを宣言する場合は 5 つのパラメーターが必要であり、出力パラメーターを宣言する場合は 4 つのパラメーターが必要であることがわかります。入力パラメータを宣言する場合、パラメータ名、パラメータのデータ型、パラメータの型、データ長、パラメータ値の 5 つのパラメータが使用されます。入力パラメータを宣言する場合、最後のパラメータ、つまりパラメータ値はありません。
パラメータを宣言するときは、順序がストアド プロシージャで定義されているものと同じである必要があり、各パラメータのデータ型と長さもストアド プロシージャで定義されているものと同じである必要があることに特別な注意を払う必要があります。
ストアド プロシージャに複数のパラメータがある場合、ASP コードは複雑に見えます。 with コマンドを使用してコードを簡略化できます。
'**入力パラメータと出力パラメータを使用してストアド プロシージャを呼び出します (簡略化されたコード)**。
DIM MyComm、ユーザーID、ユーザー名
ユーザーID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
with MyComm
.ActiveConnection = MyConStr 'MyConStr はデータベース接続文字列です
.CommandText = "getUserName" 'ストアド プロシージャ名を指定します
.CommandType = 4 'これがストアド プロシージャであることを示します
.Prepared = true '最初に SQL コマンドをコンパイルする必要があります
.Parameters.append .CreateParameter("@ユーザーID",3,1,4,ユーザーID)
.Parameters.append .CreateParameter("@ユーザー名",200,2,40)
。実行する
で終わる
ユーザー名 = MyComm(1)
Set MyComm = Nothing
ID 1 ~ 10 を持つ 10 人のユーザーのユーザー名を取得したい場合、Command オブジェクトを 10 回作成する必要がありますか?いいえ、同じストアド プロシージャを複数回呼び出す必要がある場合は、入力パラメータを変更するだけで、異なる入力パラメータが得られます。
'**同じストアド プロシージャを複数回呼び出す**
DIM MyComm、ユーザーID、ユーザー名
ユーザー名 = ""
Set MyComm = Server.CreateObject("ADODB.Command")
UserID = 1 ~ 10 の場合
withMyComm
.ActiveConnection = MyConStr 'MyConStr はデータベース接続文字列です
.CommandText = "getUserName" 'ストアド プロシージャ名を指定します
.CommandType = 4 'これがストアド プロシージャであることを示します
.Prepared = true '最初に SQL コマンドをコンパイルする必要があります
ユーザーID = 1の場合
.Parameters.append .CreateParameter("@ユーザーID",3,1,4,ユーザーID)
.Parameters.append .CreateParameter("@UserName",200,2,40)
。実行する
それ以外
'入力パラメータに値を再割り当てします(この時点でパラメータ値が変化しない入力パラメータと出力パラメータは再宣言する必要はありません)
.Parameters("@UserID") = ユーザーID
。実行する
終了する場合
で終わる
UserName = UserName + MyComm(1) + "," '配列ストレージを使用したいのかもしれません
次
Set MyComm = Nothing
As can be seen from the above code: when calling the same stored procedure repeatedly, you only need to reassign the input parameters whose values have changed. This method has multiple input and output parameters, and only one is called入力パラメータの値を変更するたびに、コードの量を大幅に削減できます。
5. Stored procedures that have return values, input parameters, and output parameters at the same time. As mentioned earlier, when calling a stored procedure, the order in which the parameters are declared must be the same as the order defined in the stored procedure 。还有一点要特别注意:如果存储过程同时具有返回值以及输入、输出参数,返回值要最先声明。
この場合の呼び出しメソッドを示すために、上記の例を改良してみましょう。还是取得ID为1的用户的用户名,但是有可能该用户不存在(该用户已删除,而userid是自增长的字段)。ストアド プロシージャは、ユーザーが存在するかどうかに応じて異なる値を返します。このときのストアドプロシージャとASPコードは
/*SP5*/
となります。
CREATE PROCEDURE dbo.getUserName
--「順序」の印象を深めるために、以下の 2 つのパラメータの定義順序を逆にします。
@UserName varchar(40) 出力、
@ユーザーID int
として
ノーカウントをオンに設定する
始める
@UserID が null の場合は戻ります
@ユーザー名=ユーザー名を選択してください
dbo より。[ユーザー情報]
ここで、ユーザーID=@ユーザーID
@@行数>0の場合
1を返す
それ以外
0を返す
戻る
終わり
go
'**戻り値、入力パラメータ、および出力パラメータを使用してストアド プロシージャを呼び出します**
DIM MyComm、ユーザーID、ユーザー名
ユーザーID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
withMyComm
.ActiveConnection = MyConStr 'MyConStr はデータベース接続文字列です
.CommandText = "getUserName" 'ストアド プロシージャ名を指定します
.CommandType = 4 'これがストアド プロシージャであることを示します
.Prepared = true '最初に SQL コマンドをコンパイルする必要があります
' 戻り値は最初に宣言する必要があります
.Parameters.Append .CreateParameter("RETURN",2,4)
'それに応じて、次の 2 つのパラメータの宣言順序も逆になります。
.Parameters.append .CreateParameter("@ユーザー名",200,2,40)
.Parameters.append .CreateParameter("@ユーザーID",3,1,4,ユーザーID)
。実行する
で終わる
MyComm(0) = 1 の場合
ユーザー名 = MyComm(1)
それ以外
UserName = "このユーザーは存在しません"
終了する場合
Set MyComm = Nothing
6. パラメーターとレコードセットを同時に返すストアド プロシージャ 場合によっては、パラメーターとレコードセットを同時に返すストアド プロシージャが必要になります。たとえば、ページングにストアド プロシージャを使用する場合、次のようなパラメーターを返す必要があります。同時にレコードセットと合計データとして。以下はページング用のストアド プロシージャです:
/*SP6*/
CREATE PROCEDURE dbo.getUserList
@iPageCount int OUTPUT, --総ページ数
@iPage int, --当前页号
@iPageSize int -- ページあたりのレコード数
として
ノーカウントをオンに設定する
始める
-- 一時テーブルの作成
create table #t (ID int IDENTITY, --auto-increment field
ユーザーID int、
ユーザー名 varchar(40))
-- 一時テーブルにデータを書き込みます
#t に挿入
dbo.[UserInfo] からユーザー ID、ユーザー名を選択します
ユーザー ID による順序
-- レコードの総数を取得します。
@iRecordCount int を宣言します
set @iRecordCount = @@rowcount
-- 合計ページ数を決定します
IF @iRecordCount%@iPageSize=0
SET @iPageCount=CEILING(@iRecordCount/@iPageSize)
それ以外
SET @iPageCount=CEILING(@iRecordCount/@iPageSize)+1
-- 要求されたページ番号が総ページ数より大きい場合、最後のページが表示されます。
IF @iPage > @iPageCount
SELECT @iPage = @iPageCount
-- 現在のページの始まりと終わりを決定します
DECLARE @iStart int --start レコード
DECLARE @iEnd int --end レコード
SELECT @iStart = (@iPage - 1) * @iPageSize
SELECT @iEnd = @iStart + @iPageSize + 1
--取当前页记录
select * from #t where ID>@iStart および ID<@iEnd
--一時テーブルを削除します
DROP TABLE #t
-- レコードの合計数を返します。
@iRecordCount を返す
終わり
上記のストアド プロシージャでは、
go は
現在のページ番号とページごとのレコード数を入力し、現在のページのレコード セット、合計ページ数、および合計レコード数を返します。より一般的には、レコードの総数が戻り値として返されます。以下は、ストアド プロシージャを呼び出す ASP コードです (特定のページング操作は省略されています):
'**ページング ストアド プロシージャを呼び出す**
DIM ページ現在、ページサイズ、ページ数、レコード数
DIM MyComm、MyRst
pagenow = Request("pn")
'自然数を検証するために使用されるカスタム関数
CheckNar(pagenow) = false の場合、pagenow = 1
ページサイズ = 20
で
MyComm = Server.CreateObject("ADODB.Command") を設定します
.ActiveConnection = MyConStr 'MyConStr はデータベース接続文字列です
.CommandText = "getUserList" 'ストアドプロシージャ名を指定
.CommandType = 4 'これがストアド プロシージャであることを示します
.Prepared = true '最初に SQL コマンドをコンパイルする必要があります
'返回值(记录总量)
.Parameters.Append .CreateParameter("RETURN",2,4)
'出参(总页数)
.Parameters.Append .CreateParameter("@iPageCount",3,2)
'入参(当前页号)
.Parameters.append .CreateParameter("@iPage",3,1,4,pagenow)
'入力パラメータ(ページあたりのレコード数)
.Parameters.append .CreateParameter("@iPageSize",3,1,4,pagesize)
SetMyRst = .Execute
で終わる
if MyRst.state = 0 then 'データは取得されませんでした。MyRst は閉じられています
レコード数 = -1
それ以外
MyRst.close '注: パラメーター値を取得するには、最初にレコードセット オブジェクトを閉じる必要があります
レコード数 = MyComm(0)
ページ数 = MyComm(1)
if cint(pagenow)>=cint(pagecount) then pagenow=pagecount
終了する場合
Set MyComm = Nothing
'以下のレコードを表示
レコード数 = 0 の場合
応答。「記録なし」と書き込みます。
elseif レコード数 > 0 then
MyRst.open
MyRst.EOFまで行う
...
ループ
'以下はページング情報を表示します
...
else 'レコード数=-1
Response.「パラメータエラー」と書き込みます
に関して
、説明が必要な点が 1 つだけあります。レコードセットとパラメータを同時に返す場合、パラメータを取得したい場合は、最初にレコードセットを閉じ、その後レコードセットを開く必要があります。レコードセットを使用します。
7. 複数のレコード セットを返すストアド プロシージャ この記事で最初に紹介するのは、レコード セットを返すストアド プロシージャです。 ASP では、ストアド プロシージャが複数のレコード セットを返す必要がある場合がありますが、これらのレコード セットを同時に取得するにはどうすればよいでしょうか。この問題を説明するために、userinfo テーブルに usertel と usermail という 2 つのフィールドを追加し、ログインしたユーザーのみがこれら 2 つのコンテンツを表示できるように設定します。
/*SP7*/
プロシージャの作成 dbo.getUserInfo
@userid int、
@checkloginビット
として
ノーカウントをオンに設定する
始める
@userid が null または @checklogin が null の場合、return
ユーザー名を選択してください
from dbo.[usrinfo]
ここで、ユーザーID=@ユーザーID
-- ログインしているユーザーの場合は、usertel と usermail を取得します。
@checklogin=1の場合
ユーザーテル、ユーザーメールを選択します
dbo より。[ユーザー情報]
ここで、ユーザーID=@ユーザーID
戻る
終わり
go
以下是ASP代码:
'**调用返回多个记录集的存储过程**
DIM チェック lg、ユーザー ID、ユーザー名、ユーザー電話番号、ユーザーメール
DIM MyComm、MyRst
ユーザーID = 1
'checklogin() は、訪問者がログインしているかどうかを判断するカスタム関数です
checklg = checklogin()
Set MyComm = Server.CreateObject("ADODB.Command")
with MyComm
.ActiveConnection = MyConStr 'MyConStr はデータベース接続文字列です
.CommandText = "getUserList" 'ストアドプロシージャ名を指定
.CommandType = 4 'これがストアド プロシージャであることを示します
.Prepared = true '最初に SQL コマンドをコンパイルする必要があります
.Parameters.append .CreateParameter("@userid",3,1,4,UserID)
.Parameters.append .CreateParameter("@checklogin",11,1,1,checklg)
SetMyRst = .Execute
end with
Set MyComm = Nothing
'最初のレコードセットから値を取得します
UserName = MyRst(0)
' 2 番目のレコードセットから値を取得します
if not MyRst is Nothing then
Set MyRst = MyRst.NextRecordset()
UserTel = MyRst(0)
UserMail = MyRst(1)
終了する場合
Set MyRst = Nothing
上記のコードでは、Recordset オブジェクトの NextRecordset メソッドを使用して、ストアド プロシージャから返される複数のレコード セットを取得します。
これまで、この記事では、ASP がストアド プロシージャを呼び出すさまざまな状況について比較的包括的に説明してきました。最後に、ASP プログラムで複数のストアド プロシージャを呼び出すさまざまな方法について説明します。
ASP プログラムでは、少なくとも次の 3 つのメソッドで複数のストアド プロシージャを呼び出すことができます。
1. 创建多个Command对象。
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
'ストアド プロシージャ 1 を呼び出します
...
Set MyComm = Nothing
Set MyComm = Server.CreateObject("ADODB.Command")
'ストアド プロシージャ 2 を呼び出します
...
MyComm = 何も設定しない
......
2. Command オブジェクトのみを作成し、通話を終了するときにそのパラメータ
DIM MyComm
をクリアします。
Set MyComm = Server.CreateObject("ADODB.Command")
'ストアド プロシージャ 1 を呼び出します
……
'清除参数(假设有三个参数)
MyComm.Parameters.delete 2
MyComm.Parameters.delete 1
MyComm.Parameters.delete 0
'调用存储过程二并清除参数
...
Set MyComm = Nothing
このとき、パラメータをクリアする順序とパラメータを宣言する順序が逆であることに注意してください。理由はわかりません。
3. パラメータ データ コレクションの Refresh メソッドを使用して、パラメータ オブジェクト
DIM MyComm
をリセットします。
Set MyComm = Server.CreateObject("ADODB.Command")
'调用存储过程一
……
'パラメータ データ コレクションに含まれるすべてのパラメータ オブジェクトをリセットします
MyComm.Parameters.Refresh
'ストアド プロシージャ 2 を呼び出します
……
Set MyComm = Nothing
一般に、オブジェクトを繰り返し作成することは効率が低い方法であると考えられていますが、テスト (テスト ツールは Microsoft Application Center Test) 後、予期しない結果が得られます。
方法2 >= 方法1 >> 方法3
方法 2 の実行速度は方法 1 以上 (最大約 4% 高速)、これら 2 つの方法の実行速度は方法 3 (最大 130%) よりも速いため、使用することをお勧めします。パラメータが多い場合は方法 1、そうでない場合は方法 2 を使用します。
ASP でストアド プロシージャを呼び出す際の私の表面的な経験の一部を最終的に文書化するのに 1 日かかりました。その中には、結果だけが分かっていて原因が分からないものもあり、間違っているものもあるかもしれませんが、これらは全て私個人の実践によるものです。読者の皆様、どうか批判的に受け止めてください。異なるご意見がございましたら、事前にお知らせください。