<TableAdapter>เพิ่มความสามารถของ Table Adapter ด้วย Partial Class (2)
จากบทความที่แล้วเราได้ลองสร้าง Partial Class สำหรับ Table Adapter โดยลองสร้าง Method สำหรับคืนค่า ReturnValue ของ DbCommand สำหรับบทความนี้เราจะมาทดลองอย่างอื่นต่อกันครับ
เพื่อการทดลองผมจะสร้าง Command สำหรับ Insert Customer ลงฐานข้อมูล Northwind (ทั้งๆที่บทความที่แล้วอุตสาห์เลี่ยงแล้ว แต่ก็หนีไม่พ้น) ก่อนอื่นก็สร้าง Command กันก่อนครับ โดยในหน้า Dataset Designer เราคลิ๊ก Add Query แล้วก็เลือก Creat New Stored Procedure แล้วก็คลิ๊กไปเรื่อยๆ มันจะสร้าง SQL Script ให้เราและไปสร้าง Stored Procedure ให้เราอัตโนมัติ (แหม มันเยี่ยมจริงๆ ปกติผมก็ให้มันสร้าง Stored Procedure อัตโนมัติก่อน แล้วต้องการอะไรเพิ่มค่อยไป ALTER มันทีหลัง สะดวกดีครับ)
เอาละครับ เราได้ Command ใหม่มาแล้ว ชื่อ InsertCustomer ครับ จากนั้นก็มาลองเขียนโค้ดเรียกใช้ Command ตัวนี้ดูครับ
Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles btnSave.Click Try Using ta As CustomersTableAdapter = New CustomersTableAdapter ta.InsertCustomer( "999", "ABC", "JNITHI", "MR", "XX", "YY", "ZZ", _ "10120", "THAILAND", "1111", "2222") End Using Page.ClientScript.RegisterStartupScript(Page.GetType, _ "Finish", "alert('OK');", True) Catch exDB As SqlException Page.ClientScript.RegisterStartupScript(Page.GetType, _ "SQLEx", "alert('Database Error');", True) Catch ex As Exception Page.ClientScript.RegisterStartupScript(Page.GetType, _ "Error", "alert('Error');", True) End Try End Sub
โอเค ลองรันดูแล้วผ่านฉลุยใช้ได้ครับ แต่มันขัดใจอยู่หน่อยตรงที่มันให้ใส่ค่าเข้าไปตรงๆ หลายๆคนอาจกลัวว่าแล้วสมมติเจอปัญหาอย่างเช่นในชื่อมี ' หรือ " ทำไง หรือว่าเจอ SQL Injection ล่ะ จริงๆก็ไม่มีปัญหาเพราะว่าใน Command เราเรียกใช้ Stored Procedure และก็มีการใช้ parameter อยู่แล้ว จะมีปัญหาก็แค่ตัว " ที่ต้องใส่ "" (คือใส่ " สองตัวติดกัน) แทนครับ อย่างไรก็ตามการใส่ข้อมูลเข้าไปตรงๆมันก็ดูไม่งามนัก ถ้าอย่างนั้นเราจะมาสร้าง Overloads Function เพื่อใช้งานแทนดีกว่า ก็มาที่ Auto gen file เหมือนเดิมครับ ไล่ดูจนเจอ Public Overloads Overridable Function InsertCustomer(ByVal CustomerID As String, ByVal CompanyName As String, ByVal ContactName As String, ByVal ContactTitle As String, ByVal Address As String, ByVal City As String, ByVal _Region As String, ByVal PostalCode As String, ByVal Country As String, ByVal Phone As String, ByVal Fax As String) As Integer
จะเห็นว่าตอนนี้มันเป็น Public Overloads Overridable Function อยู่ ถ้าเราทิ้งไว้แบบนี้ก็ได้ครับ แล้วไปสร้าง Public Overloads Overridable Function InsertCustomer อีกตัวหนึ่งใน Partial Class ที่เราสร้างขึ้น โดยให้รับ parameter เป็น ParamenterCollection ก็ได้ ถ้าทำแบบนี้ใน TableAdapter ก็จะมี Method ที่ชื่อ InsertCustomer ที่มี 2 overloads คือรับ parameter ได้ 2 แบบ
แต่ถ้าเราไม่อยากให้ Function ตัวแรกโชว์ละ เราก็ไปกำหนด Modifier ของ Function ไม่ให้เป็น Public ซะก็ใช้ได้ครับ กำหนดที่ไหนมาดูกันครับ
จะเห็นว่าที่ Properties ของ Command (หรือ Query) นั้นๆจะมี Modifer อยู่ครับ ซึ่งมีตัวเลือก 6 ตัว เมื่อเราเลือก Modifier ตรงนี้มันจะไปเปลี่ยน Modifier ของ Function ใน Auto gen ไฟล์ให้ครับ แต่ตัวเลือกในนี้มันชื่อแปลกๆครับ ลองมาดูความหมายกัน Command Modifier | Function Modifier | Private | Private | Public | Public | Assembly | Friends Overloads Overridable | FamilyAndAssembly | Friends Overloads | Family | Protected Overloads Overridable | FamilyOrAssembly | Protected Friends Overloads |
ดังนั้นผมขอเลือก Assembly นะครับ เพื่อที่จะได้ Friends Overloads Overidable Function ลองรันทดสอบดู จากนั้นก็ไปหา Function นี้ใน Auto gen ไฟล์ครับ System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"), _
System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, false)>_ Friend Overloads OverridableFunctionInsertCustomer(ByValCustomerID As String,ByVal CompanyName AsString, ByVal ContactName As String , ByVal ContactTitle As String, ByVal Address As String, ByVal City As String, ByVal _Region As String, ByVal PostalCode As String, ByVal Country As String, ByVal Phone As String, ByVal Fax As String) As Integer
เรียบร้อย ดังนั้นตอนนี้ตัว CustomersTableAdapter จะไม่สามารถเรียกใช้ Method นี้ได้โดยตรงแล้ว ผมก็ไปสร้าง Function ใหม่ที่ Partial Class ที่เราสร้างขึ้นแทนครับ แต่ก่อนอื่นผมอยากให้ TableAdapter ตัวนี้มี property สำหรับเก็บค่าของ dbParameter แล้วใน function ที่เราจะสร้างใหม่เราจะเอาค่าจาก property ไปส่งให้ SqlParameter แทนครับ
Private _customerId As String Private _companyName As String Private _contactName As String Private _contactTitle As String Private _address As String Private _city As String Private _region As String Private _postalCode As String Private _country As String Private _phone As String Private _fax As String
Public Property customerID() As String Get Return _customerId End Get Set(ByVal value As String) _customerId = value End Set End Property
Public Property CompanyName() As String
Get
Return _companyName End Get Set(ByVal value As String) _companyName = value End Set End Property Public Property contactName() As String
Get Return _contactName End Get Set(ByVal value As String) _contactName = value End Set End Property
ผมลองสร้าง property แค่ 3 ตัวก่อนครับ เพราะแค่ 3 ตัวก็เพียงพอสำหรับการทดสอบแล้ว จากนั้นก็สร้าง Overloads Function ขึ้นมาใน dsNorthwind.vb
Public Overloads Function InsertCustomer() As Integer
Return Me.InsertCustomer(_customerId, _companyName, _contactName, _ _contactTitle, _address, _city, _region, _postalCode, _country, _phone, _fax) End Function เสร็จแล้วจะเสร็จแล้วจะลองเรียกใช้ดูครับ กลับไปที่หน้า page เดิมแล้ว comment โค้ดเก่าไปก่อน แล้วเรียกโค้ดใหม่ดู Using ta As CustomersTableAdapter = New CustomersTableAdapter 'ta.InsertCustomer("990", "A""BC", "J'NITHI", "MR", "XX", "YY", "ZZ", _ '"10120", "THAILAND", "1111", "2222") ta.customerID = "991" ta.companyName = "jnithi O.P." ta.contactName = "jnithi" ta.InsertCustomer() End Using ตอนเราเขียนโค้ด ta.InsertCustomer จะเห็นว่ามีแค่ overloads เดียวให้เลือก และ parameter เดิมที่เคยต้องใส่ก็หายไปแล้วครับ เพราะตอนนี้เราจะใช้ได้เฉพาะคำสั่ง InserCustomerที่เราเขียนใหม่ได้เท่านั้น โดยคำสั่งนี้จะไปเรียกคำสั่ง InsertCustomer เดิม โดยมันส่ง parameter ไปให้เราแทน ลองรันดู ผ่านฉลุยเรียบร้อยครับ
Create Date : 03 มีนาคม 2551 |
Last Update : 5 มีนาคม 2551 1:05:42 น. |
|
0 comments
|
Counter : 938 Pageviews. |
|
|