ASP 講義 7: ASP とデータベース (2)
著者:Eve Cole
更新時間:2009-05-30 19:55:02
前回の講義では、データベースへの接続を確立し、データベースからデータを取得する方法を学びました。今日の内容は、データベースに新しいデータを追加する方法、データベース内のデータを変更および削除する方法です。
1. 新しいデータをデータベースに追加する方法 1: SQL ステートメント (wuf50.asp など) を使用します。
以降の手順を簡略化するために、Access データベースとの接続部分はファイルに配置されます。このファイルは、今後必要になったときに説明されません。
<% 'AdoAccess.asp
明示的なオプション
応答.期限切れ = 0
'パート 1: 接続の確立
ディムCnn、StrCnn
Set Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "プロバイダー = Microsoft.Jet.OLEDB.4.0; データ ソース = C:InetpubhomeaspNorthwind.mdb"
Cnn.Open StrCnn
%>
プログラム wf50.asp
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<% ' wuf50.asp
'パート 2: Connection オブジェクトの Execute を使用して新しいデータを追加する
ディム StrSQL、rsTest
StrSQL = "INSERT INTO 荷主 (会社名、電話番号) VALUES('wu''feng','0571-7227298')"
Cnn.StrSQL を実行する
%>
<HTML>
<本体>
<% 'その3: 取得したレコードセットをブラウザ上に表示する
Set rsTest = Cnn.Execute("選択 * キャリアから")
rsTest.EOF を実行しないでください
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
ループ
「その4:戦場の掃除」
Cnn.close
rsTest = なしを設定します。Cnn = なしを設定します。
%>
</BODY>
</HTML>
以下の点にご注意ください。
1. SQL ステートメントを使用して Access データベースにデータを追加する場合は、Insert Into を使用する必要があります。SQL Server データベースにデータを追加するには、Insert を使用するだけです。
2. SQL ステートメントを使用してデータを追加する形式は、上記の例のとおりです。SQL ステートメントでは文字列の区切り文字として 'wu'feng' を使用する必要があることに注意してください。
3. この例を以前に学習した内容と組み合わせることで、HTML フォームからデータを追加できます。
4. この例では「配送者 ID」など、自動番号付けのデータ型を持つフィールドがあるため、増加する番号を取得するコードの記述方法を考える必要がないことに注意してください。
方法 2: Recordset オブジェクト (wuf51.asp など) の Addnew メソッドを使用します。
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf51.asp
'パート 2: Recordset オブジェクトの AddNew メソッドを使用して新しいデータを追加する
ディム StrSQL、rsTest
Set rsTest =server.CreateObject("ADODB.Recordset")
rsTest.CursorType = adOpenKeySet 'adOpenDynamic
「次の文がないとデータベースの更新が許可されません。なぜですか?」
rsTest.LockType = adLockOptimistic
rsTest.Open "Shipper",Cnn,,,adCmdTable
rsTest.AddNew
rsTest("会社名") = "五峰"
rsTest("電話") = "0571-7227298"
rsTest.Update
%>
<HTML>
<本体>
<% 'その3: 取得したレコードセットをブラウザ上に表示する
'データベース ポインタをテーブルの最初のレコードに移動します
rsTest.EOF <> 0 でない場合は、
Response.Write "テーブルには [" & rsTest.RecordCount & "] 個のデータがあります" & "<Br><Br>"
rsTest.MoveFirst
終了の場合
rsTest.EOF を実行しないでください
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
ループ
「その4:戦場の掃除」
Cnn.close
rsTest = なしを設定します。Cnn = なしを設定します。
%>
</BODY>
</HTML>
分析します:
1. rsTest.LockType = adLockOptimistic を設定する理由
Recordset オブジェクトの LockType プロパティには、次の 4 つのオプションの値があります。
adLockReadOnly - レコードセットが読み取り専用モードで開かれることを示すデフォルト値。この場合、AddNew メソッドを使用するとエラーが発生します。
adLockPessimistic - 保守的なレコード ロック (エントリごと)。編集時にデータソースのレコードを即座にロックする方法を使用してください。現時点では、他のユーザーはデータにアクセスできません。
adLockOptimistic – オープン レコード ロック (エントリごと)。レコードは、Update メソッドが呼び出された場合にのみロックされます。考えてみてください。このプロパティは、先ほど説明した Application オブジェクトの Lock プロパティと Unlock プロパティに似ていますか?
adLockBatchOptimistic - バッチ更新を開きます。 UpdateBatch メソッドに対応して、データをバッチで更新するために使用されます。
ところで、前の講義で説明した CursorType 属性についても触れておきます。これにも 4 つの値があります。
adOpenForwardOnly - 前方のみカーソル (デフォルト値) は、レコード内を前方にのみスクロールできます。これによりリソースが節約され、パフォーマンスが向上します。
adOpenStatic - 静的カーソル。データの検索やレポートの生成に使用できるレコードのコレクションの静的コピー。さらに、他のユーザーによる追加、変更、削除は表示されません。 ASP ではこれら 2 つのカーソルのみを使用することをお勧めします。
adOpenKeyset - キーセット カーソル。キーセット カーソルは動的カーソルと似ていますが、他のユーザーが追加したレコードの表示と、他のユーザーが削除したレコードへのアクセスが禁止されている点が異なります。他のユーザーが行ったデータの変更は引き続き表示されます。
adOpenDynamic - 動的カーソル。他のユーザーによる追加、変更、削除を確認できます。レコードセット内のすべての種類の移動が許可されます。
確かなのは、このような抽象的な説明はいささか怪しいし、私もまだよく理解できていないということです。
(1) データを取得するだけの場合は、デフォルト値をそのまま使用します。
(2) Update メソッドを使用してデータを更新する場合は、LockType 属性に adLockOptimistic を使用し、UpdataBatch メソッドを使用してデータを一括更新する場合は adLockBatchOptimistic を使用します。
(3) データベースへの書き込みアクションがある場合、通常は CursorType 属性に adOpenKeyset を使用するだけで十分です。
どうでしょうか?まだ理解できていなくても使えます。
2. データベースに詳しくない場合は、出力が表示される前に rsTest.MoveFirst を使用してポインターを最初のレコードに移動すると有益なことがよくあります。ただし、データベースにデータが存在しない場合、MoveFirst メソッドは使用できませんので、rsTest.EOF 属性を使用してデータベースにデータがあるかどうかを確認してから使用してください。
3. RecordCount プロパティ (レコードセット内のレコード数を取得するため) は、カーソル タイプが adOpenKeyset または adOpenStatic に設定されている場合にのみ使用できます。
2. データベース内の既存のデータを変更します。方法 1: SQL ステートメントを使用します。たとえば、wuf52.asp のプログラムは基本的に wuf50.asp と似ていますが、ここでは主要な部分のみを示します。
'パート 2: Connection オブジェクトの Execute メソッドを使用してデータを変更する
ディム StrSQL、rsTest
StrSQL = "UPDATE キャリア SET 電話 = '(503) 555-3188' WHERE 電話 LIKE '%99%'"
Cnn.StrSQL を実行する
データを変更するには、INSERT INTO...VALUES を使用する必要はありませんが、UPDATE...SET ステートメントを使用します。WHERE 句は、文字列「99」(「LIKE」および「%」を含む電話番号を変更することを意味します)。 " はファジー クエリでよく使用されます) から (503) 555-3188 まで、条件が設定されていない場合、テーブル内のすべての電話番号が変更されます。
方法 2: Recordset オブジェクトの Update メソッドを使用します。プログラム wuf53.asp (ルーチン wuf51.asp に類似)
'パート 2: Recordset オブジェクトの Update メソッドを使用してデータを変更する
ディム StrSQL、rsTest
Set rsTest =server.CreateObject("ADODB.Recordset")
rsTest.LockType = adLockOptimistic
StrSQL = "SELECT 姓、名、生年月日 FROM 従業員 WHERE 生年月日 = #55-03-04#"
rsTest.Open StrSQL、Cnn、、、adCmdText
rsTest("名前") = "中国語"
rsTest.Update
分析します:
1. SQL ステートメントでは、データベースが Access データベースの場合は日付を #55-03-04# で囲む必要があります。SQL Server データベースの場合は日付を '55-03 で囲む必要があります。 -04'。
2. rsTest.Open StrSQL、Cnn、、adCmdText では、最初のパラメータが SQL ステートメントであるため、5 番目のパラメータは adCmdText になります。実際には、5 番目のパラメータを追加すると、スクリプトの実行がより効率的になります。
3. 方法 1 を使用すると、条件を満たすすべてのレコード (複数のレコードまたは 1 つのレコード) を一度に更新できますが、方法 2 の更新では、現在のレコード (条件を満たす最初のレコード) のみを変更できます。
3. データベース内のデータを削除します。方法 1: SQL ステートメントを使用します。ルーチン wuf55.asp
'パート 2: SQL ステートメントを使用してデータを削除する
ディム StrSQL、rsTest
StrSQL = "携帯電話会社の WHERE 電話番号 = '0571-7227298' から削除"
Cnn.StrSQL を実行する
方法 2: Recordset オブジェクトの Delete メソッドを使用します。ルーチン wuf56.asp
'パート 2: Recordset オブジェクトの Delete メソッドを使用してデータを削除する
ディム StrSQL、rsTest
Set rsTest =server.CreateObject("ADODB.Recordset")
rsTest.LockType = adLockOptimistic
StrSQL = "SELECT * FROM キャリア WHERE 電話番号 = '0571-7227298'"
rsTest.Open StrSQL、Cnn、、、adCmdText
rsTest.EOF ではない間
rsTest.削除
rsTest.MoveNext
ウェン
レコード セット内に条件を満たすレコードが複数ある場合は、ループを使用する必要があります。それ以外の場合、Delete メソッドは現在のレコード、つまり条件を満たす最初のレコードのみを削除します。
4. その他の役立つ知識
1. データをバッチで更新する 上記では、Recordset オブジェクトの Update メソッドを使用してデータを更新する方法について説明しました。実際、Recordset オブジェクトは即時更新とバッチ更新という 2 種類の更新をサポートできます。
即時更新では、Update メソッドが呼び出されると、データに対するすべての変更が直ちに現在のデータ ソースに書き込まれます。
バッチ更新により、プロバイダーは複数のレコードへの変更をキャッシュし、UpdateBatch メソッドを使用して 1 回の呼び出しで変更をデータベースに転送できます。複数のレコードを更新する場合、即時更新よりもバッチ更新の方が効率的です。
デフォルトは即時更新モードです。バッチ更新モードを使用するには、wuf54.asp などのクライアント カーソルを使用します。
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf54.asp
'パート 2: バッチ更新モード
ディム StrSQL、rsTest
Set rsTest =server.CreateObject("ADODB.Recordset")
rsTest.CursorLocation = adUseClient 'クライアント カーソル タイプを使用します
rsTest.LockType = adLockBatchOptimistic
StrSQL = "SELECT * FROM キャリア WHERE 電話 LIKE '%99%'"
rsTest.Open StrSQL、Cnn、、、adCmdText
rsTest.MoveFirst
rsTest.EOF ではない間
rsTest("会社名") = "中国語"
rsTest.MoveNext
ウェン
rsTest.UpdateBatch
%>
<HTML>
<本体>
<% 'その3: 取得したレコードセットをブラウザ上に表示する
rsTest.Requery
rsTest.EOF を実行しないでください
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
ループ
「その4:戦場の掃除」
Cnn.close
rsTest = なしを設定します。Cnn = なしを設定します。
%>
</BODY>
</HTML>
知らせ:
1) rsTest.CursorLocation = adUseClient には 2 つの値があり、もう 1 つの値は adUseServer (デフォルト) です。初心者にとって、Recordset オブジェクトのカーソルの種類は、混乱を避けるため、ここでは詳しく説明しません。 . 実際の処理ではゆっくりと探索してください(もっと試してください)。
2) rsTest.Requery: Requery メソッドを使用して、データ ソースの Recordset オブジェクトの内容全体を更新します。このメソッドを呼び出すことは、Close メソッドと Open メソッドを連続して呼び出すことと同じです。
2. Recordset オブジェクトの Filter プロパティの使用方法を学習します。
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf57.asp
'パート 2: Recordset オブジェクトの Filter プロパティの使用
ディム StrSQL、rsTest
Set rsTest =server.CreateObject("ADODB.Recordset")
rsTest.CursorType = adOpenStatic
rsTest.LockType = adLockOptimistic
rsTest.Open "Shipper",Cnn,,,adCmdTable
'条件を満たすレコードをフィルターで除外し、他のレコードはフィルターで除外します
rsTest.Filter = "会社名 = 'wu''feng'"
If rsTest.EOF then 'そのようなレコードが存在しない場合は追加します
rsTest.AddNew
rsTest("会社名") = "五峰"
rsTest("電話") = "0571-7227298"
rsTest.Update
Else '条件を満たすレコードがある場合、最初に条件を満たすレコードを変更します
rsTest("電話") = "(571) 7227298"
rsTest.Update
終了の場合
%>
<HTML>
<本体>
<% 'その3: 取得したレコードセットをブラウザ上に表示する
「次の文の「はい」と「いいえ」の違いを注意深く比較してください
'rsTest.Filter="" 'フィルター属性をクリアするために使用されます
rsTest.MoveFirst
rsTest.EOF を実行しないでください
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
ループ
「その4:戦場の掃除」
Cnn.close
rsTest = なしを設定します。Cnn = なしを設定します。
%>
</BODY>
</HTML>
3.上記で紹介した 2 つのメソッドに加えて、SQL ステートメントと Command オブジェクトの Excute メソッドを使用してデータベースを保守することもできます。例 wf58.asp
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf58.asp
'パート 2: SQL ステートメントと Command オブジェクトの Excute メソッドを使用してデータベースを保守する
Dim StrSQL、rsTest、cmdChange
StrSQL = "INSERT INTO 荷主 (会社名、電話番号) VALUES('wu''feng','0571-7227298')"
'コマンドオブジェクトを作成します。
Set cmdChange =server.CreateObject("ADODB.Command")
cmdChange.ActiveConnection = Cnn を設定します。
cmdChange.CommandText = StrSQL
cmdChange.Execute
%>
<HTML>
<本体>
<% 'その3: 取得したレコードセットをブラウザ上に表示する
Set rsTest =server.CreateObject("ADODB.Recordset")
rsTest.Open "Shipper"、Cnn、、、adCmdTable
rsTest.EOF を実行しないでください
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
ループ
「その4:戦場の掃除」
Cnn.close
rsTest = なしを設定します。Cnn = なしを設定します。
%>
</BODY>
</HTML>
この講義では主に 3 つのデータ保守方法を紹介します。初心者は最初の 2 つの方法をマスターするだけで済みます。一般に、SQL ステートメントを使用して問題を解決してください。これは単純明快です。Recordset オブジェクトを使用する最大の利点は、多数のプロパティと豊富なカーソル タイプを利用できること、そしてより多くの選択肢があることです。使用にはいくつかの困難も伴います。重要なのは、さらに探索し、さらに実験することです。