次の方法で共有


データ ソースにアクセスする

データ ソースにアクセスする

ActiveX Data Objects (ADO) は、Web ページにデータベース アクセス機能を追加するための、使いやすく拡張性の高いテクノロジです。ADO を使用すると、データベース、スプレッドシート、シーケンシャル データ ファイル、または電子メール ディレクトリなどの、OLE DB 準拠のデータ ソースに接続するための拡張性のあるスクリプトを簡潔に記述できます。OLE DB は、システムレベルのプログラミング インターフェイスであり、データベース管理システム機能を公開するための COM インターフェイスの標準セットを提供します。ADO のオブジェクト モデルを使用すると、VBScript または JScript などのスクリプト言語を使用するこれらの COM インターフェイスに簡単にアクセスして、Web アプリケーションにデータベース機能を追加することができます。さらに、ADO を使用して オープン データベース コネクティビティ (ODBC) 準拠のデータベースにもアクセスできます。

データベースへの接続についてある程度の理解があるスクリプト作成者にとっては、ADO のコマンド構文は簡素で使いやすいものです。また熟練した開発者には、各種データ ソースに対する拡張性とパフォーマンスに優れたアクセスを提供します。

ADO の詳細については、Microsoft Universal Data Access (UDA) の Web サイト https://www.microsoft.com/japan/developer/data/default.asp を参照してください。

接続文字列を作成する

Web データ アプリケーションを作成する最初のステップは、ADO がデータ ソースの場所を特定して識別できるようにすることです。これには、"接続文字列" を使用します。接続文字列は、データ ソース プロバイダやデータ ソースの場所などのパラメータを指定する引数を、セミコロンで区切って並べたものです。ADO は接続文字列を使用して OLE DB "プロバイダ" を識別し、そのプロバイダをデータ ソースに結び付けます。プロバイダは、データ ソースを表示し、情報を行セット形式でアプリケーションに公開するコンポーネントです。

次の表は、いくつかの代表的なデータ ソースの OLE DB 接続文字列の一覧です。

データ ソース OLE DB 接続文字列
Microsoft® Access Provider=Microsoft.Jet.OLEDB.4.0;Data Source=physical path to .mdb file
Microsoft SQL Server Provider=SQLOLEDB.1;Data Source=path to database on server
Oracle Provider=MSDAORA.1;Data Source=path to database on server
Microsoft インデックス サービス Provider=MSIDXS.1;Data Source=path to file

下位互換性のため、OLE DB Provider for ODBC は ODBC 接続文字列構文をサポートします。次の表は、代表的な ODBC 接続文字列の一覧です。

データ ソース ドライバ ODBC 接続文字列
Microsoft Access Driver={Microsoft Access Driver (*.mdb)};DBQ=physical path to .mdb file
SQL Server DRIVER={SQL Server};SERVER=path to server
Oracle DRIVER={Microsoft ODBC for Oracle};SERVER=path to server
Microsoft Excel Driver={Microsoft Excel Driver (*.xls)};DBQ=physical path to .xls file; DriverID=278
Microsoft Excel 97 Driver={Microsoft Excel Driver (*.xls)};DBQ=physical path to .xls file;DriverID=790
Paradox Driver={Microsoft Paradox Driver (*.db)};DBQ=physical path to .db file;DriverID=26
Text Driver={Microsoft Text Driver (*.txt;*.csv)};DefaultDir=physical path to .txt file
Microsoft Visual FoxPro® (データベース コンテナ付き) Driver={Microsoft Visual FoxPro Driver};SourceType=DBC;SourceDb=physical path to .dbc file
Microsoft Visual FoxPro (データベース コンテナなし) Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDb=physical path to .dbf file

   UNC パスを使用して、リモート コンピュータに配置されたデータ ソースを参照する接続文字列では、セキュリティの問題が生じる可能性があります。データ ソースが不正にアクセスされないように、データへのアクセスを要求するコンピュータの Windows アカウントを作成してから、データ ソースに対して適切な NTFS のアクセス権を適用します。詳細については、「NTFS でファイルを保護する」を参照してください。

Web データ アプリケーションの設計時に考慮すべき重要な問題

パフォーマンスと信頼性を確保するため、同時接続数が 10 ユーザーを超えるような負荷の高いアクセスを必要とするデータ駆動型 Web アプリケーションを導入する場合は、クライアント/サーバー データベース エンジンの使用を強くお勧めします。ADO はどの OLE DB 準拠のデータ ソースにも対応しますが、Microsoft SQL Server または Oracle などのクライアント/サーバー データベースを使用して徹底したテストが行われており、これらのデータベースを処理するように設計されています。

ASP では、有効なデータ ソースとして共有ファイル データベース (Microsoft Access または Microsoft FoxPro) をサポートしています。ASP のマニュアルでは共有ファイル データベースを例として使用している場合がありますが、この種のデータベース エンジンは開発目的だけに使用するか、または導入範囲が限定されている場合にのみ使用することをお勧めします。クライアント / サーバー データベースとは異なり、共有ファイル データベースは非常に負荷の高い実働用の Web アプリケーションには適していません。

リモート SQL Server データベースに接続する ASP データベース アプリケーションを開発する場合は、次の点にも注意する必要があります。

  • SQL Server の接続方式の選択 リモート SQL Server データベースにアクセスする場合、TCP/IP ソケットまたは名前付きパイプのいずれかを選択できます。名前付きパイプを使用する場合、データベース クライアントは、接続を確立する前に Windows によって認証されている必要があります。このため、名前付きパイプを実行しているリモート コンピュータ上に Windows ユーザー アカウントを持たないユーザーは、SQL Server にアクセスするための適切な資格情報を持っていても、リモート コンピュータによってアクセスを拒否されることがあります。一方、TCP/IP ソケットを使用した接続では、名前付きパイプの場合と異なり、コンピュータを介入することなく、データベース サーバーに直接接続します。TCP/IP ソケットによる接続ではデータベース サーバーに直接接続するため、Windows の認証ではなく、SQL Server の認証によって、ユーザーのアクセスが許可されます。
  • ODBC 80004005 エラー SQL Server にアクセスするための接続方法が正しく設定されていない場合、データベース アプリケーションを使用するユーザーに ODBC 80004005 エラーが返されることがあります。この状態を修正するには、SQL Server が IIS と同じコンピュータで実行されている場合は、ネットワークの名前付きパイプ接続ではなく、ローカルの名前付きパイプ接続を使用してみます。パイプが、匿名ユーザー アカウントで偽装される可能性のあるネットワーク接続ではなく、ローカル接続であるため、Windows 2000 のセキュリティ規則は適用されません。また、SQL Server 接続文字列 (Global.asa ファイルの中、またはページレベルのスクリプトのいずれかに含まれる) では、パラメータ SERVER=server name を SERVER=(local) に変更します。キー ワード (local) は、SQL Server ODBC ドライバが認識する特別なパラメータです。この方法で解決できない場合は、IIS と SQL Server との間で、TCP/IP ソケットなどの非認証プロトコルを使用します。このプロトコルは、SQL Server がローカルに実行されているとき、またはリモート コンピュータ上で実行されているときに機能します。
  • SQL Server セキュリティ SQL Server の "統合" または "混合" セキュリティ機能を使用し、かつ SQL Server データベースがリモート サーバー上にある場合は、統合 Windows 認証を使用できません。具体的には、統合 Windows 認証の資格情報をリモート コンピュータに転送できません。つまり、ユーザー名とパスワードをユーザーが提供する基本認証を使用する必要があります。

これらの問題の詳細については、Microsoft 製品サポート サービスの Web サイト https://www.microsoft.com/japan/support を参照してください。

データ ソースに接続する

ADO は、アプリケーションと OLE DB 準拠のデータ ソースまたは ODBC 準拠のデータベースとの間に接続を確立して管理するための Connection オブジェクトを提供しています。Connection オブジェクトには、データベース接続を開く、接続を閉じる、および情報を更新するクエリを発行するためのプロパティとメソッドが用意されています。

データベース接続を確立するには、まず、Connection オブジェクトのインスタンスを作成します。たとえば、次のスクリプトは Connection オブジェクトのインスタンスを生成し、接続を開きます。

  <%
  'Create a connection object.
  Set cnn = Server.CreateObject("ADODB.Connection")
  'Open a connection using the OLE DB connection string.
  cnn.Open  "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MarketData\ProjectedSales.mdb"
%>

   接続文字列では、等号 (=) の前後にスペースを挿入しないでください。

この場合、Connection オブジェクトの Open メソッドが接続文字列を参照します。

Connection オブジェクトを使用して SQL クエリを実行する

Connection オブジェクトの Execute メソッドを使用して、Structured Query Language (SQL) クエリなどのコマンドをデータ ソースに対して発行することができます。データベースと通信するための業界標準の言語である SQL は、情報を取得したり、情報を更新したりするためのコマンドを定義しています。Execute メソッドには、コマンド (またはクエリ)、関連するデータ レコードの数、および使用されるコマンドの種類を指定するパラメータを指定できます。

次のスクリプトは、Execute メソッドを使用して、特定のデータベース テーブルにデータを挿入する SQL の INSERT コマンド形式のクエリを発行します。この例では、"Customers" という名前のデータベース テーブルに "Jose Lugo" という名前を挿入します。

  <%
  'Define the OLE DB connection string.
  strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb"

  'Instantiate the Connection object and open a database connection.
  Set cnn = Server.CreateObject("ADODB.Connection")
  cnn.Open strConnectionString

  'Define SQL SELECT statement.
  strSQL = "INSERT INTO Customers (FirstName, LastName) VALUES ('Jose','Lugo')"

  'Use the Execute method to issue a SQL query to database.
  cnn.Execute strSQL,,adCmdText + adExecuteNoRecords
%>

クエリの実行に使用されるステートメントで、adCmdText と adExecuteNoRecords の 2 つのパラメータが指定されていることに注意してください。省略可能な adCmdText パラメータは、コマンドの種類を指定することで、クエリ ステートメント (この場合は SQL クエリ) を、テキスト形式のコマンド定義として評価するようにプロバイダに指示します。adExecuteNoRecords パラメータは、アプリケーションに結果が返されない場合に、データ レコードのセットを作成しないように ADO に指示します。このパラメータは SQL クエリなどのテキスト定義として規定されるコマンド タイプ、またはストアド データベース プロシージャにのみ有効です。adCmdText パラメータと adExecuteNoRecords パラメータは省略可能ですが、Execute メソッドを使用するときは、データ アプリケーションのパフォーマンスの向上のためにこれらのパラメータを使用することをお勧めします。

重要   adCmdText などの ADO のパラメータは、スクリプトで使用する前に定義する必要があります。パラメータの定義には、"コンポーネント タイプ ライブラリ" を使うと便利です。コンポーネント タイプ ライブラリは、すべての ADO パラメータの定義を含んだファイルです。コンポーネント タイプ ライブラリを実装するには、最初にこのライブラリを宣言する必要があります。次の <METADATA> タグを .asp ファイルまたは Global.asa ファイルに追加して ADO のタイプ ライブラリを宣言してください。

  <!--METADATA NAME="Microsoft ActiveX Data Objects 2.5 Library" TYPE="TypeLib" UUID="{00000205-0000-0010-8000-00AA006D2EA4}"-->

コンポーネント タイプ ライブラリの実装については、「変数と定数を使用する」の「定数を使用する」を参照してください。

SQL の INSERT コマンドのほかにも、SQL の UPDATE コマンドおよび DELETE コマンドを使用してデータベースの情報を変更および削除することができます。

SQL の UPDATE コマンドを使って、データベース テーブル内の項目の値を変更することができます。次のスクリプトは、UPDATE コマンドを使用して、Customers テーブル内で LastName フィールドが Smith であるすべてのレコードの FirstName フィールドを Jeff に変更します。

  <%
  Set cnn = Server.CreateObject("ADODB.Connection")
  cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb"
  cnn.Execute "UPDATE Customers SET FirstName = 'Jeff' WHERE LastName = 'Smith' ",,adCmdText + adExecuteNoRecords
%>

データベース テーブルから特定のレコードを削除するには、SQL の DELETE コマンドを使用します。次のスクリプトは、ラスト ネームが Smith であるすべての行を、Customers テーブルから削除します。

  <%
  Set cnn = Server.CreateObject("ADODB.Connection")
  cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb"
  cnn.Execute "DELETE FROM Customers WHERE LastName = 'Smith'",,adCmdText + adExecuteNoRecords
%>

   SQL の DELETE コマンドを使用する場合は注意が必要です。WHERE 句を指定せずに DELETE コマンドを使用すると、テーブルのすべての行が削除されます。このため、削除する行を指定する SQL の WHERE 句を必ず指定してください。

Recordset オブジェクトを使用して結果を操作する

ADO では、データの取得、結果の検査、およびデータベースの変更に使用する Recordset オブジェクトが用意されています。名前が示すとおり、Recordset オブジェクトには、データベースの行、つまり "レコード" のセットをクエリの制約条件に基づいて取得および表示する機能があります。Recordset オブジェクトはクエリが返した各レコードの位置を管理するので、結果を 1 つずつ処理することができます。

レコード セットを取得する

Web データ アプリケーションを正常に動作させるには、リンクを確立する Connection オブジェクトと、返されたデータを操作する Recordset オブジェクトの両方を使用します。2 つのオブジェクトが提供する関数を組み合わせることで、ほとんどのデータ処理作業を実行できるデータベース アプリケーションを開発できます。たとえば、次のサーバー側スクリプトでは、Recordset オブジェクトを使用して SQL の SELECT コマンドを実行します。SELECT コマンドは、クエリの制約条件に基づいて特定の情報を取得します。クエリには、条件を特定してクエリの範囲を限定するための SQL の WHERE 句も含まれています。この例では、WHERE 句によって、クエリの対象を、"Customers" データベース テーブル中のラスト ネームが "Smith" であるすべてのレコードに限定しています。

  <%
  'Establish a connection with data source.
  strConnectionString  = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb"
  Set cnn = Server.CreateObject("ADODB.Connection")
  cnn.Open strConnectionString

  'Instantiate a Recordset object.
  Set rstCustomers = Server.CreateObject("ADODB.Recordset")

  'Open a recordset using the Open method
  'and use the connection established by the Connection object.
  strSQL = "SELECT FirstName, LastName FROM Customers WHERE LastName = 'Smith' "
  rstCustomers.Open  strSQL, cnn	

  'Cycle through record set and display the results
  'and increment record position with MoveNext method.
   Set objFirstName = rstCustomers("FirstName")
   Set objLastName = rstCustomers("LastName")
   Do Until rstCustomers.EOF
     Response.Write objFirstName & " " & objLastName & "<BR>"
     rstCustomers.MoveNext
   Loop

%>

この例では、Connection オブジェクトがデータベース接続を確立し、Recordset オブジェクトがこの接続を使用してデータベースから結果を取得しています。この方法は、データベースとのリンクの確立方法を正確に構成する必要がある場合に有効です。たとえば、接続の試みを中止するまでの待機時間を指定する場合は、そのためのプロパティを Connection オブジェクトを使用して設定する必要があります。ただし、ADO の既定の接続プロパティを使用して接続を確立するだけであれば、Recordset オブジェクトの Open メソッドを使用することもできます。

  <%
  strConnectionString  = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb"
  strSQL = "SELECT FirstName, LastName FROM Customers WHERE LastName = 'Smith' "
  Set rstCustomers = Server.CreateObject("ADODB.Recordset")

  'Open a connection using the Open method
  'and use the connection established by the Connection object.
  rstCustomers.Open  strSQL, strConnectionString	

  'Cycle through the record set, display the results,
  'and increment record position with MoveNext method.
   Set objFirstName = rstCustomers("FirstName")
   Set objLastName = rstCustomers("LastName")
   Do Until rstCustomers.EOF
      Response.Write objFirstName & " " & objLastName & "<BR>"
      rstCustomers.MoveNext
   Loop
%>

Recordset オブジェクトの Open メソッドを使用して接続を確立する場合も、リンクを確保するために Connection オブジェクトを暗黙的に使用しています。詳細については、Microsoft Universal Data Access の Web サイト https://www.microsoft.com/japan/developer/data/default.asp を参照してください。

   ASP データベース アプリケーションのパフォーマンスを大きく向上させるためには、Application 状態でレコードセットをキャッシュすることを検討してください。詳細については、「データをキャッシュする」を参照してください。

レコードセットで返されるレコードの数をカウントすると便利です。Recordset オブジェクトの Open メソッドを使用して、省略可能な "カーソル" パラメータを指定できます。このパラメータは、基になっているプロバイダがレコードセットを取得し、ナビゲートする方法を決定します。クエリの実行に使用するステートメントに adOpenKeyset カーソル パラメータを追加すると、クライアント アプリケーションがレコードセット内を完全にナビゲートすることができます。この結果、アプリケーションは RecordCount プロパティを使用して、レコードセット内の正確なレコード数をカウントできます。次の例を参照してください。

  <%
	Set rs = Server.CreateObject("ADODB.Recordset")
	rs.Open "SELECT * FROM NewOrders", "Provider=Microsoft.Jet.OLEDB.3.51;Data Source='C:\CustomerOrders\Orders.mdb'", adOpenKeyset, adLockOptimistic, adCmdText
	
	'Use the RecordCount property of the Recordset object to get count.
	If rs.RecordCount >= 5 then
	  Response.Write "We've received the following " & rs.RecordCount & " new orders<BR>"	
	
	  Do Until rs.EOF
	  	Response.Write rs("CustomerFirstName") & " " & rs("CustomerLastName") & "<BR>"
		Response.Write rs("AccountNumber") & "<BR>"
		Response.Write rs("Quantity") & "<BR>"		
		Response.Write rs("DeliveryDate") & "<BR><BR>"
	      	rs.MoveNext
	  Loop

  	Else	    	
	  Response.Write "There are less than " & rs.RecordCount & " new orders."		
	End If
	
   rs.Close
%>

Command オブジェクトを使用してクエリを改良する

ADO の Command オブジェクトでは、Connection オブジェクトと Recordset オブジェクトを使用してクエリを実行する場合と同じようにクエリを実行できます。ただし、Command オブジェクトは、データベース ソース上でクエリを準備 (コンパイル) して、値の組み合わせをさまざまに変えてクエリを繰り返し再発行できる点が異なります。この方法でクエリをコンパイルすると、既存のクエリを修正して再発行するために必要な時間を大幅に短縮できます。また、SQL クエリの一部を未定義のまま残しておいて、実行の直前にクエリの一部を変更することができます。

Command オブジェクトの Parameters コレクションを使用すると、再発行のたびにクエリを再構築せずに済みます。たとえば、Web ベースの在庫システムで定期的に供給情報およびコスト情報を更新する必要がある場合は、次のようにクエリをあらかじめ定義しておくことができます。

  <%
    'Open a connection using Connection object. Notice that the Command object
    'does not have an Open method for establishing a connection.
    strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Inventory.mdb"
    Set cnn = Server.CreateObject("ADODB.Connection")
    cnn.Open strConnectionString

    'Instantiate Command object; use ActiveConnection property to attach
    'connection to Command object.
    Set cmn= Server.CreateObject("ADODB.Command")
    Set cmn.ActiveConnection = cnn

    'Define SQL query.
    cmn.CommandText = "INSERT INTO Inventory (Material, Quantity) VALUES (?, ?)"

    'Save a prepared (or pre-compiled) version of the query specified in CommandText
    'property before a Command object's first execution.
    cmn.Prepared = True

    'Define query parameter configuration information.
    cmn.Parameters.Append cmn.CreateParameter("material_type",adVarChar, ,255 )
    cmn.Parameters.Append cmn.CreateParameter("quantity",adVarChar, ,255 )

    'Define and execute first insert.
    cmn("material_type") = "light bulbs"
    cmn("quantity") = "40"
    cmn.Execute ,,adCmdText + adExecuteNoRecords

    'Define and execute second insert.
    cmn("material_type") = "fuses"
    cmn("quantity") = "600"
    cmn.Execute ,,adCmdText + adExecuteNoRecords
    .
    .
    .
  %>

重要   adCmdText などの ADO パラメータは、単なる変数です。つまり、データ アクセス スクリプトで ADO パラメータを使用する前に、その値を定義しておく必要があります。ADO では多数のパラメータを使用するため、ADO のすべてのパラメータおよび定数の定義を収めたファイルである "コンポーネント タイプ ライブラリ" を使用して、パラメータを定義すると簡単です。ADO タイプ ライブラリを実装する方法については、「変数と定数を使用する」の「定数を使用する」を参照してください。

前の例では、スクリプトで値を変えて繰り返し SQL クエリを構築し、再発行する際に、クエリを再定義してデータベース ソースに再送信する必要がないことに注意してください。また、Command オブジェクトを使用してクエリをコンパイルすると、文字列と変数を連結して SQL クエリを形成する場合に発生する問題を回避できるという利点もあります。特に、Command オブジェクトの Parameter コレクションを使用すると、ある種の文字列、日付、時刻を表す変数を定義する場合の問題を回避できます。たとえば、一重引用符 (') を含む SQL クエリの値によって、クエリが失敗することがあります。

    strSQL = "INSERT INTO Customers (FirstName, LastName) VALUES ('Robert','O'Hara')" 

この例のラスト ネーム「O'Hara」に含まれる一重引用符 (') は、SQL の VALUES キーワードでデータを表すために使われる一重引用符と競合します。クエリの値を Command オブジェクトのパラメータとしてバインドすれば、この種の問題を避けることができます。

HTML フォームとデータベース アクセスを結合する

HTML フォームを含む Web ページを使用することで、リモートからデータベースに問い合わせて特定の情報を取得できます。ADO を使用すれば、ユーザー フォーム情報の収集、カスタム データベース クエリの作成、およびユーザーへの情報の返送を行うスクリプトを簡単に記述できます。ASP の Request オブジェクトを使用すると、HTML フォームに入力された情報を取得して、SQL ステートメントに組み込むことができます。たとえば、次のスクリプトは、HTML フォームから取得した情報をテーブルに挿入します。このスクリプトでは、Request オブジェクトの Form コレクションを使用してユーザー情報を収集します。

  <%
  'Open a connection using Connection object. The Command object
  'does not have an Open method for establishing a connection.
   strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\CompanyCatalog\Seeds.mdb"
 	Set cnn = Server.CreateObject("ADODB.Connection")
 	cnn.Open strConnectionString

  'Instantiate Command object
  'and  use ActiveConnection property to attach
  'connection to Command object.
  Set cmn= Server.CreateObject("ADODB.Command")
  Set cmn.ActiveConnection = cnn

  'Define SQL query.
  cmn.CommandText = "INSERT INTO MySeedsTable (Type) VALUES (?)"

  'Define query parameter configuration information.
  cmn.Parameters.Append cmn.CreateParameter("type",adVarChar, ,255)

  'Assign input value and execute update.
  cmn("type") = Request.Form("SeedType")
  cmn.Execute ,,adCmdText + adExecuteNoRecords
%>

フォームの詳細、およびASP の Request オブジェクトの使い方については、「ユーザーからの入力を処理する」を参照してください。

データベース接続を管理する

何千もの顧客を処理するオンライン発注アプリケーションなど、高度な Web データベース アプリケーションを設計する場合の主な課題の 1 つは、データベース接続の適切な管理です。データベース接続を開いたままにしておくと、情報のやり取りが行われていなくても、データベース サーバーのリソースが圧迫され、接続に問題が生じる可能性があります。Web データベース アプリケーションを適切に設計するには、データベース接続を再利用して、ネットワーク トラフィックに起因する遅延を解消します。

接続のタイムアウトを設定する

データベース サーバーの利用が急激に増加すると、サーバーの処理が追い付かなくなり、データベース接続が確立されるまでの時間が大幅に長引くことがあります。データベース アプリケーションのパフォーマンスは、この過度の接続遅延によって低下する可能性があります。

Connection オブジェクトの ConnectionTimeout を使用すると、アプリケーションが接続の試行を放棄してエラー メッセージを表示するまで待機する時間を設定することができます。たとえば、次のスクリプトは、接続の試行を取り消すまで 20 秒待機するように ConnectionTimeout プロパティを設定します。

  Set cnn = Server.CreateObject("ADODB.Connection")
cnn.ConnectionTimeout = 20
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Inventory.mdb"

ConnectionTimeout プロパティの既定値は 30 秒です。

   ConnectionTimeout プロパティをデータベース アプリケーションに組み込む前に、接続プロバイダおよびデータ ソースがこのプロパティをサポートしていることを確認してください。

接続をプールする

接続をプールすることで、Web アプリケーションは "プール" つまり再確立の不要な空いている接続の集まりの中から接続を使用できます。接続が作成され、プールに配置されると、その接続は接続処理を実行しなくてもアプリケーションで再利用できます。このためパフォーマンスが大きく向上します。特にアプリケーションがネットワークを介して接続する場合や、接続と切断が繰り返される場合に有効です。また、プールされた接続は複数のアプリケーションで繰り返し使用できます。

OLE DB のセッション プール

OLE DB には、大規模な Web データベース アプリケーションの接続パフォーマンスを向上させるために最適化された "セッション プール" と呼ばれるプール機能があります。セッション プールは、接続セキュリティおよびその他のプロパティを維持します。プールされた接続は、接続の両側からの要求が一致した場合だけ再利用されます。Microsoft SQL サーバーおよび Oracle の OLE DB プロバイダは、セッション プールを既定の設定でサポートします。つまり、セッション プールを使用するために、アプリケーション、サーバー、またはデータベースを構成する必要はありません。ただし、プロバイダが既定でセッション プールをサポートしない場合は、レジストリ設定を作成してセッション プールを有効にする必要があります。セッション プールの詳細については、OLE DB 2.0 Software Development Kit (SDK) のマニュアルを参照してください。

ODBC 接続プール

接続プールで ODBC ドライバを使用する場合は、該当するデータベース ドライバを構成し、Windows レジストリでドライバの CPTimeout プロパティを設定する必要があります。接続が接続プール内にとどまる時間は、CPTimeout プロパティによって決まります。CPTimeout に設定した時間を経過してもプールに接続が残っている場合、その接続は閉じられ、プールから削除されます。CPTimeout の既定値は 60 秒です。

次に示す設定でレジストリ キーを作成すると、特定の ODBC データベース ドライバで接続プールを有効にするように CPTimeout プロパティを設定できます。

  
\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\driver-name\CPTimeout = timeout
 (REG_SZ, units are in seconds)

たとえば、次のキーは、SQL Server ドライバの接続プールのタイムアウトを 180 秒 (3 分) に設定します。

  \HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\SQL Server\CPTimeout = 180

   特に指定しない限り、Web サーバーは CPTimeout を 60 秒に設定して SQL Server の接続プールをアクティブにします。

複数のページにまたがって接続を使用する

ASP の Application オブジェクトに接続を格納すると、複数のページにまたがって接続を再利用できます。ただし、この方法では、接続が不必要に開いたままになる可能性があり、接続プールを使用する利点が失われます。同じ ASP データベース アプリケーションに多数のユーザーが接続する場合は、ASP の Application オブジェクトにデータベース接続文字列を格納し、複数の Web ページでその接続文字列を再利用する方がアプローチとして優れています。たとえば、次のスクリプトのように、Global.asa ファイルの Application_OnStart イベント プロシージャで接続文字列を指定できます。

  
Application("ConnectionString") = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Inventory.mdb"

次に、データベースにアクセスする各 ASP ファイルで次のように記述し、そのページで使用する接続オブジェクトのインスタンスを作成します。

  <OBJECT RUNAT=SERVER ID=cnn PROGID="ADODB.Connection"></OBJECT>

さらに、次のスクリプトを使用して接続を開きます。

  cnn.Open Application("ConnectionString")

ページの最後では、次のスクリプトで接続を閉じます。

  cnn.Close

1 人のユーザーが複数の Web ページにまたがって 1 つの接続を再利用する場合は、Application オブジェクトの代わりに Session オブジェクトを使用して接続文字列を格納する方法が適しています。

接続を閉じる

接続プールを十分に活用するには、不要になった時点でデータベース接続を明示的に閉じるようにします。特に指定しない限り、スクリプトの実行が終了すると接続も終了しますが、接続が不要になった時点で、スクリプトの中で明示的に接続を閉じると、データベース サーバーに対する要求が減り、閉じた接続をほかのユーザーが利用できるようになります。

Connection オブジェクトの Close メソッドを使用すると、Connection オブジェクトとデータベースとの間の接続を明示的に終了できます。次のスクリプトは接続を開いて閉じます。

  <%
  strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Inventory.mdb"
  Set cnn = Server.CreateObject("ADODB.Connection")
  cnn.Open strConnectionString
  cnn.Close
%>