การควบคุมแหล่งข้อมูลคือการควบคุมเซิร์ฟเวอร์ชนิดใหม่ที่นำมาใช้ใน Microsoft Visual Studio 2005 ซึ่งเป็นส่วนสำคัญของสถาปัตยกรรมการผูกข้อมูล และสามารถจัดเตรียมโมเดลการเขียนโปรแกรมที่เปิดเผยและลักษณะการทำงานการผูกข้อมูลอัตโนมัติผ่านการควบคุมการผูกข้อมูล บทความนี้และบทความต่อๆ ไปในชุดนี้จะแนะนำองค์ประกอบหลักของการนำการควบคุมแหล่งข้อมูลไปใช้
บทนำ กล่าว
โดยสรุป ตัวควบคุมแหล่งข้อมูลจะสรุปที่เก็บข้อมูลและการดำเนินการบางอย่างที่สามารถดำเนินการกับข้อมูลที่มีอยู่ได้ การควบคุม DataBound เชื่อมโยงกับการควบคุมแหล่งข้อมูลผ่านคุณสมบัติ DataSourceID ที่เก็บข้อมูลแบบดั้งเดิมส่วนใหญ่เป็นแบบตารางหรือแบบลำดับชั้น และการควบคุมแหล่งข้อมูลจะถูกแบ่งตามนั้น สิ่งที่เราต้องการแนะนำที่นี่คือการควบคุมแหล่งข้อมูลในรูปแบบตาราง
การควบคุมแหล่งข้อมูลนั้นไม่ได้ทำอะไรมากนัก ตรรกะทั้งหมดถูกห่อหุ้มไว้ในคลาสที่ได้รับมาจาก DataSourceView DataSourceView อย่างน้อยหนึ่งรายการต้องใช้ฟังก์ชันการดึงข้อมูล (นั่นคือ การเลือก) ชุดแถว มันสามารถให้ฟังก์ชั่นการแก้ไขข้อมูล (เช่น INSERT, UPDATE และ DELETE) (เป็นทางเลือก) การควบคุมที่ถูกผูกไว้กับข้อมูลสามารถตรวจสอบชุดคุณลักษณะที่เปิดใช้งานผ่านคุณสมบัติ Can??? ต่างๆ ตัวควบคุมแหล่งข้อมูลนั้นเป็นเพียงคอนเทนเนอร์สำหรับมุมมองที่มีชื่อไม่ซ้ำกันอย่างน้อยหนึ่งรายการ ตามแบบแผน มุมมองเริ่มต้นสามารถเข้าถึงได้ตามชื่อ หรืออาจเป็นว่างเปล่าก็ได้ ความสัมพันธ์ระหว่างมุมมองที่แตกต่างกันหรือแบบใดสามารถกำหนดได้อย่างเหมาะสมตามการใช้งานการควบคุมแหล่งข้อมูลแต่ละรายการ ตัวอย่างเช่น การควบคุมแหล่งข้อมูลอาจมีมุมมองที่กรองต่างกันของข้อมูลเดียวกันผ่านมุมมองที่ต่างกัน หรืออาจจัดเตรียมชุดของแถวย่อยในมุมมองรอง คุณสามารถใช้คุณสมบัติ DataMember ของตัวควบคุมที่ผูกกับข้อมูลเพื่อเลือกมุมมองเฉพาะ (หากตัวควบคุมแหล่งข้อมูลมีหลายมุมมอง) โปรดทราบว่าขณะนี้ไม่มีการควบคุมแหล่งข้อมูลในตัวใน Whidbey ที่นำเสนอหลายมุมมอง
สุดท้ายนี้ ผมขอแนะนำเนื้อหาบางส่วน การควบคุมแหล่งข้อมูล (และมุมมอง) ใช้ API สองชุด API ชุดแรกคืออินเทอร์เฟซเชิงนามธรรมที่กำหนดไว้สำหรับการดำเนินการกับข้อมูลทั่วไปสี่รายการ ซึ่งสามารถใช้งานได้ตามปกติจากการควบคุมที่ผูกกับข้อมูล กลุ่มที่สองเป็นทางเลือก ซึ่งกำหนดในแง่ของโดเมนหรือที่เก็บข้อมูลที่กลุ่มนั้นเป็นตัวแทน โดยปกติแล้วจะพิมพ์อย่างเข้มงวด และมีไว้สำหรับนักพัฒนาแอปพลิเคชัน
ตัวอย่าง
ในบทความเหล่านี้ คุณจะใช้ WeatherDataSource ที่จะทำงานกับ REST (ภาษาอังกฤษ) XML API ที่จัดทำโดย weather.com (ภาษาอังกฤษ) เพื่อดึงข้อมูลสภาพอากาศตามรหัสไปรษณีย์ โดยปกติแล้วการควบคุมแหล่งข้อมูลที่ได้รับมาจะถูกนำไปใช้ก่อน
WeatherDataSource ระดับสาธารณะ: DataSourceControl {
สตริงแบบอ่านอย่างเดียวแบบคงที่สาธารณะ
CurrentConditionsViewName = "CurrentConditions";
_currentConditionsView
;
รับ {
ถ้า (_currentConditionsView == null) {
_currentConditionsView = WeatherDataSourceView ใหม่ (นี่คือ CurrentConditionsViewName);
-
กลับ _currentConditionsView;
-
}
สตริงสาธารณะ ZipCode {
รับ {
string s = (string)ViewState["รหัสไปรษณีย์"];
กลับ (s != null) ? s : String.Empty;
-
ชุด {
ถ้า (String.Compare (ค่า, ZipCode,
StringComparison.Ordinal) != 0) {
ViewState["ZipCode"] = ค่า;
CurrentConditionsView.RaiseChangedEvent();
-
-
}
การป้องกันแทนที่ DataSourceView GetView (string viewName) {
ถ้า (String.IsNullOrEmpty (viewName) ||
(String.Compare (viewName, CurrentConditionsViewName,
StringComparison.OrdinalIgnoreCase) == 0)) {
กลับ CurrentConditionsView;
-
โยน ArgumentOutOfRangeException ใหม่ ("viewName");
}
ป้องกันแทนที่ ICollection GetViewNames() {
กลับสตริงใหม่ [] { CurrentConditionsViewName };
} }
สภาพอากาศสาธารณะ GetWeather() {
กลับ CurrentConditionView.GetWeather();
-
}
อย่างที่คุณเห็น แนวคิดพื้นฐานคือการใช้ GetView เพื่อส่งคืนอินสแตนซ์มุมมองที่มีชื่อ และ GetViewNames เพื่อส่งคืนชุดของมุมมองที่มีอยู่
ที่นี่เลือกมาจาก DataSourceControl สิ่งหนึ่งที่ไม่ใช่เรื่องง่ายที่จะสังเกตเห็นก็คือ ตัวควบคุมที่ผูกกับข้อมูลนั้นค้นหาอินเทอร์เฟซ IDataSource จริง ๆ และตัวควบคุมแหล่งข้อมูลจะใช้อินเทอร์เฟซโดยใช้ GetView และ GetViewNames เหตุผลที่จำเป็นต้องใช้อินเทอร์เฟซคือการเปิดใช้งานการควบคุมแหล่งข้อมูลให้เป็นทั้งแบบตารางและแบบลำดับชั้น (หากเป็นไปได้ ซึ่งในกรณีนี้จะสืบทอดมาจากโมเดลหลักและใช้โมเดลอื่นเป็นอินเทอร์เฟซ) ประการที่สอง ยังอนุญาตให้แปลงการควบคุมอื่นๆ ในสถานการณ์ต่างๆ เพื่อเพิ่มความจุของแหล่งข้อมูลเป็นสองเท่า นอกจากนี้ให้สังเกตคุณสมบัติ ZipCode สาธารณะและวิธีการ GetWeather ที่ส่งคืนวัตถุ Weather ที่พิมพ์อย่างยิ่ง API นี้เหมาะสำหรับผู้พัฒนาเพจ นักพัฒนาเพจไม่จำเป็นต้องคิดถึง DataSourceControl และ DataSourceView
ขั้นตอนต่อไปคือการนำมุมมองแหล่งข้อมูลไปใช้ ตัวอย่างนี้มีเฉพาะฟังก์ชันการทำงานระดับ SELECT เท่านั้น (ซึ่งเป็นข้อกำหนดขั้นต่ำและเป็นฟังก์ชันเดียวที่มีประโยชน์ในสถานการณ์นี้)
คลาสปิดผนึกส่วนตัว WeatherDataSourceView : DataSourceView {
WeatherDataSource ส่วนตัว _owner;
WeatherDataSourceView สาธารณะ (เจ้าของ WeatherDataSource, สตริง viewName)
: ฐาน (เจ้าของ viewName) {
_owner = เจ้าของ;
}
ป้องกันแทนที่ IEnumerable ExecuteSelect(
อาร์กิวเมนต์ DataSourceSelectArguments) {
อาร์กิวเมนต์ RaiseUnsupportedCapabilitiesError (สิ่งนี้);
สภาพอากาศ weatherObject = GetWeather ();
คืนสภาพอากาศใหม่ [] { weatherObject };
} }
สภาพอากาศภายใน GetWeather() {
สตริง zipCode = _owner.ZipCode;
ถ้า (zipCode.Length == 0) {
โยน InvalidOperationException(); ใหม่
}
WeatherService weatherService = WeatherService ใหม่ (รหัสไปรษณีย์);
กลับ weatherService.GetWeather();
}
โมฆะภายใน RaiseChangedEvent() {
OnDataSourceViewChanged (EventArgs.Empty);
-
}
ตามค่าเริ่มต้น คลาส DataSourceView ส่งคืนค่าเท็จจากคุณสมบัติ เช่น CanUpdate และพ่น NotSupportedException จากการอัปเดตและวิธีการที่เกี่ยวข้อง สิ่งเดียวที่คุณต้องทำที่นี่ใน WeatherDataSourceView คือการแทนที่เมธอด ExecuteSelect แบบนามธรรม และส่งคืน IEnumerable ที่มีข้อมูลสภาพอากาศ "ที่เลือก" ในการนำไปใช้งาน จะใช้คลาสตัวช่วย WeatherService ซึ่งใช้ออบเจ็กต์ WebRequest เพื่อสอบถาม weather.com (เป็นภาษาอังกฤษ) โดยใช้รหัสไปรษณีย์ที่เลือก (ไม่มีอะไรพิเศษเกี่ยวกับเรื่องนั้น)
คุณอาจสังเกตเห็นว่า ExecuteSelect ถูกทำเครื่องหมายว่าได้รับการป้องกัน สิ่งที่ตัวควบคุมที่ถูกผูกไว้กับข้อมูลเรียกจริง ๆ แล้วคือวิธีเลือกสาธารณะ (และปิดผนึก) ที่ส่งผ่านในการเรียกกลับ การใช้งาน Select โทร ExecuteSelect และโทรกลับด้วยอินสแตนซ์ IEnumerable ที่เป็นผลลัพธ์ รูปแบบนี้แปลกมาก มีเหตุผลสำหรับเรื่องนี้ ซึ่งจะอธิบายไว้ในบทความต่อๆ ไปในชุดนี้ โปรดรอสักครู่...
นี่คือตัวอย่างการใช้งานนี้:
รหัสไปรษณีย์: <asp:TextBox runat="server" id="zipCodeTextBox" />
<asp:Button runat="server" onclick="OnLookupButtonClick" Text="Look" />
< ชม /
<asp:FormView runat = "เซิร์ฟเวอร์" DataSourceID = "weatherDS" >
<เทมเพลตรายการ>
<asp:ป้ายกำกับ runat = "เซิร์ฟเวอร์"
Text='<%# Eval("อุณหภูมิ", "อุณหภูมิปัจจุบันคือ {0}.") %><' />
</เทมเพลตรายการ">
</asp:FormView><
<nk:WeatherDataSource runat="server" id="weatherDS" ZipCode="98052" />
<สคริปต์ runat="server">
โมฆะส่วนตัว OnLookupButtonClick (ผู้ส่งวัตถุ EventArgs e) {
weatherDS.ZipCode = zipCodeTextBox.Text.Trim();
-
</script>
รหัสนี้ตั้งค่ารหัสไปรษณีย์เพื่อตอบสนองต่อการป้อนข้อมูลของผู้ใช้ ซึ่งทำให้แหล่งข้อมูลออกการแจ้งเตือนการเปลี่ยนแปลง ทำให้ตัวควบคุม FormView ที่ถูกผูกไว้ดำเนินการผูกข้อมูลและเปลี่ยนการแสดงผล
ขณะนี้ รหัสการเข้าถึงข้อมูลถูกห่อหุ้มไว้ในการควบคุมแหล่งข้อมูล นอกจากนี้ โมเดลนี้ยังช่วยให้ weather.com (เป็นภาษาอังกฤษ) สามารถเผยแพร่ส่วนประกอบที่สามารถสรุปรายละเอียดเฉพาะของบริการได้ด้วย หวังว่ามันจะได้ผล นอกจากนี้ อินเทอร์เฟซแหล่งข้อมูลเชิงนามธรรมยังช่วยให้ FormView ทำงานกับข้อมูลสภาพอากาศเท่านั้น
ในบทความถัดไป คุณจะปรับปรุงการควบคุมแหล่งข้อมูลเพื่อจัดการการเปลี่ยนแปลงค่าตัวกรอง (นั่นคือ รหัสไปรษณีย์) ที่ใช้ในการสอบถามข้อมูลโดยอัตโนมัติ