ActiveX Data Objects(ADO)는 사용하기 쉬우면서도 확장 가능한 기술로서 웹 페이지에 데이터베이스 액세스를 제공합니다. ADO를 사용하여 간단하고 확장 가능한 스크립트를 작성하면 데이터베이스, 스프레드시트, 순차적 데이터 파일, 전자 메일 디렉터리 등 OLE DB 방식의 데이터 원본에 연결할 수 있습니다. OLE DB는 일련의 표준 COM 인터페이스를 제공하는 시스템 수준의 프로그래밍 인터페이스로서, 데이터베이스 관리 시스템 기능을 나타냅니다. ADO 개체 모델을 사용하면 VBScript 또는 JScript 등의 스크립트 작성 언어를 통해 이러한 인터페이스에 쉽게 액세스하여 웹 응용 프로그램에 데이터베이스 기능을 추가할 수 있습니다. 또한, ADO를 사용하여 개방형 데이터베이스 연결(ODBC) 방식의 데이터베이스에 액세스할 수도 있습니다.
데이터베이스 연결에 대해 어느 정도 알고 있는 스크립터의 경우에는 ADO 명령문이 복잡하지 않고 사용하기 쉽다는 것을 알 수 있을 것입니다. 노련한 개발자는 다양한 데이터 원본에 대한 ADO의 확장 가능한 고성능 액세스를 효율적으로 사용할 수 있습니다.
ADO에 대한 자세한 내용은 Microsoft UDA(Universal Data Access) 웹 사이트를 참조하십시오.
웹 데이터 응용 프로그램을 작성하려면 제일 먼저 ADO에 대해 데이터 원본을 찾아서 식별할 수 있는 방법을 제공해야 합니다. 이는 연결 문자열을 통해 수행할 수 있는데, 이 연결 문자열은 데이터 원본 공급자와 데이터 원본 위치 등의 매개 변수를 정의하는 일련의 인수로서 세미콜론으로 구분되어 있습니다. ADO는 연결 문자열을 사용하여 OLE DB 공급자를 식별하고 이 공급자를 데이터 원본으로 안내합니다. 공급자는 데이터 원본을 나타내고 응용 프로그램에 대해 정보를 행 집합 형태로 표시하는 구성 요소입니다.
다음 표에는 일반적인 여러 데이터 원본에 대한 OLE DB 연결 문자열이 나와 있습니다.
| 데이터 원본 | OLE DB 연결 문자열 |
| Microsoft® Access | Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.mdb 파일의 실제 경로 |
| Microsoft SQL Server | Provider=SQLOLEDB.1;Data Source=데이터베이스 서버 경로 |
| Oracle | Provider=MSDAORA.1;Data Source=데이터베이스 서버 경로 |
| Microsoft Indexing Service | Provider=MSIDXS.1;Data Source=파일 경로 |
이전 버전과의 호환성을 제공하기 위해 ODBC용 OLE DB 공급자는 ODBC 연결 문자열 구문을 지원합니다. 다음 표에서는 일반적으로 사용하는 ODBC 연결 문자열을 소개합니다.
| 데이터 원본 드라이버 | ODBC 연결 문자열 |
| Microsoft Access | Driver={Microsoft Access Driver (*.mdb)};DBQ=.mdb 파일의 실제 경로 |
| SQL Server | DRIVER={SQL Server};SERVER=서버 경로 |
| Oracle | DRIVER={Microsoft ODBC for Oracle};SERVER=서버 경로 |
| Microsoft Excel | Driver={Microsoft Excel Driver (*.xls)};DBQ=.xls 파일의 실제 경로; DriverID=278 |
| Microsoft Excel 97 | Driver={Microsoft Excel Driver (*.xls)};DBQ=.xls 파일의 실제 경로;DriverID=790 |
| Paradox | Driver={Microsoft Paradox Driver (*.db)};DBQ=.db 파일의 실제 경로;DriverID=26 |
| Text | Driver={Microsoft Text Driver (*.txt;*.csv)};DefaultDir=.txt 파일의 실제 경로 |
| Microsoft Visual FoxPro®(데이터베이스 컨테이너 포함) | Driver={Microsoft Visual FoxPro Driver};SourceType=DBC;SourceDb=.dbc 파일의 실제 경로 |
| Microsoft Visual FoxPro(데이터베이스 컨테이너 제외) | Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDb=.dbf 파일의 실제 경로 |
참고 UNC 경로를 통해 원격 컴퓨터에 있는 데이터 원본을 참고하는 연결 문자열을 사용하면 보안 문제가 발생할 수 있습니다. 데이터 원본에 권한 없는 액세스를 방지하려면 해당 데이터에 액세스가 필요한 컴퓨터에 대해 Windows 계정을 작성한 다음 적절한 NTFS 권한을 데이터 원본에 적용합니다. 자세한 내용은 NTFS를 사용한 파일 보호를 참조하십시오.
동시 사용자가 10명이 넘는 데이터 기반의 웹 응용 프로그램을 개발할 때는 성능 및 안정성을 위해, 클라이언트 서버 데이터베이스 엔진을 사용하는 것이 좋습니다. ADO는 모든 OLE DB 데이터 원본과 작동이 가능하지만, Microsoft SQL Server나 Oracle 등의 클라이언트 서버 데이터베이스와 작동할 수 있도록 충분히 테스트되고 디자인되었습니다.
ASP는 유효한 데이터 원본으로 공유 파일 데이터베이스(Microsoft Access 또는 Microsoft FoxPro)를 지원합니다. ASP 설명서의 일부 예제에서 공유 파일을 사용하고는 있지만, 이러한 종류의 데이터베이스 엔진은 개발 목적이나 제한된 배포 시나리오로만 사용하는 것이 좋습니다. 공유 파일 데이터베이스는 사용량이 많거나 생산 품질의 웹 응용 프로그램에서는 클라이언트 서버 데이터베이스에 비해 적합하지 않습니다.
원격 SQL Server 데이터베이스에 연결할 목적으로 ASP 데이터베이스 응용 프로그램을 개발하는 경우에는 다음 사항에 주의해야 합니다.
참고 원격 데이터베이스에 연결할 때 성능을 향상시키려면 TCP/IP 소켓을 사용하십시오.
이 문제에 대한 자세한 내용을 보려면 Microsoft 기술 지원 서비스 웹 사이트를 방문하십시오.
ADO는 응용 프로그램과 OLE DB 형식의 데이터 원본 또는 ODBC 방식의 데이터베이스 간의 연결을 구축 및 관리할 수 있는 Connection 개체를 제공합니다. Connection 개체는 데이터베이스를 연결하거나 끊고, 정보를 업데이트하기 위한 쿼리 실행에 사용할 수 있는 다양한 속성 및 메서드 기능을 갖고 있습니다.
데이터베이스 연결을 구성하려면 먼저 Connection 개체의 인스턴스를 작성해야 합니다. 예를 들어, 다음 스크립트는 Connection 개체의 인스턴스를 만들고 연결 열기를 계속 진행합니다.
<%
'Connection 개체를 작성합니다.
Set cnn = Server.CreateObject("ADODB.Connection")
'OLE DB 연결 문자열을 사용하여 연결 열기를 합니다 .
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MarketData\ProjectedSales.mdb"
%>
참고 연결 문자열에서는 등호(=) 앞 뒤에 빈 칸을 두지 않습니다.
이 경우, Connection 개체의 Open 메서드는 연결 문자열을 참고합니다.
Connection 개체의 Execute 메서드를 통해, SQL(구조적 쿼리 언어) 쿼리 등의 명령을 데이터 원본으로 보낼 수 있습니다. 데이터베이스와의 통신을 위한 업계 표준 언어인 SQL은 정보의 검색 및 업데이트를 위한 명령을 정의합니다. Execute 메서드는 명령(또는 쿼리)을 지정하는 매개 변수, 관련 데이터 레코드 수, 사용 중인 명령의 종류를 받아 들입니다.
다음 스크립트는 Execute 메서드를 사용하여, 특정 데이터베이스 테이블에 데이터를 삽입하는 SQL INSERT 명령 형식의 쿼리를 실행합니다. 이러한 경우 스크립트 블록은 Jose Lugo라는 이름을 Customers 데이터베이스 테이블에 삽입합니다.
<%
'OLE DB 연결 문자열을 정의합니다.
strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb"
'Connection 개체의 인스턴스를 만들고 데이터베이스에 연결합니다.
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConnectionString
'SQL INSERT 문을 정의합니다.
strSQL = "INSERT INTO Customers (FirstName, LastName) VALUES ('Jose','Lugo')"
'Execute 메서드를 사용하여 데이터베이스에 SQL 쿼리를 실행합니다.
cnn.Execute strSQL,,adCmdText + adExecuteNoRecords
%>
쿼리를 실행하는 문에서는 adCmdText와 adExecuteNoRecords 두 가지 매개 변수가 지정됩니다. 선택 사항인 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 명령을 사용하십시오. 다음 스크립트는 Customers 테이블에서 LastName 필드 값이 Smith인 행을 모두 삭제합니다.
<%
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 명령을 사용할 때는 주의해야 합니다. DELETE 명령을 사용할 때 WHERE 절을 사용하지 않으면 테이블의 모든 행이 삭제됩니다. 삭제될 행을 지정하는 SQL WHERE 절을 꼭 포함시키십시오.
데이터 검색, 결과 검사, 데이터베이스 변경 등을 위해 ADO는 Recordset 개체를 제공합니다. 이름에서 알 수 있듯이 Recordset 개체는 쿼리 제약 조건에 따라 일련의 데이터베이스 행 또는 레코드를 검색 및 표시합니다. Recordset 개체는 쿼리에 의해 반환된 각 레코드의 위치를 유지하고 그에 따라 사용자가 한 번에 한 항목씩 단계별로 결과를 살펴볼 수 있도록 합니다.
잘 만들어진 웹 데이터 응용 프로그램은 링크를 구축하기 위한 Connection 개체와 반환된 데이터를 조작하기 위한 Recordset 개체를 모두 사용합니다. 전문화된 두 개체의 기능을 함께 사용하여 거의 모든 데이터 처리 작업을 수행할 수 있는 데이터베이스 응용 프로그램을 개발할 수 있습니다. 예를 들어, 다음의 서버쪽 스크립트는 Recordset 개체를 사용하여 SQL SELECT 명령을 실행합니다. SELECT 명령은 쿼리 제약 조건에 따라 특정 정보를 검색합니다. 쿼리에는 또한 특정 조건으로 쿼리 범위를 좁히기 위해 사용되는 SQL WHERE 절이 포함됩니다. 이 예제에서 WHERE 절은 Customers 데이터베이스 테이블에서 LastName 필드 값이 Smith인 모든 레코드로 쿼리 범위를 제한합니다.
<%
'데이터 원본에 따른 연결을 구성합니다.
strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Employees.mdb"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConnectionString
'Recordset 개체의 인스턴스를 만듭니다.
Set rstCustomers = Server.CreateObject("ADODB.Recordset")
'Open 메서드를 사용하여 Recordset을 엽니다.
'이 때 Connection 개체로 구성된 연결을 사용합니다.
strSQL = "SELECT FirstName, LastName FROM Customers WHERE LastName = 'Smith' "
rstCustomers.Open strSQL, cnn
'Recordset을 통해 순환하여 결과가 나타나고
'MoveNext 메서드로 레코드 위치를 증가시킵니다.
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 메서드를 사용하여 Recordset을 엽니다.
'이 때 Connection 개체로 구성된 연결을 사용합니다.
rstCustomers.Open strSQL, strConnectionString
'Recordset을 통해 순환하여 결과가 나타나고,
'MoveNext 메서드로 레코드 위치를 증가시킵니다.
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 웹 사이트 의 Microsoft ADO(ActiveX Data Objects) 설명서를 참조하십시오.
참고 ASP 데이터베이스 응용 프로그램의 성능을 향상시키려면 응용 프로그램 상태의 레코드 집합을 캐시에 저장하십시오. 자세한 내용은 데이터 캐시를 참조하십시오.
RecordSet에서 반환되는 레코드의 수를 세는 것이 유용할 때가 있습니다. Recordset 개체의 Open 메서드를 사용하면 선택 사항인 cursor 매개 변수를 지정할 수 있습니다. 이 매개 변수는 기본적인 공급자가 Recordset을 검색 및 탐색하는 방법을 결정합니다. adOpenKeyset 커서 매개 변수를 쿼리를 실행하는 문에 추가하여 클라이언트 응용 프로그램에서 전체 레코드 집합을 탐색하게 할 수 있습니다. 그 결과, 응용 프로그램은 RecordCount 속성을 사용하여 RecordSet에서 레코드 수를 정확하게 셀 수 있습니다. 아래 예제를 참조하십시오.
<%
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
'Recordset 개체의 RecordCount 속성을 사용하여 레코드 수를 얻을 수 있습니다.
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
%>
ADO Command 개체를 사용하면 Connection 및 Recordset 개체로 수행된 쿼리와 동일한 방식으로 쿼리를 수행할 수 있습니다. 하지만 데이터베이스 원본의 쿼리를 준비 또는 컴파일한 다음 값을 달리 하여 쿼리를 반복적으로 다시 실행할 수 있다는 점이 다릅니다. 이런 방식으로 쿼리를 컴파일하면 기존 쿼리를 수정하여 다시 실행하는 데 걸리는 시간을 줄일 수 있습니다. 또한 실행 직전 쿼리의 일부를 바꾸는 옵션을 사용하여 SQL 쿼리를 부분적으로 정의하지 않을 수도 있습니다.
Command 개체의 Parameters 컬렉션을 사용하면 쿼리를 재실행할 때마다 다시 구성할 필요가 없습니다. 예를 들어, 웹 기반의 재고 관리 시스템에서 공급 및 비용 정보를 정기적으로 업데이트해야 할 경우, 다음과 같은 방식으로 쿼리를 미리 정의할 수 있습니다.
<%
'Connection 개체를 사용하여 연결합니다. Command 개체는
'연결을 구성하기 위한 Open 메서드가 없음을 주의하십시오.
strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Inventory.mdb"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConnectionString
'Command 개체의 인스턴스를 만들고, ActiveConnection 속성을 사용하여
'Command 개체에 연결을 첨부합니다.
Set cmn= Server.CreateObject("ADODB.Command")
Set cmn.ActiveConnection = cnn
'SQL 쿼리를 정의합니다.
cmn.CommandText = "INSERT INTO Inventory (Material, Quantity) VALUES (?, ?)"
'Command 개체를 처음 수행하기 전에 CommandText 속성에
'지정되기 위해 준비된(혹은 미리 컴파일된) 버전의 쿼리를 저장합니다.
cmn.Prepared = True
'쿼리 매개 변수 구성 정보를 정의합니다.
cmn.Parameters.Append cmn.CreateParameter("material_type",adVarChar, ,255 )
cmn.Parameters.Append cmn.CreateParameter("quantity",adVarChar, ,255 )
'첫 번째 데이터 삽입을 정의하고 실행합니다.
cmn("material_type") = "light bulbs"
cmn("quantity") = "40"
cmn.Execute ,,adCmdText + adExecuteNoRecords
'두 번째 데이터 삽입을 정의하고 실행합니다.
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')"
LastName 필드 값에 있는 O'Hara의 아포스트로피(')는 SQL VALUES 키워드에서 데이터 표시를 위해 사용되는 아포스트로피와 충돌이 일어날 수 있습니다. Command 개체 매개 변수로 쿼리 값을 바인드하면 이러한 문제를 피할 수 있습니다.
HTML 폼을 포함하는 웹 페이지를 사용하면 데이터베이스에 대해 원격으로 쿼리를 실행하고 특정 정보를 검색할 수 있습니다. ADO로 사용자는 사용자 양식 정보를 수집하고, 사용자 정의 데이터베이스 쿼리를 만들고, 사용자에게 정보를 반환하는 아주 단순한 스크립트를 작성할 수 있습니다. ASP Request 개체를 사용하면 HTML 폼에 입력된 정보를 검색하고, 이 정보를 SQL 문으로 합칠 수 있습니다. 예를 들어, 다음 스크립트 블록은 HTML 폼에서 제공한 정보를 테이블에 삽입합니다. 이 스크립트는 Request 개체의 Form 컬렉션으로 사용자 정보를 수집합니다.
<%
'Connection 개체를 사용하여 연결합니다. Command 개체는
'연결을 구성하기 위한 Open 메서드가 없음을 주의하십시오.
strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\CompanyCatalog\Seeds.mdb"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConnectionString
'명령 개체의 인스턴스를 만들고,
'ActiveConnection 속성을 사용하여
'명령 개체에 연결을 첨부합니다.
Set cmn= Server.CreateObject("ADODB.Command")
Set cmn.ActiveConnection = cnn
'SQL 쿼리를 정의합니다.
cmn.CommandText = "INSERT INTO MySeedsTable (Type) VALUES (?)"
'쿼리 매개 변수 구성 정보를 정의합니다.
cmn.Parameters.Append cmn.CreateParameter("type",adVarChar, ,255)
'입력 값을 할당하고 업데이트를 실행합니다.
cmn("type") = Request.Form("SeedType")
cmn.Execute ,,adCmdText + adExecuteNoRecords
%>
ASP Request개체를 사용하는 방법과 양식에 대한 자세한 내용은 사용자 입력 처리를 참조하십시오.
수 천명의 고객이 사용하는 온라인 주문 입력 응용 프로그램 등 복잡한 웹 데이터베이스 응용 프로그램을 설계할 때는 데이터베이스 연결을 적절히 관리하는 것이 가장 중요한 과제 중 하나입니다. 자료가 전송되지 않을 때에도 데이터베이스를 연결하고 관리하는 작업은 데이터베이스 서버의 자원을 상당히 많이 소모하므로 연결 문제가 발생할 수 있습니다. 잘 설계된 웹 데이터베이스 응용 프로그램은 데이터베이스 연결을 다시 사용하여 네트워크 사용량으로 인한 지연 시간을 보충합니다.
데이터베이스 서버의 작업량이 갑자기 증가하면 데이터베이스 연결 구성을 위한 시간이 크게 증가하여 실행이 지연될 수 있습니다. 그 결과 초과 연결 지연에 따라 데이터베이스 응용 프로그램의 성능을 저하시킬 수 있습니다.
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 속성을 포함하기 전에 먼저 연결 공급자와 데이터 원본이 이 속성을 지원하는지 확인하십시오.
연결 풀링을 사용하면 웹 응용 프로그램에서 재구성할 필요가 없는 여유 연결의 저장소나 풀의 연결을 사용할 수 있습니다. 연결이 작성되어 풀에 놓여지면 응용 프로그램에서 연결 프로세스를 수행할 필요 없이 해당 연결을 다시 사용합니다. 따라서 특히, 응용 프로그램에서 네트워크를 통해 연결하거나 연결 및 해제를 반복하는 경우 성능이 상당히 향상됩니다. 또한, 풀링된 연결은 여러 응용 프로그램에서 반복적으로 사용할 수 있습니다.
OLE DB에는 세션 풀링이라는 풀링 기능이 있어서, 대형 웹 데이터베이스 응용 프로그램의 연결 성능을 향상시킵니다. 세션 풀링은 연결의 보안과 다른 속성을 유지합니다. 풀링 연결은 연결 양쪽의 요청이 일치하는 경우에만 다시 사용됩니다. 기본적으로, Microsoft SQL Server와 Oracle용 OLE DB 공급자는 세션 풀링을 지원합니다. 즉, 세션 풀링을 사용하기 위해 응용 프로그램, 서버, 데이터베이스를 구성할 필요가 없다는 뜻입니다. 그러나 공급자가 기본적으로 세션 풀링을 지원하지 않으면 세션 풀링을 사용할 수 있도록 레지스트리를 설정해야 합니다. 세션 풀링에 대한 자세한 내용은 OLE DB 2.0 Software Development Kit(SDK) 설명서를 참조하십시오.
ODBC 드라이버를 사용하여 연결 풀링을 하려면 특정 데이터베이스 드라이버를 구성한 다음 Windows NT 레지스트리에서 드라이버의 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
참고 기본적으로 웹 서버는 CPTimeout을 60초로 설정하여 SQL Server의 연결 풀링을 활성화합니다.
ASP의 Application 개체에 연결을 저장하여 여러 페이지에 걸쳐 연결을 다시 사용할 수는 있지만, 연결을 불필요하게 계속 열어 두어야 하므로 연결 풀링 사용의 장점을 사용할 수 없습니다. 같은 ASP 데이터베이스 응용 프로그램에 연결할 사용자가 많은 경우, ASP의 Application 개체에 문자열을 두어서 여러 웹 페이지에 걸쳐 데이터베이스 연결 문자열을 다시 사용하는 것이 좋습니다. 예를 들어, 다음 스크립트와 같이 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
각 사용자가 여러 웹 페이지에 걸쳐서 연결을 다시 사용해야 하는 경우에는 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
%>