แสดงบทความที่มีป้ายกำกับ Take Notes Sql แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ Take Notes Sql แสดงบทความทั้งหมด

วันอาทิตย์ที่ 13 มกราคม พ.ศ. 2551

การใช้ Parameter คู่กับ Dataset จะเขียนยังไงดีครับ

การใช้ Parameter คู่กับ Dataset จะเขียนยังไงดีครับ

คือ ปรกติผมใช้ parameter กับ พวก .ExecuteNonquery หรือไม่ก็ .ExecuteReader น่ะครับ แต่ทีนี้ว่ามีปัญหาคือ
Function ในการ Query ข้อมูลนั้น เป็นการ return ค่าออกมาเป็น Dataset ซึ่งผมไม่รู้ว่าจะวาง parameter ยังไงให้ ตรง query Dataset รู้จักค่า Parameter ด้วย
ยกตัวอย่างการเขียนนะครับ
Dim dr As SqlDataReader

Try

checkOpen() << เกี่ยวกับเปิดปิดการ Connect

Dim sql As String = " select * From MyTable Where id = @id And Name Like @Name "

Dim cmd As New SqlCommand(sql, cn)

cmd.Parameters.Add("@id", SqlDbType.DateTime).Value = sdate

cmd.Parameters.Add("@Name", SqlDbType.DateTime).Value = edate

dr = cmd.ExecuteReader

dr.Read()

If dr.HasRows = True Then

cmd.Dispose()

dr.Close()

Dim da As New SqlDataAdapter(sql, cn)

Dim ds As New DataSet

da.Fill(ds, "Test")

da.Dispose()

Return ds <<< คืนค่าออกไป

Else

cmd.Dispose()

dr.Close()

End If

Catch ex As Exception

MsgBox(ex.Message & " จาก Function Test, TestClass")

Finally

cn.Dispose()

End Try

คือ ถ้าเขียนแบบนี้ ตัว SqlDataAdapter มันจะไม่รู้จัก ตัว Parameter น่ะครับ

ไม่ทราบว่ามันสามารถเขียนได้หรือไม่ครับ

ขอบคุณมากครับ
MrSuthin วันที่ส่ง: 3 ม.ค. 50 18:43 GMT+7 วันที่ปรับล่าสุด: 3 ม.ค. 50 19:50 GMT+7
REPLY #1 (32444)
คุณ MrSuthin ยังใช้วิธีการเขียนแบบ Visual Studio 2003 (.NET 1.1) อยู่นะครับ
ยังไม่ใช้ .NET 2 หรือครับ
ใน DataAdapter จะมีอ๊อบเจ็กต์ Command ของมันเองอยู่สี่ตัว
กรณีนี้เรากำลังจะสนใจเฉพาะ SelectCommand ผมแนะนำโค้ดให้นิดหน่อย
คุณสุทินก็คงเขียนต่อเองได้แล้วมั้งครับ
Dim sql As String = "SELECT ... WHERE col1 = @para1;"
Dim ds As New DataSet
' ...
Using da As New SqlDataAdapter(sql, cn)
Dim cmd As SqlCommand = da.SelectCommand
cmd.Parameters.Add("@para1", SqlDbType.XYZ).Value = yourValue
' ---- เมื่อเราสั่ง Fill, DataAdapter จะเอา SelectCommand ของมันไป ExecuteReader
' ---- เพื่อนำข้อมูลที่ได้จาก DataReader มา "Fill" ใส่ DataSet/DataTable ที่เรากำหนด
da.Fill(ds, "Table1")
End Using
' ...
Return(ds)

surrealist

ขอขอบคุณ อาจารย์ครับ

Datarelation กับ Dataset Read Xml

DataRelation เอา 2 Dataset มา Relation กัน โดย มันจะต้องอยู่ใน dataset ตัวเดียวกัน
'--- อันนี้เป็นการทำ Relation กับตัวมันเอง 1 Talbe ( ทำมาไมวะตู - -" )

Dim cnString As String = "Bla Bla Bla ::: OpenConnection Database"

Dim cn As New SqlConnection

With cn

If .State = ConnectionState.Open Then .Close()

cn.ConnectionString = cnString

.Open()

End With

Dim sql As String = " select top 500 "

sql &= " Ta.idTableAccount , Ta.InvNo , Ta.Amount ,"

sql &= " Ta.Volume,"

'---- Consignee "

sql &= " Cn.TitleConsignee "

sql &= " From TableAccount Ta "

sql &= " Inner Join Consignee Cn On Ta.Consignee = Cn.idConsignee "

Dim da As New SqlDataAdapter(Sql, cn)

Dim ds As New DataSet

da.Fill(ds, "ShowAllTableAccount")

Dim sqlSub As String = " select top 500 "

sqlSub &= " Tat.idTableAccount , "

sqlSub &= " Tat.Sendto , Tat.SendInv , Tat.Voy , "

sqlSub &= " Tat.etd, Tat.kaset , Tat.eu , "

sqlSub &= " Tat.isCancel,"

'---- Consignee & Country

sqlSub &= " Vs.NameVessel , de.country "

sqlSub &= " From TableAccount Tat "

sqlSub &= " inner join TableAccount TaSub On Tat.idTableAccount = TaSub.idTableAccount "

sqlSub &= " Inner Join Destination De On Tat.Country = De.idDestination "

sqlSub &= " Left Join Vessel Vs On Tat.Vessel = Vs.idVessel"

' da.SelectCommand.CommandText = sqlSub

Dim da1 As New SqlDataAdapter(sqlSub, cn)

' Dim ds1 As New DataSet

da1.Fill(ds, "ShowAllTableAccountSub")

Dim dcMaster, dcDetails As DataColumn

'--- อ่าน Field idTableAccountเก็บไว้ใน dcMaster

dcMaster = ds.Tables("ShowAllTableAccount").Columns("idTableAccount")

'--- อ่าน Field idTableAccountเก็บไว้ใน dcDetails

dcDetails = ds.Tables("ShowAllTableAccountSub").Columns("idTableAccount")

'--- สร้างความสัมพันธ์ และใส่ค่าไว้ที่ dl

Dim dl As New DataRelation("Details", dcMaster, dcDetails)

ds.Relations.Add(dl)

Dim dvm As New DataViewManager

dvm.DataSet = ds

Dim dvs As DataViewSetting

dvs = dvm.DataViewSettings("ShowAllTableAccount")

dvs.Sort = "idTableAccount"

dvs = dvm.DataViewSettings("ShowAllTableAccountSub")

dvs.Sort = "Consignee"

With FvAccount.dgvAcc

.ReadOnly = True

.DataSource = dvm

.DataMember = "ShowAllTableAccount"

End With

With FvAccount.subDgvAcc

.ReadOnly = True

.DataSource = dvm

.DataMember = "ShowAllTableAccount.idTableAccount"

End With

จะสังเกตุได้ว่า เรา Dim New DataAdpter และ Dataset แค่ครั้งแรกครั้งเดียว ส่วนครั้งที่สองนั้น เราสามารถใช้

DataAdapter ตัวเดิมได้ แล้ว จะต้องใช้ Dataset ตัวเดิม ห้าม Dim New เพราะใช้แล้ว Error ว่ามันไม่สามารถทำ

Relation กับตัว Dataset ที่ต่างกันได้ ( แปลมาว่างี้ )

ต่อมา มาเรื่องของ Ds.ReadXml เวลา Export File จากไหนๆก็ตาม ยกตัวอย่างจาก Access

Export File ออกมาแบบธรรมดาไม่ต้องเอา Schema ( จะมี Option ขั้นสูงฝัง Schema มากับ Data เลย )

เพราะถ้าฝังมาด้วย มันจะทำให้ ds.ReadXml อ่านไม่ได้

พออ่านได้เราก็เอา ds.ReadXml("d:/Test.xml") << หรือรับค่ามาจาก OpenFileDialogbox ก็ได้

แล้วก็ไป Binding ใส่ Control ต่างๆได้ ต่อ ไป การอ้างถึงก็คือ

Ds.Tables("ชื่อTable")

ข้อควรจำในการ Export File มาเป็น Dataset

**** ถ้ามี Column ตรงกับชื่อ Table มันจะทำให้การอ่านค่าผิดพลาด จะต้องไม่ให้ ชื่อ Column ไม่ซ้ำกับชื่อของ Table เด็ดขาด !!

Note กันลืม

1. การเชื่อมฟิลด์ ใช้เครื่องหมาย +''+ ฟิลด์ที่ต้องการเชื่อมแล้วตามด้วย as Alias
- select name+''+Lastname As YourName , tel from [User]
2. การทำ Splash Screen แบบ Transparent บนพื้นวินโดวส์ ควรทำบน Panel เพราะถ้าทำบนฟอร์มเลย bg จะไม่หาย
แม้จะเซ็ต TransparentKey แล้วก็ตาม
3. การเข้าถึง Object ซึ่งแม้ว่าจะมีบางฟอร์มส่ง ค่า me มาให้มันแล้วก็ตามหากเรา Dim New จากฟอร์มอื่น
และใน function ที่เราต้องการใช้มีการอ้างถึงฟอร์มอื่นด้วย ต้องส่งชื่อฟอร์มอื่นให้มันด้วย เพราะว่ามันเป็ฯคนละ obj กัน
4. ในการแสดงผลของ Icon หากเป็น Mdi ฟอร์ม จะมีปัญหาคือเปิดครั้งแรก ภาพ Icon จะแสดงรูปไม่ถูกต้อง
ต้องไปใส่ ตอน Run Time ของ Event Load โดย Add ภาพเข้าไปใน Resource ก่อน
'--- Form Load
Me.Icon = My.Resource.IconName
5. กด ปุ่ม enter แล้วเลื่อน focus ไปที่ control ในฟอร์มแทนปุ่ม tab โดยการเซ็ต Form ให้ KeyPreview = True ก่อนแล้ว
ไปทำ Event KeyDown
If e.KeyCode = Keys.Enter Then SendKeys.Send("{TAB}") End If
กับ อีกวิธีนึง โดยใช้ Form.GetNextControl ใช้กับ KeyCode เหมือนเดิม
If (e.KeyCode = Keys.Enter) Then Dim ctl As Control Do ctl = Me.GetNextControl(Me.ActiveControl, forward:=True) Loop Until (ctl.CanFocus) ctl.Focus() e.Handled = True '---- ไม่มีการส่งค่า e ไปที่ไหนอีก เพื่อจบการทำงาน End If 6. การจับ Event KeyPress
if (IsNumeric(e.KeyChar)) OrElse (e.KeyChar = Chr(8)) Then Else e.Handled = True
End If
End Sub
ขอบคุณ
อาจารย์ สุเทพ http://www.greatfriends.biz

ทำความเข้าใจ sql กันสักหน่อย ( โง่มานาน )

หลังจากเอา Sql 2005 Express มาลง ( ทันสมัยแร้วว ) ก้ไปสร้าง Table พอมาถึง Type ของ ข้อมูล ก็นึกสงสัย ( จริงเคยอ่านเจอมาแล้ว แต่ลืมไปหมดแล้ว ) ความแตกต่างระหว่าง Char กับ NChar , Varchar กับ NVarchar ( ไม่มี N กับ มี N ) ก็ไปหาข้อมูลในเน็ต แล้วก็ไปถามพี่ที่เป็นเจ้าของเว็บ http://www.thaisql.com ( ขอบคุณมากครับ ) a ได้ใจความมาว่า Char , Varchar คือการเก็บเป็นตัวอักษร NChar , NVarchar คือการเก็บเป็น Unicode และใช้ 2 Byte ในการเก็บค่า www.thaisql.com said: N แปลว่าใช้ 2Byte เก็บค่านะครับ ปกติจะใช้ 1 Byte 1 ตัวอักษร แต่ถ้า N นำหน้าใช้ 2 Byte 1 ตัวอักษร ก็จะเป็นพวก ภาษาแปลกเช่น เยอรมัน นะครับ บ.ผมต้องเก็บเยอรมัน ผมเลยต้องใช้ N ช่วยนะครับ แต่โดยทั่วไป แค่ไทย กับ อังกฤษ ไม่ใช้ N ก็ได้สบายเลยนะครับ แต่เวลาค้นหาข้อมูลก็ต้อใช้ N นำหน้าด้วยนะครับ select * from firstname = N'xxx' Unicode ในปัจจุบันมีตัวอักษรให้เลือกใช้อยู่หลายแบบ มี Character set อยู่มากมาย เช่น ตัวอักษรภาษาไทย, ตัวอักษรภาษาญี่ปุ่น ฯลฯ ในอดีตเวลาที่เรา Encode ภาษา ถ้าเป็น ASCII ขนาด 1 byte จะมี 8 bit ซึ่ง ASCII code ก็คือพวกที่เก็บตัวอักษรภาษาอังกฤษตัวเล็ก, ตัวใหญ่, ตัวเลข, เครื่องหมายมากกว่า, น้อยกว่า, ไม่เท่ากับ, full stop, # เป็นต้น ใช้พื้นที่แค่ 7 bit ก็สามารถ Encode ข้อมูลของได้ครบแล้ว ส่วน bit ที่ 8 นี่ก็ใส่ 0 ลงไป แต่ในประเทศที่ไม่ได้ใช้ตัวอักษรภาษาอังกฤษในการเขียน ก็อยากจะมีรหัสในการเขียนตัวอักษรเป็นของตัวเองเหมือนกัน ดังนั้นแล้วในการแก้ปัญหา ก็คือ จะเอา bit ที่ 8 มาใช้ เช่น ตั้ง bit ที่ 8 เป็น 1 แล้วก็ Encode ข้างในด้วยรหัสของตัวเอง แต่ต้องเป็นรหัสที่ ASCII code ยังไม่ได้ใช้ เช่น 1000011 เป็น ‘ก’, 1000012 เป็น ‘ข’, 1000013 เป็น ‘ค’ เป็นต้น วิธีการเช่นนี้ทำให้เราสามารถเก็บได้ 2 ภาษา แต่ว่าการทำแบบนี้ไม่ international เพราะว่า ภาษาจีนหรือภาษาญี่ปุ่นก็ใช้แบบเดียวกัน ก็เอา bit ที่ 8 มาใช้ เพราะฉะนั้นแล้ว ตัว ‘ก’ ของภาษาไทยก็จะไปมีรหัสเหมือนกับตัวอะไรซักอย่างในภาษาจีน ดังนั้นก็เลยมีปัญหาว่าถ้าเราต้องการทำ international business จริงๆ ควรจะมีรหัสเดียวสำหรับอักษรตัวเดียว และในแต่ละภาษาก็ไม่ควรมีรหัสซ้ำกัน ดังนั้นเราก็เลยมี Unicode ขึ้นมา Unicode ต่างจาก ASCII คือ ASCII เก็บ byte เดียว แต่ Unicode เก็บ 2 byte ซึ่งข้อมูล 2 byte เก็บข้อมูลได้มากมายมหาศาล สามารถเก็บข้อมูลได้มากมายหลายภาษาในโลก อย่างภาษาไทยก็อยู่ใน Unicode นี้ด้วยเหมือนกัน ดังนั้นรหัสภาษาไทยเอาไปเปิดในภาษาจีน ก็ยังเป็นภาษาไทยอยู่ ไม่ออกมาเป็นภาษาจีน เพราะว่ามี code ตายตัวอยู่ว่า code นี้จองไว้สำหรับภาษาไทย แล้ว code ตรงช่วงนี้เป็นภาษาจีน ตรงนี้เป็นภาษาญี่ปุ่น จะไม่ใช้ที่ซ้ำกัน เป็นต้น ส่วน Unicode เป็นชุดอักษรที่ใช้ได้สำหรับทุกภาษาในโลก ซึ่งจะเป็นระบบ 1 อักษรใช้หลาย byte ถ้าใช้ Unicode ที่เข้ารหัสแบบ UTF-8 ภาษาไทยจะใช้ 3 byte ครับ Many Thanks : www.thaisql.com for Instruction http://www.expert2you.com/article1/2888/index.htm?page_no=1 for Unicode