โปรแกรมมั่ว พ่อลูกอ่อน
<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.

ชื่อ :
Comment :
  *ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก
 

นายจวบ
Location :
กรุงเทพฯ Thailand

[ดู Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed

ผู้ติดตามบล็อก : 2 คน [?]




โปรแกรมมั่ว พ่อลูกอ่อน
Group Blog
 
<<
มีนาคม 2551
 
 1
2345678
9101112131415
16171819202122
23242526272829
3031 
 
3 มีนาคม 2551
 
All Blogs
 
Friends' blogs
[Add นายจวบ's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.