데이터 액세스 레이어의 연결 및 명령 수준 설정 구성(VB)Configuring the Data Access Layer's Connection- and Command-Level Settings (VB)

Scott Mitchellby Scott Mitchell

코드 다운로드 또는 PDF 다운로드Download Code or Download PDF

형식화 된 데이터 집합 내의 Tableadapter는 데이터베이스에 연결 하 고 명령을 실행 하며 결과를 사용 하 여 DataTable을 채우는 데 자동으로 처리 합니다.The TableAdapters within a Typed DataSet automatically take care of connecting to the database, issuing commands, and populating a DataTable with the results. 이러한 세부 정보를 직접 처리 하고자 하는 경우가 있으며,이 자습서에서는 TableAdapter의 데이터베이스 연결 및 명령 수준 설정에 액세스 하는 방법을 알아봅니다.There are occasions however when we want to take care of these details ourselves, and in this tutorial we learn how to access the database connection- and command-level settings in the TableAdapter.

소개Introduction

자습서 시리즈 전체에서 형식화 된 데이터 집합을 사용 하 여 계층화 된 아키텍처의 데이터 액세스 계층 및 비즈니스 개체를 구현 했습니다.Throughout the tutorial series we have used Typed DataSets to implement the Data Access Layer and business objects of our layered architecture. 첫 번째 자습서에서 설명한 대로 형식화 된 데이터 집합 s datatable는 데이터 리포지토리로 사용 되는 반면 tableadapter는 기본 데이터를 검색 하 고 수정 하기 위해 데이터베이스와 통신 하는 래퍼로 동작 합니다.As discussed in the first tutorial, the Typed DataSet s DataTables serve as repositories of data whereas the TableAdapters act as wrappers to communicate with the database to retrieve and modify the underlying data. Tableadapter는 데이터베이스 작업과 관련 된 복잡성을 캡슐화 하 고 데이터베이스에 연결 하거나, 명령을 실행 하거나, 결과를 DataTable로 채우는 코드를 작성할 필요가 없습니다.The TableAdapters encapsulate the complexity involved in working with the database and saves us from having to write code to connect to the database, issue a command, or populate the results into a DataTable.

그러나 TableAdapter의 깊이를 파악 하 고 ADO.NET 개체와 직접 작동 하는 코드를 작성 해야 하는 경우가 있습니다.There are times, however, when we need to burrow into the depths of the TableAdapter and write code that works directly with the ADO.NET objects. 예를 들어 트랜잭션 내에서 데이터베이스 수정 내용 래핑 자습서에서 ADO.NET 트랜잭션을 시작, 커밋 및 롤백하는 메서드를 TableAdapter에 추가 했습니다.In the Wrapping Database Modifications within a Transaction tutorial, for example, we added methods to the TableAdapter for beginning, committing, and rolling back ADO.NET transactions. 이러한 메서드는 TableAdapter s SqlCommand 개체에 할당 된, 수동으로 만든 내부 SqlTransaction 개체를 사용 했습니다.These methods used an internal, manually-created SqlTransaction object that was assigned to the TableAdapter s SqlCommand objects.

이 자습서에서는 TableAdapter의 데이터베이스 연결 및 명령 수준 설정에 액세스 하는 방법을 살펴봅니다.In this tutorial we will examine how to access the database connection- and command-level settings in the TableAdapter. 특히 기본 연결 문자열과 명령 제한 시간 설정에 액세스할 수 있도록 하는 ProductsTableAdapter에 기능을 추가 합니다.In particular, we will add functionality to the ProductsTableAdapter that enables access to the underlying connection string and command timeout settings.

ADO.NET를 사용 하 여 데이터 작업Working with Data Using ADO.NET

Microsoft .NET 프레임 워크에는 데이터 작업을 위해 특별히 디자인 된 클래스의 다양 한 포함 되어 있습니다.The Microsoft .NET Framework contains a plethora of classes designed specifically to work with data. System.Data 네임 스페이스내에 있는 이러한 클래스를 ADO.NET 클래스 라고 합니다.These classes, found within the System.Data namespace, are referred to as the ADO.NET classes. ADO.NET 파라솔 아래의 일부 클래스는 특정 데이터 공급자에 연결 됩니다.Some of the classes under the ADO.NET umbrella are tied to a particular data provider. 데이터 공급자는 ADO.NET 클래스와 기본 데이터 저장소 간에 정보를 전달할 수 있도록 하는 통신 채널 이라고 생각할 수 있습니다.You can think of a data provider as a communication channel that allows information to flow between the ADO.NET classes and the underlying data store. 특정 데이터베이스 시스템용으로 특별히 설계 된 공급자는 물론 OleDb 및 ODBC와 같은 일반화 된 공급자가 있습니다.There are generalized providers, like OleDb and ODBC, as well as providers that are specially designed for a particular database system. 예를 들어 OleDb 공급자를 사용 하 여 Microsoft SQL Server 데이터베이스에 연결할 수 있지만 SqlClient 공급자는 SQL Server에 맞게 설계 되 고 최적화 되었기 때문에 훨씬 더 효율적입니다.For example, while it is possible to connect to a Microsoft SQL Server database using the OleDb provider, the SqlClient provider is much more efficient as it was designed and optimized specifically for SQL Server.

프로그래밍 방식으로 데이터에 액세스 하는 경우 일반적으로 다음 패턴이 사용 됩니다.When programmatically accessing data, the following pattern is commonly used:

  1. 데이터베이스에 대 한 연결을 설정 합니다.Establish a connection to the database.
  2. 명령을 실행 합니다.Issue a command.
  3. SELECT 쿼리의 경우 결과 레코드를 사용 합니다.For SELECT queries, work with the resulting records.

이러한 각 단계를 수행 하기 위한 별도의 ADO.NET 클래스가 있습니다.There are separate ADO.NET classes for performing each of these steps. 예를 들어 SqlClient 공급자를 사용 하 여 데이터베이스에 연결 하려면 SqlConnection 클래스를 사용 합니다.To connect to a database using the SqlClient provider, for example, use the SqlConnection class. 데이터베이스에 대 한 INSERT, UPDATE, DELETE또는 SELECT 명령을 실행 하려면 SqlCommand 클래스를 사용 합니다.To issue an INSERT, UPDATE, DELETE, or SELECT command to the database, use the SqlCommand class.

트랜잭션 자습서에 포함 된 데이터베이스를 래핑하 는 경우를 제외 하 고, tableadapter 자동 생성 코드는 데이터베이스에 연결 하 고, 명령을 실행 하 고, 데이터를 검색 하 고, 데이터를 datatable로 채우는 데 필요한 기능을 포함 하기 때문에 하위 수준 ADO.NET 코드를 작성 하지 않아도 됩니다.Except for the Wrapping Database Modifications within a Transaction tutorial, we have not had to write any low-level ADO.NET code ourselves because the TableAdapters auto-generated code includes the functionality needed to connect to the database, issue commands, retrieve data, and populate that data into DataTables. 그러나 이러한 하위 수준 설정을 사용자 지정 해야 하는 경우가 있을 수 있습니다.However, there may be times when we need to customize these low-level settings. 다음 몇 단계에서 Tableadapter에 의해 내부적으로 사용 되는 ADO.NET 개체를 탭 하는 방법을 살펴보겠습니다.Over the next few steps we will examine how to tap into the ADO.NET objects used internally by the TableAdapters.

1 단계: 연결 속성을 사용 하 여 검사Step 1: Examining with the Connection Property

각 TableAdapter 클래스에는 데이터베이스 연결 정보를 지정 하는 Connection 속성이 있습니다.Each TableAdapter class has a Connection property that specifies database connection information. 이 속성의 데이터 형식 및 ConnectionString 값은 TableAdapter 구성 마법사에서 선택한 항목에 따라 결정 됩니다.This property s data type and ConnectionString value are determined by the selections made in the TableAdapter Configuration wizard. 형식화 된 데이터 집합에 TableAdapter를 처음 추가할 때이 마법사는 데이터베이스 원본을 묻는 메시지를 표시 합니다 (그림 1 참조).Recall that when we first add a TableAdapter to a Typed DataSet this wizard asks us for the database source (see Figure 1). 이 첫 번째 단계의 드롭다운 목록에는 구성 파일에 지정 된 데이터베이스와 서버 탐색기 s 데이터 연결의 다른 데이터베이스가 포함 됩니다.The drop-down list in this first step includes those databases specified in the configuration file as well as any other databases in the Server Explorer s Data Connections. 사용 하려는 데이터베이스가 드롭다운 목록에 없는 경우 새 연결 단추를 클릭 하 고 필요한 연결 정보를 제공 하 여 새 데이터베이스 연결을 지정할 수 있습니다.If the database we want to use does not exist in the drop-down list, a new database connection can be specified by clicking the New Connection button and providing the needed connection information.

TableAdapter 구성 마법사의 첫 번째 단계 The First Step of the TableAdapter Configuration Wizard

그림 1: TableAdapter 구성 마법사의 첫 번째 단계 (전체 크기 이미지를 보려면 클릭)Figure 1: The First Step of the TableAdapter Configuration Wizard (Click to view full-size image)

를 사용 하 여 TableAdapter Connection 속성에 대 한 코드를 검사 합니다.Let s take a moment to inspect the code for the TableAdapter s Connection property. 데이터 액세스 계층 만들기 자습서에 설명 된 대로 클래스 뷰 창으로 이동 하 여 적절 한 클래스로 드릴 다운 한 다음 멤버 이름을 두 번 클릭 하 여 자동 생성 된 TableAdapter 코드를 볼 수 있습니다.As noted in the Creating a Data Access Layer tutorial, we can view the auto-generated TableAdapter code by going to the Class View window, drilling down to the appropriate class, and then double-clicking the member name.

보기 메뉴로 이동 하 여 클래스 뷰를 선택 하거나 Ctrl + Shift + C를 입력 하 여 클래스 뷰 창으로 이동 합니다.Navigate to the Class View window by going to the View menu and choosing Class View (or by typing Ctrl+Shift+C). 클래스 뷰 창의 위쪽 절반에서 NorthwindTableAdapters 네임 스페이스로 드릴 다운 하 고 ProductsTableAdapter 클래스를 선택 합니다.From the top half of the Class View window, drill down to the NorthwindTableAdapters namespace and select the ProductsTableAdapter class. 그러면 그림 2에 표시 된 것 처럼 클래스 뷰의 하단에 ProductsTableAdapter s 멤버가 표시 됩니다.This will display the ProductsTableAdapter s members in the bottom half of the Class View, as shown in Figure 2. Connection 속성을 두 번 클릭 하 여 해당 코드를 확인 합니다.Double-click the Connection property to see its code.

자동 생성 된 코드를 보려면 클래스 뷰의 연결 속성을 두 번 클릭 합니다.

그림 2: 자동 생성 된 코드를 보려면 클래스 뷰에서 연결 속성을 두 번 클릭 합니다.Figure 2: Double-Click the Connection Property in the Class View to View Its Auto-Generated Code

TableAdapter s Connection 속성 및 기타 연결 관련 코드는 다음과 같습니다.The TableAdapter s Connection property and other connection-related code follows:

Private _connection As System.Data.SqlClient.SqlConnection
Private Sub InitConnection()
    Me._connection = New System.Data.SqlClient.SqlConnection
    Me._connection.ConnectionString = _
        ConfigurationManager.ConnectionStrings("NORTHWNDConnectionString").ConnectionString
End Sub
Friend Property Connection() As System.Data.SqlClient.SqlConnection
    Get
        If (Me._connection Is Nothing) Then
            Me.InitConnection
        End If
        Return Me._connection
    End Get
    Set
        Me._connection = value
        If (Not (Me.Adapter.InsertCommand) Is Nothing) Then
            Me.Adapter.InsertCommand.Connection = value
        End If
        If (Not (Me.Adapter.DeleteCommand) Is Nothing) Then
            Me.Adapter.DeleteCommand.Connection = value
        End If
        If (Not (Me.Adapter.UpdateCommand) Is Nothing) Then
            Me.Adapter.UpdateCommand.Connection = value
        End If
        Dim i As Integer = 0
        Do While (i < Me.CommandCollection.Length)
            If (Not (Me.CommandCollection(i)) Is Nothing) Then
                CType(Me.CommandCollection(i), _
                    System.Data.SqlClient.SqlCommand).Connection = value
            End If
            i = (i + 1)
        Loop
    End Set
End Property

TableAdapter 클래스를 인스턴스화하면 멤버 변수 _connection Nothing와 같습니다.When the TableAdapter class is instantiated, the member variable _connection is equal to Nothing. Connection 속성에 액세스 하면 먼저 _connection 멤버 변수가 인스턴스화 되었는지 확인 합니다.When the Connection property is accessed, it first checks to see if the _connection member variable has been instantiated. 그렇지 않은 경우 _connection을 인스턴스화하고 ConnectionString 속성을 TableAdapter 구성 마법사의 첫 번째 단계에서 지정한 연결 문자열 값으로 설정 하는 InitConnection 메서드가 호출 됩니다.If it has not, the InitConnection method is invoked, which instantiates _connection and sets its ConnectionString property to the connection string value specified from the TableAdapter Configuration wizard s first step.

Connection 속성은 SqlConnection 개체에 할당 될 수도 있습니다.The Connection property can also be assigned to a SqlConnection object. 이렇게 하면 새 SqlConnection 개체가 각 TableAdapter s SqlCommand 개체와 연결 됩니다.Doing so associates the new SqlConnection object with each of the TableAdapter s SqlCommand objects.

2 단계: 연결 수준 설정 노출Step 2: Exposing Connection-Level Settings

연결 정보는 TableAdapter 내에서 캡슐화 된 상태로 유지 되 고 응용 프로그램 아키텍처의 다른 계층에서는 액세스할 수 없습니다.The connection information should remain encapsulated within the TableAdapter and not be accessible to other layers in the application architecture. 그러나 쿼리, 사용자 또는 ASP.NET 페이지에서 TableAdapter s 연결 수준 정보에 액세스 하거나 사용자 지정할 수 있어야 하는 시나리오가 있을 수 있습니다.However, there may be scenarios when the TableAdapter s connection-level information needs to be accessible or customizable for a query, user, or ASP.NET page.

Northwind 데이터 집합의 ProductsTableAdapter을 확장 하 여 비즈니스 논리 계층에서 TableAdapter에 사용 되는 연결 문자열을 읽거나 변경 하는 데 사용할 수 있는 ConnectionString 속성을 포함 하도록 합니다.Let s extend the ProductsTableAdapter in the Northwind DataSet to include a ConnectionString property that can be used by the Business Logic Layer to read or change the connection string used by the TableAdapter.

Note

연결 문자열 은 사용할 공급자, 데이터베이스 위치, 인증 자격 증명 및 기타 데이터베이스 관련 설정과 같은 데이터베이스 연결 정보를 지정 하는 문자열입니다.A connection string is a string that specifies database connection information, such as the provider to use, the location of the database, authentication credentials, and other database-related settings. 다양 한 데이터 저장소 및 공급자에서 사용 하는 연결 문자열 패턴의 목록은 ConnectionStrings.com를 참조 하세요.For a list of connection string patterns used by a variety of data stores and providers, see ConnectionStrings.com.

데이터 액세스 계층 만들기 자습서에 설명 된 대로 형식화 된 데이터 집합의 자동 생성 클래스는 partial 클래스를 사용 하 여 확장할 수 있습니다.As discussed in the Creating a Data Access Layer tutorial, the Typed DataSet s auto-generated classes can be extended through the use of partial classes. 먼저 ~/App_Code/DAL 폴더 아래에 ConnectionAndCommandSettings 라는 프로젝트에 새 하위 폴더를 만듭니다.First, create a new subfolder in the project named ConnectionAndCommandSettings underneath the ~/App_Code/DAL folder.

ConnectionAndCommandSettings 라는 하위 폴더를 추가 합니다.

그림 3: 이름이 ConnectionAndCommandSettings 하위 폴더 추가Figure 3: Add a Subfolder Named ConnectionAndCommandSettings

ProductsTableAdapter.ConnectionAndCommandSettings.vb 이라는 새 클래스 파일을 추가 하 고 다음 코드를 입력 합니다.Add a new class file named ProductsTableAdapter.ConnectionAndCommandSettings.vb and enter the following code:

Namespace NorthwindTableAdapters
    Partial Public Class ProductsTableAdapter
        Public Property ConnectionString() As String
            Get
                Return Me.Connection.ConnectionString
            End Get
            Set(ByVal value As String)
                Me.Connection.ConnectionString = value
            End Set
        End Property
    End Class
End Namespace

이 partial 클래스는 ConnectionString 이라는 Public 속성을 ProductsTableAdapter 클래스에 추가 하 여 모든 계층에서 TableAdapter의 기본 연결에 대 한 연결 문자열을 읽거나 업데이트할 수 있도록 합니다.This partial class adds a Public property named ConnectionString to the ProductsTableAdapter class that allows any layer to read or update the connection string for the TableAdapter s underlying connection.

이 partial 클래스를 만들고 저장 한 다음 ProductsBLL 클래스를 엽니다.With this partial class created (and saved), open the ProductsBLL class. 기존 메서드 중 하나로 이동 하 고 Adapter 입력 한 다음 period 키를 눌러 IntelliSense를 표시 합니다.Go to one of the existing methods and type in Adapter and then hit the period key to bring up IntelliSense. IntelliSense에서 사용할 수 있는 새 ConnectionString 속성이 표시 되어야 합니다. 즉, BLL에서이 값을 프로그래밍 방식으로 읽거나 조정할 수 있습니다.You should see the new ConnectionString property available in IntelliSense, meaning that you can programmatically read or adjust this value from the BLL.

전체 연결 개체 노출Exposing the Entire Connection Object

이 partial 클래스는 기본 연결 개체인 ConnectionString의 속성을 하나만 노출 합니다.This partial class exposes just one property of the underlying connection object: ConnectionString. 전체 연결 개체를 TableAdapter의 범위를 넘어 사용할 수 있도록 하려는 경우에는 Connection 속성의 보호 수준을 변경할 수 있습니다.If you want to make the entire connection object available beyond the confines of the TableAdapter, you can alternatively change the Connection property s protection level. 1 단계에서 검사 한 자동 생성 코드는 TableAdapter s Connection 속성이 Friend으로 표시 되었음을 보여 줍니다. 즉, 동일한 어셈블리의 클래스 에서만 액세스할 수 있습니다.The auto-generated code we examined in Step 1 showed that the TableAdapter s Connection property is marked as Friend, meaning that it can only be accessed by classes in the same assembly. 그러나 TableAdapter s ConnectionModifier 속성을 통해 변경할 수 있습니다.This can be changed, however, via the TableAdapter s ConnectionModifier property.

Northwind 데이터 집합을 열고 디자이너에서 ProductsTableAdapter를 클릭 한 다음 속성 창으로 이동 합니다.Open the Northwind DataSet, click on the ProductsTableAdapter in the Designer, and navigate to the Properties window. ConnectionModifier 설정 된 기본값 (Assembly)이 표시 됩니다.There you will see the ConnectionModifier set to its default value, Assembly. Connection 속성을 형식화 된 데이터 집합의 어셈블리 외부에서 사용할 수 있도록 하려면 ConnectionModifier 속성을 Public로 변경 합니다.To make the Connection property available outside of the Typed DataSet s assembly, change the ConnectionModifier property to Public.

연결 속성 s 액세스 가능성 수준은 ConnectionModifier 속성을 통해 구성할 수 .The Connection Property s Accessibility Level Can Be Configured via the ConnectionModifier Property

그림 4: ConnectionModifier 속성을 통해 Connection 속성의 접근성 수준을 구성할 수 있습니다 (전체 크기 이미지를 보려면 클릭).Figure 4: The Connection Property s Accessibility Level Can Be Configured via the ConnectionModifier Property (Click to view full-size image)

데이터 집합을 저장 한 다음 ProductsBLL 클래스로 돌아갑니다.Save the DataSet and then return to the ProductsBLL class. 이전 처럼 기존 메서드 중 하나로 이동 하 고 Adapter 입력 한 다음 period 키를 눌러 IntelliSense를 표시 합니다.As before, go to one of the existing methods and type in Adapter and then hit the period key to bring up IntelliSense. 이 목록에는 Connection 속성이 포함 되어야 합니다. 즉, 이제 BLL에서 연결 수준 설정을 프로그래밍 방식으로 읽거나 할당할 수 있습니다.The list should include a Connection property, meaning that you can now programmatically read or assign any connection-level settings from the BLL.

TableAdapter는 기본적으로 자동 생성 된 INSERT, UPDATEDELETE 문을 포함 하는 주 쿼리로 구성 됩니다.A TableAdapter consists of a main query that, by default, has auto-generated INSERT, UPDATE, and DELETE statements. 이 주 쿼리 INSERT, UPDATEDELETE 문은 TableAdapter s 코드에서 Adapter 속성을 통해 ADO.NET 데이터 어댑터 개체로 구현 됩니다.This main query s INSERT, UPDATE, and DELETE statements are implemented in the TableAdapter s code as an ADO.NET data adapter object via the Adapter property. Connection 속성과 마찬가지로 Adapter 속성의 데이터 형식은 사용 된 데이터 공급자에 의해 결정 됩니다.Like with its Connection property, the Adapter property s data type is determined by the data provider used. 이러한 자습서에서는 SqlClient 공급자를 사용 하므로 Adapter 속성은 SqlDataAdapter유형입니다.Since these tutorials use the SqlClient provider, the Adapter property is of type SqlDataAdapter.

TableAdapter s Adapter 속성에는 INSERT, UPDATEDELETE 문을 실행 하는 데 사용 하는 SqlCommand 형식의 세 가지 속성이 있습니다.The TableAdapter s Adapter property has three properties of type SqlCommand that it uses to issue the INSERT, UPDATE, and DELETE statements:

  • InsertCommand
  • UpdateCommand
  • DeleteCommand

SqlCommand 개체는 데이터베이스에 특정 쿼리를 전송 하는 작업을 담당 하며 실행할 임시 SQL 문이나 저장 프로시저를 포함 하는 CommandText와 같은 속성을 포함 합니다. 및 ParametersSqlParameter 개체의 컬렉션입니다.A SqlCommand object is responsible for sending a particular query to the database and has properties like: CommandText, which contains the ad-hoc SQL statement or stored procedure to execute; and Parameters, which is a collection of SqlParameter objects. 데이터 액세스 계층 만들기 자습서에서 보았듯이 이러한 명령 개체는 속성 창를 통해 사용자 지정할 수 있습니다.As we saw back in the Creating a Data Access Layer tutorial, these command objects can be customized through the Properties window.

TableAdapter에는 주 쿼리 외에도 호출 시 데이터베이스에 지정 된 명령을 디스패치할 수 있는 여러 메서드가 포함 될 수 있습니다.In addition to its main query, the TableAdapter can include a variable number of methods that, when invoked, dispatch a specified command to the database. 주 쿼리의 command 개체와 모든 추가 메서드에 대 한 명령 개체는 TableAdapter s CommandCollection 속성에 저장 됩니다.The main query s command object and the command objects for all additional methods are stored in the TableAdapter s CommandCollection property.

를 사용 하 여 이러한 두 속성과 지원 멤버 변수 및 도우미 메서드에 대 한 Northwind 데이터 집합의 ProductsTableAdapter에서 생성 된 코드를 살펴보겠습니다.Let s take a moment to look at the code generated by the ProductsTableAdapter in the Northwind DataSet for these two properties and their supporting member variables and helper methods:

Private WithEvents _adapter As System.Data.SqlClient.SqlDataAdapter
Private Sub InitAdapter()
    Me._adapter = New System.Data.SqlClient.SqlDataAdapter
    
    ... Code that creates the InsertCommand, UpdateCommand, ...
    ... and DeleteCommand instances - omitted for brevity ...
End Sub
Private ReadOnly Property Adapter() As System.Data.SqlClient.SqlDataAdapter
    Get
        If (Me._adapter Is Nothing) Then
            Me.InitAdapter
        End If
        Return Me._adapter
    End Get
End Property
Private _commandCollection() As System.Data.SqlClient.SqlCommand
Private Sub InitCommandCollection()
    Me._commandCollection = New System.Data.SqlClient.SqlCommand(8) {}
    ... Code that creates the command objects for the main query and the ...
    ... ProductsTableAdapter�s other eight methods - omitted for brevity ...
End Sub
Protected ReadOnly Property CommandCollection() As System.Data.SqlClient.SqlCommand()
    Get
        If (Me._commandCollection Is Nothing) Then
            Me.InitCommandCollection
        End If
        Return Me._commandCollection
    End Get
End Property

AdapterCommandCollection 속성에 대 한 코드는 Connection 속성의 코드와 긴밀 하 게 유사 합니다.The code for the Adapter and CommandCollection properties closely mimics that of the Connection property. 속성에서 사용 하는 개체를 보유 하는 멤버 변수가 있습니다.There are member variables that hold the objects used by the properties. 속성 Get 접근자는 해당 멤버 변수가 Nothing되었는지 확인 하 여 시작 합니다.The properties Get accessors start by checking to see if the corresponding member variable is Nothing. 이 경우 멤버 변수의 인스턴스를 만들고 핵심 명령 관련 속성을 할당 하는 초기화 메서드가 호출 됩니다.If so, an initialization method is called which creates an instance of the member variable and assigns the core command-related properties.

4 단계: 명령 수준 설정 노출Step 4: Exposing Command-Level Settings

명령 수준 정보는 데이터 액세스 계층 내에서 캡슐화 된 상태로 유지 되는 것이 가장 좋습니다.Ideally, the command-level information should remain encapsulated within the Data Access Layer. 이 정보는 아키텍처의 다른 계층에서 필요 하지만, 연결 수준 설정과 마찬가지로 partial 클래스를 통해 노출 될 수 있습니다.Should this information be needed in other layers of the architecture, however, it can be exposed through a partial class, just like with the connection-level settings.

TableAdapter에는 단일 Connection 속성만 있으므로 연결 수준 설정을 노출 하는 코드는 매우 간단 합니다.Since the TableAdapter only has a single Connection property, the code for exposing connection-level settings is fairly straightforward. TableAdapter에는 InsertCommand, UpdateCommandDeleteCommandCommandCollection 속성의 여러 명령 개체를 포함 하 여 여러 명령 개체를 포함할 수 있기 때문에 명령 수준 설정을 수정할 때 약간 더 복잡 합니다.Things are a bit more complicated when modifying command-level settings because the TableAdapter can have multiple command objects - an InsertCommand, UpdateCommand, and DeleteCommand, along with a variable number of command objects in the CommandCollection property. 명령 수준 설정을 업데이트 하는 경우 이러한 설정을 모든 명령 개체에 전파 해야 합니다.When updating command-level settings, these settings will need to be propagated to all of the command objects.

예를 들어 TableAdapter에 실행 하는 데 매우 긴 시간이 소요 된 특정 쿼리가 있다고 가정 합니다.For example, imagine that there were certain queries in the TableAdapter that took an extraordinary long time to execute. TableAdapter를 사용 하 여 이러한 쿼리 중 하나를 실행 하는 경우 명령 개체 CommandTimeout 속성을 늘릴 수 있습니다.When using the TableAdapter to execute one of those queries, we might want to increase the command object s CommandTimeout property. 이 속성은 명령이 실행 될 때까지 대기 하는 시간 (초)을 지정 하 고 기본값은 30입니다.This property specifies the number of seconds to wait for the command to execute and defaults to 30.

CommandTimeout 속성이 BLL에 의해 조정 될 수 있도록 하려면 2 단계에서 만든 partial 클래스 파일 (ProductsTableAdapter.ConnectionAndCommandSettings.vb)을 사용 하 여 ProductsDataTable에 다음 Public 메서드를 추가 합니다.To allow the CommandTimeout property to be adjusted by the BLL, add the following Public method to the ProductsDataTable using the partial class file created in Step 2 (ProductsTableAdapter.ConnectionAndCommandSettings.vb):

Public Sub SetCommandTimeout(ByVal timeout As Integer)
    If Me.Adapter.InsertCommand IsNot Nothing Then
        Me.Adapter.InsertCommand.CommandTimeout = timeout
    End If
    If Me.Adapter.DeleteCommand IsNot Nothing Then
        Me.Adapter.DeleteCommand.CommandTimeout = timeout
    End If
    If Me.Adapter.UpdateCommand IsNot Nothing Then
        Me.Adapter.UpdateCommand.CommandTimeout = timeout
    End If
    For i As Integer = 0 To Me.CommandCollection.Length - 1
        If Me.CommandCollection(i) IsNot Nothing Then
            Me.CommandCollection(i).CommandTimeout = timeout
        End If
    Next
End Sub

이 메서드는 해당 TableAdapter 인스턴스의 모든 명령에 대 한 명령 제한 시간을 설정 하기 위해 BLL 또는 프레젠테이션 계층에서 호출 될 수 있습니다.This method could be invoked from the BLL or Presentation Layer to set the command timeout for all commands issues by that TableAdapter instance.

Note

AdapterCommandCollection 속성은 Private로 표시 됩니다. 즉, TableAdapter 내의 코드 에서만 액세스할 수 있습니다.The Adapter and CommandCollection properties are marked as Private, meaning they can only be accessed from code within the TableAdapter. Connection 속성과 달리 이러한 액세스 한정자는 구성할 수 없습니다.Unlike the Connection property, these access modifiers are not configurable. 따라서 아키텍처의 다른 계층에 명령 수준 속성을 노출 해야 하는 경우 위에 설명 된 부분 클래스 방식을 사용 하 여 Private 명령 개체를 읽거나 쓰는 Public 메서드나 속성을 제공 해야 합니다.Therefore, if you need to expose command-level properties to other layers in the architecture you must use the partial class approach discussed above to provide a Public method or property that reads or writes to the Private command objects.

요약Summary

형식화 된 데이터 집합 내의 Tableadapter는 데이터 액세스 세부 정보 및 복잡성을 캡슐화 하는 데 사용 됩니다.The TableAdapters within a Typed DataSet serve to encapsulate data access details and complexity. Tableadapter를 사용 하 여 데이터베이스에 연결 하거나, 명령을 실행 하거나, 결과를 DataTable로 채우는 ADO.NET 코드를 작성 하는 것에 대해 걱정할 필요가 없습니다.Using TableAdapters, we do not have to worry about writing ADO.NET code to connect to the database, issue a command, or populate the results into a DataTable. 모든 것이 자동으로 처리 됩니다.It is all handled automatically for us.

그러나 연결 문자열 또는 기본 연결 또는 명령 제한 시간 값을 변경 하는 것과 같은 하위 수준 ADO.NET 특성을 사용자 지정 해야 하는 경우가 있을 수 있습니다.However, there may be times when we need to customize the low-level ADO.NET specifics, such as changing the connection string or the default connection or command timeout values. TableAdapter에는 자동으로 생성 된 Connection, AdapterCommandCollection 속성이 있지만 기본적으로 Friend 또는 Private입니다.The TableAdapter has auto-generated Connection, Adapter, and CommandCollection properties, but these are either Friend or Private, by default. Partial 클래스를 사용 하 여 Public 메서드 또는 속성을 포함 하는 TableAdapter를 확장 하 여이 내부 정보를 노출할 수 있습니다.This internal information can be exposed by extending the TableAdapter using partial classes to include Public methods or properties. 또는 tableadapter s Connection 속성 액세스 한정자를 TableAdapter s ConnectionModifier 속성을 통해 구성할 수 있습니다.Alternatively, the TableAdapter s Connection property access modifier can be configured through the TableAdapter s ConnectionModifier property.

행복 한 프로그래밍Happy Programming!

저자 정보About the Author

Scott Mitchell(7 개의 ASP/ASP. NET books 및 4GuysFromRolla.com창립자)은 1998부터 Microsoft 웹 기술을 사용 하 여 작업 했습니다.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott은 독립 컨설턴트, 강사 및 기록기로 작동 합니다.Scott works as an independent consultant, trainer, and writer. 최신 책은 24 시간 이내에 ASP.NET 2.0을 sams teach yourself것입니다.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.com에 도달할 수 있습니다 .He can be reached at mitchell@4GuysFromRolla.com. 또는 블로그를 통해 http://ScottOnWriting.NET에서 찾을 수 있습니다.or via his blog, which can be found at http://ScottOnWriting.NET.

특별히 감사 합니다.Special Thanks To

이 자습서 시리즈는 많은 유용한 검토자가 검토 했습니다.This tutorial series was reviewed by many helpful reviewers. 이 자습서의 리드 검토자는 Burnadette Leigh, S ren Jacob Lauritsen, Teresa Murphy 및 Hilton Geisenow 였습니다.Lead reviewers for this tutorial were Burnadette Leigh, S ren Jacob Lauritsen, Teresa Murphy, and Hilton Geisenow. 예정 된 MSDN 문서를 검토 하는 데 관심이 있나요?Interested in reviewing my upcoming MSDN articles? 그렇다면mitchell@4GuysFromRolla.com에서 줄을 삭제 합니다.If so, drop me a line at mitchell@4GuysFromRolla.com.