이 기사에서는 CheckBox 컨트롤이 포함된 DataGrid를 만듭니다. 이 컨트롤을 사용하면 사용자가 세부 탐색을 위해 여러 열을 선택할 수 있습니다. 동적 SQL에 대해 이 기능을 복구할 수 있는 방법이 없으면 IN 연산을 사용해야 합니다.
기사 끝부분에서 문자열을 구분된 하위 문자열로 나누기 위해 SQL Server 사용자 정의 함수(UDF)를 작성했습니다. 이 기사에서는 이러한 UDF가 어떻게 유용할 수 있는지 살펴보겠습니다. 사용자가 확인란 컨트롤을 선택하여 DataGrid에서 일부 레코드를 선택할 수 있는 웹 양식을 만듭니다. 확인된 레코드의 세부정보는 양식의 다른 DataGrid에 표시됩니다. 이 형태는 아래 그림과 같습니다.
아래에는 양식을 만드는 데 사용한 ASPX가 나와 있습니다. 참고: TemplateColumn 및 Checkbox 컨트롤을 사용하여 DataGrid 열을 늘리는 방법. 또한 DataGrid의 DataKeyField 속성을 사용하여 데이터베이스 레코드의 어떤 필드에 첫 번째 행의 키 식별자가 포함될 것인지 개체에 알려줍니다.
<form id="Form1" method="post" runat="서버">
<asp:DataGrid id="DataGrid1" runat="서버"
AutoGenerateColumns="False" DataKeyField="직원ID">
<열>
<asp:템플릿열>
<항목 템플릿>
<asp:CheckBox runat="서버" ID="EmployeeCheckBox" />
</ItemTemplate>
</asp:템플릿열>
<asp:템플릿열>
<항목 템플릿>
<%# DataBinder.Eval(Container.DataItem, "LastName") %>,
<%# DataBinder.Eval(Container.DataItem, "FirstName") %>
</ItemTemplate>
</asp:템플릿열>
</열>
</asp:DataGrid>
<hr>
<asp:Button id="Orders" runat="server" Text="주문 보기"></asp:Button>
<시간>
<asp:DataGrid ID="DataGrid2" Runat="서버" AutoGenerateColumns="True" />
</form>
폼이 로드되고 초기화되면 상단 DataGrid를 어셈블해야 합니다. 코드는 엔터프라이즈 라이브러리를 사용하여 SQL Sever Northwind 예제 데이터베이스에 액세스하고 "SELECT EmployeeID, FirstName, LastName FROM Employees" 문을 실행합니다. 로딩 이벤트의 코드는 다음과 같습니다:
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
데이터베이스 db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper;
사용(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_EMPLOYEES))
{
(IDataReader dataReader = db.ExecuteReader(dbCommandWrapper)) 사용
{
DataGrid1.DataSource = 데이터리더;
DataGrid1.DataBind();
}
}
}
}
사용자가 "주문" 버튼을 클릭하면 데이터베이스의 직원과 일치하고 주문 데이터와 관련된 두 번째 데이터 테이블을 표시하려고 합니다. 이를 수행하는 한 가지 방법은 동적 SQL을 생성하고 WHERE 문에 필요한 모든 EmployeeID의 OR 조건을 사용하는 것입니다.
두 번째 방법은 WHERE 문의 IN 연산을 사용하는 것입니다. IN 연산은 표현식 목록을 비교합니다. 예를 들어, 다음 문은 직원 IDS 7과 4 사이의 정보를 반환합니다.
SELECT EmployeeID, FirstName, LastName FROM Employees WHERE EmployeeID IN (7, 4)
개념적으로 단일 문자열 매개 변수를 사용하여 전달된 ID를 쿼리하고 싶지만 단일 문자열로는 IN 작업 A에 사용할 수 없습니다. 단일 문자열 매개변수. 이 경우 SQL 문은 "WHERE Employee IN ('7, 4')"가 되고 EmployeeID는 varchar가 아닌 int 유형이므로 데이터베이스는 오류 메시지를 반환합니다.
그러나 문자열을 다른 값으로 분리하기 위해 기사에 구성된 분할 함수를 사용합니다. 문자열 '7, 4'를 분할 함수에 전달하면 값 4와 7에 해당하는 두 개의 레코드를 얻게 됩니다. 직원을 선택하고 주문 합계를 계산하는 SQL 쿼리는 다음과 같습니다.
SELECT count(*) AS Orders, E.FirstName, E.LastName
FROM Orders O
INNER JOIN Employees E ON O.EmployeeID = E.EmployeeID
WHERE E.EmployeeID IN(SELECT Value FROM fn_Split(@employeeIDs, ','))
GROUP BY FirstName, LastName
ORDER BY count(*) DESC
위 쿼리를 사용하려면 @employeeIDs 매개 변수를 설정하고 전달해야 합니다. 이 매개변수는 쉼표로 구분된 ID 목록입니다. 이 문자열을 작성하고 사용자가 행을 선택했는지 확인하려면 행 수를 반복하고 각 확인란 컨트롤을 확인하는 루프를 사용해야 합니다. 사용자가 행을 선택하면 테이블의 DataKeys 속성(EmployeeID 필드를 가리키도록 ASPX 파일에서 생성됨)에서 검사관을 추출하여 키가 직원에 저장됩니다.
개인 문자열 GetCheckedEmployeeIDs()
{
문자열 구분 기호 = String.Empty;
StringBuilder EmployeeIDs = new StringBuilder();
for(int i = 0; i < DataGrid1.Items.Count; i++)
{
체크박스 체크박스;
checkbox = DataGrid1.Items[i].FindControl("EmployeeCheckBox") as CheckBox;
if(체크박스 != null && 체크박스.체크됨 == true)
{
EmployeeIDs.Append(구분자 + DataGrid1.DataKeys[i].ToString());
구분자 = ",";
}
}
return EmployeeIDs.ToString();
}
위 메소드는 "10, 7, 20"과 같은 문자열을 반환합니다. Orders 버튼 클릭 이벤트 핸들러에는 SQL에 정보를 전달하여 직원 및 주문 목록을 가져오고 결과를 두 번째 DataGrid 개체에 바인딩하는 메서드가 포함됩니다.
개인 무효 Orders_Click(개체 보낸 사람, System.EventArgs e)
{
문자열 EmployeeIDs = GetCheckedEmployeeIDs();
데이터베이스 db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper;
사용(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_ORDERS))
{
dbCommandWrapper.AddInParameter("@employeeIDs", DbType.String, EmployeeIDs);
(IDataReader dataReader = db.ExecuteReader(dbCommandWrapper)) 사용
{
DataGrid2.DataSource = 데이터리더;
DataGrid2.DataBind();
}
}
}