ASP 講義 9: ASP とデータベース (4)
著者:Eve Cole
更新時間:2009-05-30 19:54:56
今回はパラメータとストアドプロシージャの使い方を中心に紹介します。
1. Command オブジェクトと Parameter オブジェクトを使用してパラメータを転送します。この講義では主に Microsoft SQL Server7.0 データベースを使用します。まず、バックアップ用の接続ファイル AdoSQL7.asp を作成します。未来。
<% 'AdoSQL7.asp
明示的なオプション
応答.期限切れ = 0
'パート 1: 接続の確立
ディムCnn、StrCnn
Set Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "プロバイダー=sqloledb; ユーザー ID=sa; パスワード=; 初期カタログ=pubs; データ ソース=ICBCZJP"
Cnn.Open StrCnn
%>
注: 自分で使用する場合は、データ ソースをデータベース サーバーのマシン名に設定します。
また、以前は Access データベースを使用していた場合、フィールドやデータを表示するには Microsoft Access97 を使用するのが非常に便利でしたが、SQL Server データベースを使用する場合、特にデータベース サーバーではなく別のマシンで ASP スクリプトをデバッグする場合は便利です。フィールドとデータを表示するには、データを別途インストールする必要があります。Msqry32.exe (Microsoft Query) このファイルは、通常、「Microsoft OfficeOffice」ディレクトリにあります。
wf70.asp の例:
<%@ LANGUAGE="VBSCRIPT" %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf70.asp
ディム cmdTest、prmTest、rsTest
'コマンドオブジェクトの作成
Set cmdTest = Server.CreateObject("ADODB.Command")
Recordset オブジェクトと Command オブジェクトは、ActiveConnection プロパティを通じて Connection オブジェクトに接続できます。
cmdTest.ActiveConnection = Cnn
'SQL コマンド - 2 つのパラメータが含まれています。使用しますか? 急行
cmdTest.CommandText = "ジョブを更新 Set job_desc = ? Where job_id = ?"
'コマンドの種類をSQL文に設定します
cmdTest.CommandType = adCmdText
「Prepared」属性は、SQL コマンドを最初にコンパイルするかどうかを決定します。これを True に設定すると、実行が高速化されます。
cmdTest.Prepared = True
'パラメータオブジェクトの作成
Set prmTest=cmdTest.CreateParameter("job_desc",adVarChar,adParamInput,50,"network")
'パラメータ データ コレクションにデータを追加します
cmdTest.Parameters.Append prmTest
Set prmTest = cmdTest.CreateParameter("job_id",adSmallInt,adParamInput,,"12")
cmdTest.Parameters.Append prmTest
'変更を実行します - 結果を返す必要はありません。単に cmdTest.Execute を使用します。
cmdTest.Execute
'パラメータをリセットして実行 – 別のデータを変更できます
cmdTest.Parameters("ジョブID") = "1"
cmdTest.Parameters("job_desc") = "テスト"
cmdTest.Execute
'実行するパラメータをリセットします
cmdTest("ジョブID") = "14"
cmdTest("job_desc") = "財務"
cmdTest.Execute
Set rsTest = Cnn.Execute("ジョブから job_id、job_desc を選択")
rsTest.EOF ではない間
Response.Write rsTest(0) & rsTest(1) & "<br>"
rsTest.MoveNext
ウェン
Cnn.close : prmTest = なしを設定します
cmdTest = なしを設定します: Cnn = なしを設定します。
%>
分析します:
1. Command オブジェクトの CreateParameter メソッドは、SQL コマンドまたはストアド プロシージャのパラメータ オブジェクトを作成するために使用されます。合計 5 つのパラメータがあります (5 つのパラメータはすべてオプションです)。
最初のパラメータ: パラメータ オブジェクトの名前。
2 番目のパラメーター: パラメーター オブジェクトのデータ型。型が多すぎます。ADO ヘルプを参照してください。ここでは、adVarChar (文字列値)、adSmallInt (2 バイトの符号付き整数)。
3 番目のパラメータ: パラメータのタイプ。次のいずれかになります: adParamInput (入力パラメータを示す)、adParamOutput (出力パラメータを示す)、adParamReturnValue (戻り値を示す)、adParamUnknown (パラメータのタイプを決定できないことを示す)、adParamInputOutput (入力/出力パラメータを示す)。
4 番目のパラメーター: パラメーターのデータ長は、特にデータ型が整数または VarChar の場合、使用時のエラーを避けるために、データベース内の対応するフィールドの長さと同じに指定するのが最善です。日付タイプの場合、この値を指定する必要はありません。
5番目のパラメータ:パラメータ設定の初期値。
2. cmdTest.Parameters.Append メソッドは、Parameters データ コレクションに Parameter オブジェクトを追加します。この例から、複数のパラメーターの使用方法もわかります。
3. この例からわかるように、他のデータを変更するには入力パラメータをリセットするだけで済みます。これは、プログラミングで最も一般的に使用される方法の 1 つでもあります。
4. パラメーターをリセットするには、cmdTest.Parameters を使用するか、cmdTest("job_id") として省略できます。
2. ASP でのストアド プロシージャの使用。ストアド プロシージャとは何ですか (ストアド プロシージャはデータベース サーバーにあり、1 つ以上の SQL ステートメントを含むことができる SQL ステートメントのコレクションです)。ストアド プロシージャの作成方法は説明されません。この講義の内容 この講義では、主に ASP でストアド プロシージャを呼び出す方法を説明する例を示します。
ストアド プロシージャを使用すると、ASP スクリプトで SQL コマンドを実行するよりも効率的となり、全体的なパフォーマンスが向上し、ネットワーク負荷が軽減されます (ネットワーク サーバーとデータ サーバー間の対話が軽減されます)。コードの柔軟性などを強化します。
(1) ストアド プロシージャでの入力パラメータの使用 この例で使用するストアド プロシージャは、SQL Server 7.0 に付属の「byroyalty」です。SQL 文は、追加の CREATE PROCEDURE byroyalty と入力にすぎません。パラメータは @percentage です。
CREATE PROCEDURE byroyalty @percentage int
として
titleauthorからau_idを選択
ここで、titleauthor.royaltyper = @percentage
例 wf71.asp
<% @LANGUAGE = VBScript %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf71.asp
ディム cmdTest、prmTest、rsTest
Set cmdTest = Server.CreateObject("ADODB.Command")
cmdTest.CommandText = "byroyalty" 'ストアド プロシージャ名
'コマンドの種類をストアド プロシージャとして設定します
cmdTest.CommandType = adCmdStoredProc
'パラメータオブジェクトの作成
Set prmTest = Server.CreateObject("ADODB.Parameter")
'Type 属性は wuf70.asp の 2 番目のパラメータに対応します
prmTest.Type = adInteger '4 バイトの符号付き整数' 方向属性は、wuf70.asp の 3 番目のパラメータに対応します。
prmTest.Direction = adParamInput
'Value 属性は wuf70.asp の 5 番目のパラメータに対応します
prmTest.Value = 30
cmdTest.Parameters.Append prmTest
cmdTest.ActiveConnection = Cnn を設定します
'レコード セットを返す必要があるため、Set rsTest = cmdTest.Execute を使用します。
rsTest = cmdTest.Execute を設定します。
rsTest.EOF ではない間
Response.Write rsTest(0) & "<br>"
rsTest.MoveNext
ウェン
Cnn.close
rsTest = なしを設定します。 : prmTest = なしを設定します。
cmdTest = なしを設定します: Cnn = なしを設定します。
%>
CommandText プロパティでは、SQL コマンド、ストアド プロシージャ、またはテーブル名のいずれかを指定できます。
この例では、Parameter オブジェクトの作成は wuf70.asp とは少し異なります。実際、よく見ると、この例には 2 つの未使用の属性 (prmTest.Name、prmTest.Size、および Type、Direction) があります。および値。wuf70.asp の 5 つのパラメーターに対応します。
(2) 出力パラメータを使用してデータベース テーブルからレコードを取得したり、値を計算したりする場合は、出力パラメータを返すストアド プロシージャを使用する必要があります。例として、まず SQL Server の pubs ライブラリに新しいストアド プロシージャ OUTemploy を作成します。このストアド プロシージャは 2 つの日付を入力し、次に最大値を出力する必要があります。
雇用の手順を作成する
(
@job_lvl tinyint 出力、
@hire_date1 日時、
@hire_date2 日時
)
として
従業員から @job_lvl = MAX(job_lvl) を選択
ここで、雇用日 >= @hire_date1 および雇用日 <= @hire_date2
ストアド プロシージャを作成するには、いくつかの方法があります。
1. Microsoft SQL Server の Enterprise Manager を使用します。開いたら、左側のツリー ディレクトリで開きます: コンソール ルート – Microsoft SQL Servers – SQL Server グループ – ICBCZJP (Windows NT) – データベース – pubs – ストアド プロシージャ – 新しいストアド プロシージャ最後に、ストアド プロシージャに対して文法検出を実行することもできます。
2. Microsoft SQL Server のクエリ アナライザーを使用して、まずデータベース サーバーに接続し、pubs データベースを選択します。上記のストアド プロシージャを入力し、[クエリの実行] をクリックします (または F5 キーを押します)。
3. VB6.0を使用している場合は、メニュー「表示」/「データビューウィンドウ」を開いた後、「データリンク」/「新規データリンク」を右クリックします。
4. ASP スクリプトを使用してストアド プロシージャ (wuf75.asp など) を作成します。
<% @LANGUAGE = VBScript %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf75.asp
DimStrSQL
注: & Chr(10) および Chr(13) は、主に見栄えを良くするため、まったく不要です。
StrSQL="CREATE PROCEDURE OUTemploy ( @job_lvl tinyint OUTPUT, " & Chr(10) & Chr(13) &_
"@hire_date1 日時、@hire_date2 日時) AS " & Chr(10) & Chr(13) &_
"従業員から @job_lvl = MAX(job_lvl) を選択 " &_
「ここで、hire_date >= @hire_date1 かつ、hire_date <= @hire_date2」
Cnn.StrSQL を実行する
Response.Write "ストアド プロシージャが正常に作成されました"
Cnn.close: Cnn = なしを設定します。
%>
ストアド プロシージャの作成後、メニューを使用する以外に、SQL ステートメント「Drop Procedure OUTemploy」を使用してストアド プロシージャを削除することもできます。
例 wuf72.asp – 必要な入力パラメータをストアド プロシージャに送信し、出力結果を取得します。
<% @LANGUAGE = VBScript %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf72.asp
ディム cmdTest、prmTest
Set cmdTest = Server.CreateObject("ADODB.Command")
cmdTest.ActiveConnection = Cnn
cmdTest.CommandText = "OUTemploy" 'ストアド プロシージャ名
cmdTest.CommandType = adCmdStoredProc
'パラメータオブジェクトの作成
Set prmTest = cmdTest.CreateParameter("job_lvl",adTinyInt,adParamOutput)
cmdTest.Parameters.Append prmTest
'adTinyInt - 1 バイトの符号付き整数
'adDbDate - 日付値 (yyyymmdd)
Set prmTest = cmdTest.CreateParameter("hiredate1",adDBDate,adParamInput,,"1993-05-09")
cmdTest.Parameters.Append prmTest
Set prmTest = cmdTest.CreateParameter("hiredate2",adDBDate,adParamInput,,"1994-02-01")
cmdTest.Parameters.Append prmTest
cmdTest.Execute
'次の 3 つの式は同じ意味です
Response.Write cmdtest("job_lvl") & "<br>"
Response.Write cmdTest.Parameters("job_lvl") & "<br>"
Response.Write cmdTest.Parameters("job_lvl").Value
Cnn.close
prmTest = なしを設定します
cmdTest = なしを設定します: Cnn = なしを設定します。
%>
(3) Return ステートメントを使用してストアド プロシージャからさまざまなリターン コードを返すには、リターン コード パラメータを使用します。たとえば、次のストアド プロシージャは、最初にレコード セットを取得し、マーガレットという名前の従業員がいる場合は 1 を返し、そうでない場合は 1 を返します。 0を返します。
プロシージャの作成 Returnemploy
として
従業員から emp_id、fname を選択
存在する場合 (fname='マーガレット' の従業員から fname を選択)
戻る(1)
それ以外
戻る(0)
例 wf73.asp
<% @LANGUAGE = VBScript %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf73.asp
ディム cmdTest、prmTest、rsTest
Set cmdTest = Server.CreateObject("ADODB.Command")
cmdTest.ActiveConnection = Cnn
cmdTest.CommandText = "Returnemploy" 'ストアド プロシージャ名
cmdTest.CommandType = adCmdStoredProc
Set prmTest = cmdTest.CreateParameter("ReturnValue",adInteger,adParamReturnValue)
cmdTest.Parameters.Append prmTest
rsTest = cmdTest.Execute() を設定します。
rsTest.EOF ではない間
Response.Write rsTest(0) & " ][ " & rsTest(1) & "<br>"
rsTest.MoveNext
ウェン
rsTest.Close: rsTest = なしを設定します。
'cmdtest("ReturnValue") を返す前に、まず rsTest を閉じる必要があります。そうしないと、結果が正しくなくなります。
cmdtest("ReturnValue") = 1 の場合
Response.「この社員がいます」と書く
それ以外
応答。「そのような従業員はいません」と書きます。
終了の場合
Cnn.close
prmTest = なしを設定します
cmdTest = なしを設定します: Cnn = なしを設定します。
%>
3. ビッグデータの処理方法 ここでいう「ビッグデータ」とは主に、上記の方法ではデータを正しく取得できないText(大きなテキスト)フィールドやimage(画像)フィールドを指します。まず Size = rsTest(0).ActualSize を使用してフィールド値の実際の長さを取得し、次に rsTest(0).GetChunk(Size) を使用してデータを取得する必要があります。実際の運用では、これらのフィールドは比較的大きいため、サーバーリソースを節約し、合理的に使用するために、一般的に分割された読み取りが採用されます。 wf74.asp の例:
<% @LANGUAGE = VBScript %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf74.asp
ディム StrSQL、rsTest
'pr_info はテキストフィールドです
StrSQL = "pub_info から pr_info,pub_id を選択"
rsTest = Cnn.Execute(StrSQL) を設定します。
Dim BasicSize、BeginSize、LText
rsTest.EOF を実行しないでください
Response.Write rsTest(1) & "<br>"
'毎回 1024 バイトを読み取ります
基本サイズ = 1024
開始サイズ = 0
BeginSize < rsTest(0).ActualSize の場合
LText = rsTest(0).GetChunk(BasicSize)
BeginSize = BeginSize + BasicSize
'セグメントごとにクライアントに出力
Response.LText の書き込み
ウェン
応答。「<br><br>」と書き込みます。
rsTest.MoveNext
ループ
Cnn.close
rsTest = なしを設定します。Cnn = なしを設定します。
%>
この例では、毎回最大 1024 バイトが読み取られ、データは複数回読み取られます。逆に、ビッグ データをデータベースに書き込む場合、メソッドは上記と似ていますが、GetChunk メソッドを使用する代わりに AppendChunk メソッドを使用します。
rsTest(0).AppendChunkLtext
注: 最後に、SQL Server データベースに関するちょっとしたトリックを紹介します。データベース内の中国語データが文字化けして表示されるという状況に遭遇した場合でも、パニックにならないでください。私のサイトにアクセスして sqlsrv32.dll をダウンロードし、「C:WindowsSystem」の下にある同じ名前のファイルを上書きするだけです。問題の原因は SQL Server ドライバです。この問題は通常、Windows 98 Second Edition (SQL Server ドライバのバージョン番号は 3.70.06.23)、Windows 2000、または MDAC2.5 (バージョン番号は 3.70.08.20) がインストールされている場合に発生します。 。