บทความนี้จะสร้าง DataGrid ที่มีตัวควบคุมกล่องกาเครื่องหมาย การควบคุมนี้ช่วยให้ผู้ใช้สามารถเลือกหลายคอลัมน์สำหรับการเรียกดูโดยละเอียด หากไม่มีวิธีในการกู้คืนฟังก์ชันนี้สำหรับ SQL แบบไดนามิก จะต้องใช้การดำเนินการ IN
ในตอนท้ายของบทความ เราได้เขียนฟังก์ชันที่ผู้ใช้กำหนด (UDF) ของ SQL Server เพื่อแยกสตริงออกเป็นสตริงย่อยแบบมีตัวคั่น ในบทความนี้ เราจะได้เห็นว่า UDF ดังกล่าวมีประโยชน์อย่างไร เราจะสร้างเว็บฟอร์มที่ผู้ใช้สามารถเลือกบันทึกบางอย่างใน DataGrid โดยเลือกตัวควบคุมช่องทำเครื่องหมาย รายละเอียดของบันทึกที่ตรวจสอบเหล่านี้จะปรากฏใน DataGrid อื่นในแบบฟอร์ม แบบฟอร์มนี้ดูเหมือนภาพด้านล่าง
ด้านล่างนี้คือ ASPX ที่เราใช้ในการสร้างแบบฟอร์ม หมายเหตุ: วิธีใช้ตัวควบคุม TemplateColumn และช่องทำเครื่องหมายเพื่อเพิ่มคอลัมน์ DataGrid นอกจากนี้เรายังใช้คุณสมบัติ DataKeyField ของ DataGrid เพื่อบอกวัตถุว่าฟิลด์ใดในบันทึกฐานข้อมูลจะมีตัวระบุคีย์ของแถวแรก
<form id="Form1" method="post" runat="server">
<asp:DataGrid id="DataGrid1" runat="เซิร์ฟเวอร์"
AutoGenerateColumns = "False" DataKeyField = "EmployeeID">
<คอลัมน์>
<asp:TemplateColumn>
<เทมเพลตรายการ>
<asp:CheckBox runat = "เซิร์ฟเวอร์" ID = "พนักงาน CheckBox" />
</เทมเพลตรายการ>
</asp:TemplateColumn>
<asp:TemplateColumn>
<เทมเพลตรายการ>
<%# DataBinder.Eval(Container.DataItem, "LastName") %>,
<%# DataBinder.Eval(Container.DataItem, "FirstName") %>
</เทมเพลตรายการ>
</asp:TemplateColumn>
</คอลัมน์>
</asp:DataGrid>
<hr>
<asp:Button id="คำสั่งซื้อ" runat="server" Text="ดูคำสั่งซื้อ"></asp:ปุ่ม>
<ชม.>
<asp:DataGrid ID = "DataGrid2" Runat = "เซิร์ฟเวอร์" AutoGenerateColumns = "จริง" />
</form>
เมื่อแบบฟอร์มถูกโหลดและเริ่มต้นแล้ว DataGrid ด้านบนจำเป็นต้องประกอบกัน รหัสนี้ใช้ไลบรารีองค์กรเพื่อเข้าถึงฐานข้อมูลตัวอย่าง SQL Sever Northwind และดำเนินการคำสั่ง "SELECT EmployeeID, FirstName, LastName FROM Employees" รหัสสำหรับเหตุการณ์การโหลดมีดังนี้:
โมฆะส่วนตัว Page_Load (ผู้ส่งวัตถุ System.EventArgs e)
-
ถ้า(!หน้าIsPostBack)
-
ฐานข้อมูล db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper;
ใช้ (dbCommandWrapper = db.GetSqlStringCommandWrapper (SELECT_EMPLOYEES))
-
ใช้ (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
-
DataGrid1.DataSource = dataReader;
DataGrid1.DataBind();
-
-
-
}
เมื่อผู้ใช้คลิกปุ่ม "คำสั่งซื้อ" เราต้องการแสดงตารางข้อมูลที่สองที่ตรงกับข้อมูลในฐานข้อมูลกับพนักงานและเกี่ยวข้องกับข้อมูลคำสั่งซื้อ วิธีหนึ่งในการทำเช่นนี้คือการสร้าง SQL แบบไดนามิกและใช้เงื่อนไข OR ของ EmployeeID ทั้งหมดที่จำเป็นสำหรับคำสั่ง WHERE
วิธีที่สองคือการใช้การดำเนินการ IN ของคำสั่ง WHERE การดำเนินการ 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 เป็นประเภท int - ไม่ใช่ varchar
อย่างไรก็ตาม เราใช้ฟังก์ชันแยกที่สร้างขึ้นในบทความเพื่อแยกสตริงออกเป็นค่าต่างๆ ส่งสตริง '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 พารามิเตอร์นี้จะเป็นรายการรหัสที่คั่นด้วยเครื่องหมายจุลภาค หากต้องการสร้างสตริงนี้ เพื่อดูว่าผู้ใช้เลือกแถวนั้นหรือไม่ เราจำเป็นต้องใช้ลูปที่วนซ้ำตามจำนวนแถวและทำเครื่องหมายที่แต่ละช่องทำเครื่องหมาย หากผู้ใช้เลือกแถว คีย์จะถูกบันทึกในพนักงานโดยแยกผู้ตรวจสอบออกจากคุณสมบัติ DataKeys ของตาราง (ซึ่งสร้างขึ้นในไฟล์ ASPX เพื่อชี้ไปที่ฟิลด์ EmployeeID)
สตริงส่วนตัว GetCheckedEmployeeIDs()
-
ตัวคั่นสตริง = String.Empty;
StringBuilder EmployeeIDs = ใหม่ StringBuilder();
สำหรับ (int i = 0; i < DataGrid1.Items.Count; i++)
-
ช่องทำเครื่องหมายช่องทำเครื่องหมาย;
ช่องทำเครื่องหมาย = DataGrid1.Items[i].FindControl("EmployeeCheckBox") เป็นช่องทำเครื่องหมาย;
ถ้า (ช่องทำเครื่องหมาย != null && ช่องทำเครื่องหมายตรวจสอบ == จริง)
-
EmployeeIDs.Append(ตัวคั่น + DataGrid1.DataKeys[i].ToString());
ตัวคั่น = ",";
-
}
ส่งคืน EmployeeIDs.ToString();
}
วิธีการข้างต้นส่งคืนสตริง เช่น "10, 7, 20" ตัวจัดการเหตุการณ์การคลิกปุ่มคำสั่งซื้อจะเกี่ยวข้องกับวิธีการที่ส่งข้อมูลไปยัง 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 = dataReader;
DataGrid2.DataBind();
-
-
-