다음을 통해 공유


SqlDataSource 컨트롤을 사용하여 데이터 선택

업데이트: 2007년 11월

SqlDataSource 컨트롤을 사용하면 코드를 거의 작성하지 않고 데이터베이스에서 데이터를 검색할 수 있습니다. SqlDataSource 컨트롤은 Microsoft SQL Server, Oracle, ODBC 또는 OLE DB(예: Microsoft Access) 데이터베이스 등을 포함하여 구성 파일의 DbProviderFactories 섹션에 구성된 ADO.NET 공급자가 연결되어 있는 모든 데이터베이스에 사용될 수 있습니다. 데이터베이스에 따라 SqlDataSource에 사용하기 위해 구성하는 SQL 문의 구문 및 저장 프로시저 같은 고급 데이터베이스 기능을 사용할 수 있는지 여부가 결정됩니다. 그러나 데이터 소스 컨트롤은 모든 데이터베이스에 대해 같은 방식으로 작동합니다.

SqlDataSource 컨트롤을 사용하여 데이터베이스에서 데이터를 검색하려면 최소한 다음과 같은 속성을 설정해야 합니다.

  • ProviderName   현재 작업 중인 데이터베이스를 나타내는 ADO.NET 공급자의 이름으로 설정합니다. Microsoft SQL Server로 작업하는 경우 ProviderName 속성을 "System.Data.SqlClient"로 설정하고 Oracle 데이터베이스로 작업하는 경우에는 ProviderName 속성을 "System.Data.OracleClient"로 설정합니다.

  • ConnectionString   데이터베이스에 사용되는 연결 문자열로 설정합니다.

  • SelectCommand   데이터베이스에서 데이터를 반환하는 SQL 쿼리 또는 저장 프로시저로 설정합니다. SelectCommand 속성에 대해 설정하는 쿼리는 ADO.NET 데이터 액세스 코드를 작성할 때 ADO.NET IDbCommand 개체의 CommandText 속성에 대해 설정하는 쿼리와 같습니다. SQL 쿼리의 실제 구문은 데이터의 스키마와 사용 중인 데이터베이스에 따라 달라집니다.

다음 단원에서는 이러한 속성에 대해 자세히 설명합니다.

공급자 이름 지정

ProviderName 속성을 데이터가 저장되는 데이터베이스의 유형과 연결된 ADO.NET 공급자의 이름으로 설정합니다. 사용 가능한 공급자 목록이 Machine.config 또는 Web.config 구성 파일의 DbProviderFactories 섹션에 등록되어 있습니다. 기본적으로 SqlDataSource 컨트롤은 Microsoft SQL Server에 해당하는 System.Data.SqlClient ADO.NET 공급자를 사용합니다. 따라서 SQL Server 데이터베이스에 연결할 경우에는 공급자를 명시적으로 지정할 필요가 없습니다. 그러나 System.Data.OracleClient, System.Data.Odbc 또는 System.Data.OleDb 공급자를 지정할 수도 있습니다. 자세한 내용은 ADO.NET을 참조하십시오.

참고:

ProviderName 공급자를 관리되지 않는 ADO 공급자 값(예: SQLOLEDB 또는 MSDAORA)으로 설정하지 마십시오.

연결 문자열 지정

ConnectionString 속성을 특정 데이터베이스에 사용되는 연결 문자열로 설정합니다. 그러나 대규모 사이트에 대해 SqlDataSource 컨트롤의 ConnectionString 속성을 특정 연결 문자열로 설정하면 관리 측면에서 볼 때 별로 유용하지 않습니다. 또한 연결 문자열은 ASP.NET 페이지에 일반 텍스트로 저장됩니다. 웹 응용 프로그램을 쉽게 관리하고 보안을 강화하려면 응용 프로그램 구성 파일의 connectionStrings 요소에 연결 문자열을 저장하는 것이 좋습니다. 그러면 다음 예제와 같은 연결 식을 사용하여 앞에서 저장한 연결 문자열을 참조할 수 있습니다.

<asp:SqlDataSource 
  ID="SqlDataSource1" 
   
  ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
   SelectCommand="SELECT * FROM [Categories]">
</asp:SqlDataSource>

보안을 강화하기 위해 <connectionStrings> 구성 섹션의 내용을 암호화할 수도 있습니다. 자세한 내용은 구성 섹션 암호화 및 해독을 참조하십시오.

Select 명령 지정

SelectCommand 속성을 설정하여 SqlDataSource 컨트롤에서 실행할 SQL 쿼리를 지정할 수 있습니다. 다음 예제에서는 Employees 테이블에서 모든 직원의 성으로 구성된 결과 집합을 검색하는 SQL 쿼리를 보여 줍니다.

SELECT LastName FROM Employees;

다음 코드 예제에서는 SqlDataSource 컨트롤의 ConnectionStringSelectCommand 속성을 설정하여 GridView 컨트롤에 Employees 데이터를 표시할 수 있는 방법을 보여 줍니다.

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>

현재 작업 중인 데이터베이스에서 저장 프로시저를 지원하는 경우, SelectCommand 속성을 저장 프로시저의 이름으로 설정하고 SelectCommandType 속성을 StoredProcedure로 설정하여 SelectCommand 속성이 저장 프로시저를 참조한다는 것을 나타낼 수 있습니다. 다음 예제에서는 SQL Server에서 만들 수 있는 간단한 저장 프로시저를 보여 줍니다.

CREATE PROCEDURE sp_GetAllEmployees AS
    SELECT * FROM Employees;
GO

SqlDataSource에서 이 저장 프로시저를 사용하도록 구성하려면 SelectCommand 텍스트를 "sp_GetAllEmployees"로 설정하고 SelectCommandType 속성을 StoredProcedure로 설정합니다.

대부분의 저장 프로시저에는 매개 변수가 사용됩니다. 매개 변수가 있는 저장 프로시저를 사용하는 데 대한 자세한 내용은 SqlDataSource 컨트롤에 매개 변수 사용을 참조하십시오.

런타임에 SqlDataSource 컨트롤이 SelectCommand 속성의 텍스트를 데이터베이스에 제출하고, 데이터베이스에서는 쿼리 또는 저장 프로시저의 결과를 SqlDataSource 컨트롤에 반환합니다. 데이터 소스 컨트롤에 바인딩되어 있는 웹 컨트롤은 ASP.NET 페이지에 결과 집합을 표시합니다.

SQL 문에 매개 변수 전달

때때로 사용자는 런타임에만 확인할 수 있는 매개 변수에 기반한 데이터와 상호 작용합니다. 예를 들어 특정 날짜에 대한 보고서를 나타내는 데이터가 ASP.NET 웹 페이지에 표시될 수 있습니다. 사용자가 다른 날짜를 선택하면 보고서의 데이터도 변경됩니다. 매개 변수가 있는 SQL 쿼리를 데이터베이스에 제출할 경우에는 사용자가 명시적으로 날짜를 변경하는지 아니면 웹 응용 프로그램에서 프로그래밍 방식으로 날짜를 변경하는지에 관계없이 좀 더 융통성 있고 쉽게 관리할 수 있는 방식으로 쿼리를 작성할 수 있습니다. 매개 변수가 있는 SQL 쿼리에서는 SQL 문의 요소가 웹 응용 프로그램 변수에 바인딩되어 있고 런타임에 확인됩니다.

SqlDataSource 컨트롤은 SelectParameters 컬렉션에 추가하는 매개 변수를 SelectCommand 쿼리의 자리 표시자와 연결하여 매개 변수가 있는 SQL 쿼리를 지원합니다. 페이지의 다른 컨트롤, 세션 상태, 사용자 프로필 및 다른 요소에서 매개 변수 값을 읽을 수 있습니다. 자세한 내용은 SqlDataSource 컨트롤에 매개 변수 사용을 참조하십시오.

자리 표시자에 사용되는 구문은 데이터베이스 유형에 따라 다릅니다. SQL Server로 작업하는 경우 매개 변수 이름은 '@' 문자로 시작하고 SelectParameters 컬렉션에 있는 Parameter 개체의 이름에 해당합니다. ODBC 또는 OLE DB 데이터베이스로 작업할 경우에는 매개 변수가 있는 문의 매개 변수에 이름이 지정되지 않고 대신 자리 표시자 문자 '?'를 사용하여 지정됩니다.

다음 예제에서는 매개 변수가 있는 SQL 쿼리를 사용하여 현재 로그인한 직원의 ID를 기반으로 SQL Server Northwind 데이터베이스에서 모든 주문을 검색하는 방법을 보여 줍니다.

SELECT * FROM Orders WHERE EmployeeID = @empid

이 예제에서 @empid 식은 런타임에 확인되는 매개 변수입니다.

다음 코드 예제에서는 매개 변수가 있는 SQL 쿼리가 페이지의 다른 컨트롤에서 매개 변수 값을 가져오는 것을 보여 줍니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <p><asp:dropdownlist
          id="DropDownList1"
          
          autopostback="True">
          <asp:listitem selected="True">Sales Representative</asp:listitem>
          <asp:listitem>Sales Manager</asp:listitem>
          <asp:listitem>Vice President, Sales</asp:listitem>
      </asp:dropdownlist></p>

      <asp:sqldatasource
          id="SqlDataSource1"
          
          connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
          selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <selectparameters>
              <asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
          </selectparameters>
      </asp:sqldatasource>

      <p><asp:listbox
          id="ListBox1"
          
          datasourceid="SqlDataSource1"
          datatextfield="LastName">
      </asp:listbox></p>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <p><asp:dropdownlist
          id="DropDownList1"
          
          autopostback="True">
          <asp:listitem selected="True">Sales Representative</asp:listitem>
          <asp:listitem>Sales Manager</asp:listitem>
          <asp:listitem>Vice President, Sales</asp:listitem>
      </asp:dropdownlist></p>

      <asp:sqldatasource
          id="SqlDataSource1"
          
          connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
          selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <selectparameters>
              <asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
          </selectparameters>
      </asp:sqldatasource>

      <p><asp:listbox
          id="ListBox1"
          
          datasourceid="SqlDataSource1"
          datatextfield="LastName">
      </asp:listbox></p>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <p><asp:DropDownList
          id="DropDownList1"
          
          AutoPostBack="True">
          <asp:ListItem Selected="True">Sales Representative</asp:ListItem>
          <asp:ListItem>Sales Manager</asp:ListItem>
          <asp:ListItem>Vice President, Sales</asp:ListItem>
      </asp:DropDownList></p>

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <SelectParameters>
              <asp:ControlParameter Name="Title" ControlId="DropDownList1" PropertyName="SelectedValue"/>
          </SelectParameters>
      </asp:SqlDataSource>

      <p><asp:ListBox
          id="ListBox1"
          
          DataSourceID="SqlDataSource1"
          DataTextField="LastName">
      </asp:ListBox></p>

    </form>
  </body>
</html>

SqlDataSource 컨트롤에 매개 변수를 사용하는 데 대한 자세한 내용은 SqlDataSource 컨트롤에 매개 변수 사용을 참조하십시오. 데이터 소스 매개 변수를 사용하는 데 대한 일반적인 내용은 데이터 소스 컨트롤에 매개 변수 사용을 참조하십시오.

데이터 반환 방법 지정

SqlDataSource 컨트롤의 DataSourceMode 속성은 SqlDataSource 컨트롤이 데이터를 유지 관리하는 방법을 결정합니다. 기본적으로 DataSourceMode 속성은 DataSet으로 설정됩니다. 즉, SqlDataSource 컨트롤은 데이터베이스에서 반환되는 결과 집합을 서버 메모리에 저장합니다. SqlDataSource 컨트롤이 DataSet 모드에서 데이터를 검색하는 경우, GridViewDetailsView 등의 연결된 데이터 바인딩된 컨트롤에서는 자동 정렬 및 페이징 같은 다양한 데이터 표시 기능을 제공할 수 있습니다.

DataSourceMode 속성을 DataReader로 설정할 수도 있습니다. 이렇게 하면 결과 집합이 메모리에 저장되지 않습니다. 결과 집합을 서버의 메모리에 저장할 필요가 없는 시나리오에서는 DataReader 모드를 사용하십시오.

다음 코드 예제에서는 정렬, 페이징 또는 필터링이 필요 없는 시나리오의 경우 SqlDataSource 컨트롤의 DataSourceMode 속성을 DataReader로 설정하는 방법을 보여 줍니다.

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>

SqlDataSource 컨트롤 이벤트를 사용하여 사용자 지정 처리 추가

SqlDataSource 컨트롤은 데이터 검색 작업을 수행하기 전/후에 코드를 실행하기 위해 처리할 수 있는 이벤트를 노출합니다.

SqlDataSource 컨트롤은 Select 메서드를 호출하기 전에 Selecting 이벤트를 발생시켜 SelectCommand 속성에 설정된 SQL 쿼리를 실행합니다. Selecting 이벤트를 처리하여 SQL 쿼리를 실행하기 전에 미리 검토하고, SelectParameters 컬렉션에 포함된 매개 변수의 유효성을 검사하거나 데이터를 검색하기 전에 다른 작업을 수행할 수 있습니다. 예를 들어 SqlDataSource 컨트롤에 FormParameter를 사용하는 경우 데이터를 검색하기 전에 매개 변수 값의 유효성을 검사하기 위해 Selecting 이벤트를 처리할 수 있습니다. FormParameter는 HTML 요소에 게시된 값을 사용하고 유효성을 검사하지 않은 상태로 이 값을 데이터베이스에 제출합니다. 이 때 허용되지 않는 값이면 SqlDataSourceSelectingEventArgs 개체의 Cancel 속성을 true로 설정하여 쿼리를 취소할 수 있습니다.

SqlDataSource 컨트롤은 데이터를 검색한 후에 Selected 이벤트를 발생시킵니다. Selected 이벤트를 처리하여 데이터베이스 작업 중에 예외가 throw되었는지 여부를 확인하거나 데이터 작업에서 반환된 값을 검토할 수 있습니다.

데이터 표시

ASP.NET 페이지에 데이터를 표시하려면 GridView, DetailsView 또는 FormView 같은 데이터 바인딩된 컨트롤이나 ListBox 또는 DropDownList 같은 다른 컨트롤을 사용합니다. 데이터 바인딩된 컨트롤은 SqlDataSource 컨트롤이 검색하는 데이터의 소비자로 사용됩니다. 데이터 바인딩된 컨트롤의 DataSourceID 속성을 SqlDataSource 컨트롤의 ID로 설정합니다. 페이지가 렌더링되면 SqlDataSource 컨트롤이 데이터를 검색하여 데이터 바인딩된 컨트롤에 제공하고 그러면 데이터 바인딩된 컨트롤에 이 데이터가 표시됩니다. 데이터 바인딩된 컨트롤에 대한 내용 및 데이터 소스 컨트롤에 데이터 바인딩된 컨트롤을 사용하여 데이터를 표시하는 방법을 보려면 ASP.NET 데이터 바인딩 웹 서버 컨트롤 개요를 참조하십시오.

다음 코드 예제에서는 GridView 컨트롤을 사용하여 쿼리 결과를 표시하는 방법을 보여 줍니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>

참고 항목

개념

SqlDataSource 웹 서버 컨트롤 개요