 |
|
VB.Net สอบถามเกี่ยวกับเรื่อง adpt.Update(ds) to database รบกวนผู้รู้ด้วยครับ |
|
 |
|
|
 |
 |
|
เรื่องมีอยู่ว่า มี dataviewgrid และ Textbox ที่ไว้แก้ไขข้อมูล แล้วกดบันทึก
แต่ แก้ไข Record แรก แล้วบันทึก มันไม่ยอมบันทึกครับ
แต่ ถ้าแก้ไข Record อีก 1 Record (ต่อจากบรรทัดบน) พอกดเซฟ Record นี้ Record บรรทัดบน จะบันทึก แต่ Record ที่กดบันทึกล่าสุดไม่ยอมบันทึกนะครับ
จะเป็นแบบนี้ คือ แก้ไขข้อมูล 10 record จะบันทึก แค่ 1-9 ผมเลยงงว่าทำไม
รบกวนผู้รู้ช่วยตอบด้วยนะครับ ขอบคุณครับ
และผมอยากได้อาจารย์ซักคน คิดค่าใช้จ่ายได้เลยครับ (ไม่ต้องสอน แค่คอยตอบและช่วยผมแก้ปัญหาพอครับ)
เกี่ยวกับ VB.2010 + PostgreSQL
Code
Sub SaveDataProduct()
Try
Dim i As Integer
i = DataGridView1.CurrentRow.Index
DataGridView1.Item(1, i).Value = txtinternalcode.Text
DataGridView1.Item(3, i).Value = txtdescription.Text
DataGridView1.Item(4, i).Value = txtshortdesc.Text
DataGridView1.Item(5, i).Value = txtunit.Text
DataGridView1.Item(6, i).Value = txtgroup1.Text
DataGridView1.Item(10, i).Value = txtvattype.Text
DataGridView1.Item(11, i).Value = (txtproducttype.Text)
DataGridView1.Item(13, i).Value = txtcosttype.Text
'If CheckBox1.Checked = True Then DataGridView1.Item(9, i).Value = 1
'If CheckBox1.Checked = False Then DataGridView1.Item(9, i).Value = 0
adpt.Update(ds)
MsgBox("บันทึกข้อมูลสำเร็จ", MsgBoxStyle.OkOnly, "OK")
Catch ex As Exception
Me.Text = "รายละเอียดสินค้า : บันทึกข้อมูล Error : " & ex.Message
End Try
End Sub
Tag : .NET, PostgreSQL, VBScript, Win (Windows App), VS 2010 (.NET 4.x), Windows
|
|
 |
 |
 |
 |
Date :
2013-10-14 10:23:16 |
By :
idolman |
View :
1749 |
Reply :
50 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
นายเอา ds ไปอัฟเดต
แล้วไหนโค้ดตรงส่วนที่ทำงานอัฟเดตค่าของ ds ล่ะ
เห็นนายอัฟเดตแต่ค่าของ datagridview
|
 |
 |
 |
 |
Date :
2013-10-14 13:55:43 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อาจเป็นเพราะว่า
ตอนที่กด update
row นั้นยังอยู่ใน edit mode (ยังไม่ได้อัพเดท)
หรือปล่าวครับ
|
 |
 |
 |
 |
Date :
2013-10-14 14:22:07 |
By :
fonfire |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
นายอัฟเดตข้อมูลด้วย event ไหนของ datagridview ???
ปล. ถ้าเป็นเรา เราจะแก้ข้อมูลให้เสร็จก่อน
โดยข้อมูลแถวที่แก้จะ hilight เอาไว้ แล้วกดปุ่ม save ทีเดียว
|
 |
 |
 |
 |
Date :
2013-10-14 14:38:54 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ยังไงอะคับ - -''
|
 |
 |
 |
 |
Date :
2013-10-14 14:49:02 |
By :
idolman |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
โค้ดยาวไหม ลองเอามาดูซิ
ใส่ใน vb code ด้วยนะ จะได้อยู่ง่ายๆ
|
 |
 |
 |
 |
Date :
2013-10-14 14:58:11 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองเพิ่ม
msgbox(ds.getchange.rows.count) ---->>> เขียนผิดขออภัย จำได้ว่าคำสั่งประมาณนี้
ก่อน
adpt.Update(ds)
หน่อยสิครับ
แล้วดูว่า ได้จำนวน row เท่ากับที่อยากได้หรือปล่าว
|
 |
 |
 |
 |
Date :
2013-10-14 15:01:42 |
By :
fonfire |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (VB.NET)
Private com1 As New OdbcConnection(con)
Private adpt As New OdbcDataAdapter("SELECT * FROM tbproduct_file", com1)
Private ds As New DataTable
Private cmdBuilder As OdbcCommandBuilder
Private Sub frmProductDescription_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
GenGridView()
cmdBuilder = New OdbcCommandBuilder(adpt)
adpt.InsertCommand = cmdBuilder.GetInsertCommand
adpt.UpdateCommand = cmdBuilder.GetUpdateCommand
adpt.DeleteCommand = cmdBuilder.GetDeleteCommand
adpt.Fill(ds)
DataGridView1.DataSource = ds
Me.WindowState = FormWindowState.Maximized
Catch ex As Exception
Me.Text = "รายละเอียดสินค้า : " & ex.Message
Exit Sub
End Try
End Sub
Sub SaveDataProduct()
Try
Dim i As Integer
i = DataGridView1.CurrentRow.Index
DataGridView1.Item(1, i).Value = txtinternalcode.Text
DataGridView1.Item(3, i).Value = txtdescription.Text
DataGridView1.Item(4, i).Value = txtshortdesc.Text
DataGridView1.Item(5, i).Value = txtunit.Text
DataGridView1.Item(6, i).Value = txtgroup1.Text
DataGridView1.Item(10, i).Value = txtvattype.Text
DataGridView1.Item(11, i).Value = txtproducttype.Text
DataGridView1.Item(13, i).Value = txtcosttype.Text
If CheckBox1.Checked = True Then DataGridView1.Item(9, i).Value = 1
If CheckBox1.Checked = False Then DataGridView1.Item(9, i).Value = 0
'MsgBox(DataGridView1.Rows.Count())
adpt.Update(ds)
MsgBox("บันทึกข้อมูลสำเร็จ", MsgBoxStyle.OkOnly, "OK")
Catch ex As Exception
Me.Text = "รายละเอียดสินค้า : บันทึกข้อมูล Error : " & ex.Message
End Try
End Sub
โค้ดตามนี้ครับ
|
 |
 |
 |
 |
Date :
2013-10-14 15:49:20 |
By :
idolman |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เอ่อ ตกลงจะถามหรือจะกั๊กครับ ทำไมหวงโค้ดจัง
ไม่ตอบแระ เซ็ง
|
 |
 |
 |
 |
Date :
2013-10-14 16:12:28 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เราดูแล้ว โค้ดแค่นี้มันก็พอรันได้แหละ
แต่จะให้ทำงานอย่างที่นายต้องการไม่ได้แน่นอน
นายจะสั่ง SaveDataProduct จาก form load เลยเหรอ
แต่ดูแล้วมันก็ไม่มีคำสั่งอยู่ดี เอาเป็นว่าเราทำไม่ได้แล้วกัน
|
 |
 |
 |
 |
Date :
2013-10-15 08:11:19 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คำว่า "อาจารย์" ของคุณ ผมไม่รู้ว่าความหมายมันจะตรงกับสิ่งที่ผมเข้าใจหรือไม่
(ผมพิมพ์สดสด ผมไม่ได้กรองความคิดและคำพูด)
สมมุติว่า อาจารย์ หมายความว่า
1. มีเงิน(...) เหลือเฟือ อันนี้ผมไม่มี ผมจน และจนจริงฯ
2. มีกินเกิน 3 มื้อต่อวัน อันนี้ผมไม่มี ผมอดทุกมื้อทุกทุกวัน
...
เข้าประเด็นที่ 1. เงินของคุณ
ถ้าคุณเป็นนักศึกษา ต่อให้คุณเอาเงินล้านมากองตรงหน้าและบอกผมว่า พี่เอาไปเลยครับ ผมยกให้ ผมก็ไม่เอา
ถ้าคุณเป็นพนักงานบริษัท ต่อให้คุณเอาเงินล้านมากองตรงหน้าแต่มันเป็นเงินของคุณ พี่เอาไปเลยครับ ผมยกให้ ผมก็ไม่เอา
ถ้าบริษัทของคุณ ยกเงินมากองตรงหน้าของผม อย่างนี้ ผมเอาครับ รีบเอาเลยครับ ผมไม่ปฏิเสธเงินแบบนี้
ผมอธิบายให้คุณเข้าใจในเบื้องต้น เพื่อให้รู้ว่า ทำไมผมถึงจน และจนจริงจริง โดยไม่ต้องเสแสร้งหรือว่าแกล้งทำ
เข้าประเด็นที่ 2. งานของคุณ
Overviews SourceCode ของคุณมันผิดตั้งแต่บรรทัดแรกเลยครับ วิธีการคิดก็ผิดด้วยครับ
บรรทัดที่ 1 - 4 คุณจะใช้คำสั่งอะไร คุณต้องเข้าใจอย่างลึกซึ้งว่ามันทำงานอย่างไร?
ผมเดาเอา (ถูกด้วย) ว่าคุณไม่เข้าใจมันอย่างลึกซึ้ง ผลลัพธ์ที่ตามมาก็อย่างที่คุณเห็น
ถ้าคุณถามผมว่า ในสมองของผมมันมีอะไรอยู่ ผมตอบคุณได้เป็นข้อข้อดังนี้ครับ
1. กางเกงในเก่าเก่าของภรรยาผม เมื่อ 5 ปีที่แล้ว ทุกวันนี้หล่อนก็ยังสวมใส่อยู่
2. มี วิศวกรไฟฟ้า + วิศกรเครื่องกล อยู่ด้วย (อันนี้ผมใช้เวลาศึกษามาแค่ครึ่งเดือน ลองนึกว่าถ้าผมใช้เวลามากกว่านี้ล่ะ)
2.1-1 เอาตั้งแต่หน้าประตูโรงงาน ผมออกแบบได้สะบายง่ายพอพอกับที่ผมเขียนโปรแกรมได้
2.1-2 ยกตัวอย่างเช่นระบบงาน เงินเดือน (Payroll) ผมใช้คำสั่ง SQL Query เดียวเท่านั้นแหละ
ตอบโจทย์ได้ทั้งหมด ผมรู้ใส้รู้พุงมันหมดแหละครับ วันนี้ พรุ่งนี้ อาทิตย์นี้ เดือนนี้ ปีนี้ ปีหน้า
ผมบอกผู้จัดการฝ่ายบุคคลได้แบบสะบายสะบาย ครับ
ผัง (Flowchart) มันฝังอยู่ในหัวสมองของผมแบบไม่เคยจางหาย
|
 |
 |
 |
 |
Date :
2013-10-15 09:23:46 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอนนี้ผม อยากรู้ให้มากที่สุด (Automations Industrial)
ผมหลงไหลในศาสตร์ความรู้ด้าน วิศวกรรรมไฟ้ฟ้าและเครื่องกล จนผมโงหัวไม่ขึ้นครับ
ดาราทีวีทุกซ่อง มานั่งตักของผม ผมยังไม่เคยสนในเลยครับ
|
 |
 |
 |
 |
Date :
2013-10-15 09:33:52 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองเปลี่ยนเป็น ไปแก้ที่ ds แทน
Sub SaveDataProduct()
Try
Dim i As Integer
i = DataGridView1.CurrentRow.Index
DataGridView1.Item(1, i).Value = txtinternalcode.Text ------>>>> ds.row(i)(1)=txtinternalcode.Text
DataGridView1.Item(3, i).Value = txtdescription.Text
DataGridView1.Item(4, i).Value = txtshortdesc.Text
DataGridView1.Item(5, i).Value = txtunit.Text
DataGridView1.Item(6, i).Value = txtgroup1.Text
DataGridView1.Item(10, i).Value = txtvattype.Text
DataGridView1.Item(11, i).Value = txtproducttype.Text
DataGridView1.Item(13, i).Value = txtcosttype.Text
If CheckBox1.Checked = True Then DataGridView1.Item(9, i).Value = 1
If CheckBox1.Checked = False Then DataGridView1.Item(9, i).Value = 0
'MsgBox(DataGridView1.Rows.Count())
adpt.Update(ds)
MsgBox("บันทึกข้อมูลสำเร็จ", MsgBoxStyle.OkOnly, "OK")
Catch ex As Exception
Me.Text = "รายละเอียดสินค้า : บันทึกข้อมูล Error : " & ex.Message
End Try
End Sub
|
ประวัติการแก้ไข 2013-10-15 10:43:06 2013-10-15 10:52:47
 |
 |
 |
 |
Date :
2013-10-15 09:34:54 |
By :
fonfire |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมเสนอราคาแล้วได้งาน (ไม่มี)
ตัวอย่างผลงานที่ที่ผมนำเสนอแล้วไม่เคยได้งาน บานเบอะเลยนับไม่ไหว
อันนี้ของจริงนะเนี่ย (จริงฯ มันต้องต่อพ่วงเครื่องชั่งน้ำหนัก 4 ตัว เครื่องพิมพ์อีก 38 ตัวและอื่นฯอีก เช่น Digital I/O)

และก็นี่อีก

[x] กรุณาอย่าถามข้าพเจ้าว่าทำไม่ถึงไม่ได้งาน ถ้าข้าพเจ้าทราบ (ล่วงหน้า) รวยไปตั้งนานแล้ว (ไม่จนดักดานเหมือนทุกวันนี้ครับ)
|
 |
 |
 |
 |
Date :
2013-10-15 10:13:02 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อะไรของนายนะครับ เว็บบอร์ดมีไว้โพสถามตอบ เพื่อความรู้ เพื่อให้เข้าใจ แบ่งปันความรู้
ผมไม่รู้ผมก็สอบถามผู้รู้ คุณมาใส่ๆ ผม ผมก็ไม่เข้าใจนะครับ
ส่วนเรื่องหาคนสอน และตอบปัญหา การจ้างสอนเขียนโปรแกรมก็เป็นปกติธุรกิจ
แต่แค่ว่าไม่ต้องมานั่งสอนทุกอย่างทุกเรื่อง แค่ตอบปัญหาผมผ่านเมลเป็นเวลา
แล้วก็ต้องมีค่าสอนค่าวิชากัน มันก็ปกติ คุณยกโน่นนี่มา ผมก็ไม่เข้าใจ
คุณเข้าใจมั้ยหละครับว่า webboard มันมีไว้ทำอะไร แต่มันจะมีคนบางกลุ่มที่คอยมาอ่านแล้วก็บอกว่า "สะกดผิดมั่ง" จับผิดโน่นนี่
แล้วก็ด่าๆ คนโพส ผมก็ไม่เข้าใจนะครับ
ต้องขอโทษด้วยที่โพสอะไรไปแล้วทำให้คุณมีปัญหากับสิ่งที่ผมโพส
|
 |
 |
 |
 |
Date :
2013-10-15 10:36:59 |
By :
idolman |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|

|
 |
 |
 |
 |
Date :
2013-10-15 10:58:23 |
By :
fonfire |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 23 เขียนโดย : ผ่านมา เมื่อวันที่ 2013-10-15 11:54:55
ผมอธิบายเพิ่มเติมอีกนิดหนึ่ง (ภาพรวม) โดยปกติแล้วในโรงงานอุตสาหกรรม อุปกรณ์ทุกชิ้นจะต้องทนได้ในทุกสภาพแวดล้อม เช่น
ฝุ่น, ความร้อน เป็นต้น และ หยุดไม่ได้
เพราะฉะนั้น การเชื่อมต่ออุปกรณ์ทุกชิ้น จะต้องดูคู่มือเป็นสำคัญว่ามันต่ออย่างไร มันทำงานอย่างไร แต่ส่วนใหญ่แล้วใช้
TTL เป็นหลัก (แรงดันไฟฟ้า +- 3V เป็นต้น) ผมยกตัวอย่าง เครื่องพิมพ์เร็ว (อาจจะมากถึง 1,000 ชิ้น/นาที) มันจะมีการเชื่อมต่อดังนี้
ก็บอกแล้วว่าเกรดสูงอุปกรณ์ เพื่อใช้ในโรงงาน มันต้องมีดังนี้
USB/RS232/RS485 External Connection Terminal Block ยังงัยยังงัย มันต้องมีอย่างน้อย 2 ฺBlock ขี้นไป
และหนึ่งในนั้นมันจะมีช่อง C, O, N หรือเรียกว่าง่ายฯว่า วงจร Relay เอาไว้บอกให้อุปกรณ์อื่นฯได้รับรู้ว่า
ฉันพร้อมนะ ฉันงงอยู่ เป็นต้น
และอีก Block หนึ่งอาจจะเป็นเอาไว้จับสัญญาญต่างฯ เช่น ปิด/เปิด/Hold/Setup/พิมพ์เสร็จแล้ว/อะไร เป็นต้น
|
 |
 |
 |
 |
Date :
2013-10-15 12:07:15 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 24 เขียนโดย : ผ่านมา เมื่อวันที่ 2013-10-15 12:07:15
ขยายความ Block ที่ 1 อาจมีมากถึง 17 ช่อง (Signal) ผมอาจจะ้ใช้ 3 ช่อง เสียบกับอุปกรณ์ เซ็นเซอร์ (sensor) เอาไว้ Mark วัสดุที่ไหลมา
ตามสายพานการผลิต แน่นอนว่าผมต้องเขียนโปรแกรมคำนวณ ความเร็วรอบของ sorvor motor เพื่อที่จะสั่งให้มันพิมพ์
วิธีการพิมพ์มันก็แล้วแต่เราจะทำอย่างไร แต่ที่แน่แน่ มันพิมพ์ได้โดยที่ไม่ต้องสำผัสอุปกรณ์ มันพ่นเอา (Inkjet)
ประมาณนี้ครับ
|
 |
 |
 |
 |
Date :
2013-10-15 12:18:08 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 25 เขียนโดย : ผ่านมา เมื่อวันที่ 2013-10-15 12:18:08
ผมลืมบอกไปว่า สไตล์การเขียนโปรแกรมของผม สมมุติว่านะ ผมให้เด็กออกแบบหน้าจอมา เช่น ลาก Controls ต่างฯ
มาวาง จัดให้สวยงาม แค่นี้ผมก็ยิ้มแล้ว เพราะเวลาใช้จริงฯ มันอาจจะไม่เป็นอย่างที่ได้ออกแบบหน้าจอเอาไว้ก็ได้
ผมอ่าน xxx.designer.xx มาวนลูปแทนค่าลงไป
เอา Controls ของผม ยัดใส่ ทำคล้ายวิซาต (wizard) ตรงนี้คิดตามให้ทันนะครับ
|
 |
 |
 |
 |
Date :
2013-10-15 12:36:25 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
พูดง่ายง่ายว่า หน้าจอที่ได้ออกแบบเอาไว้แล้วนั้น ผมไม่ได้ใช้งานเลยนะครับ (เป็นสะพานให้ผมเฉยเฉย)
|
 |
 |
 |
 |
Date :
2013-10-15 12:37:39 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
สไตล์การเขียนของผมมั่นใจว่า ในเมืองไทยนี้ มีคนที่ใช้ไม่กี่คน ที่ผมรู้
อยู่ที่จ. นครราชสีมา หนึ่งท่าน นอกนั้นนึกไม่ออก (ไม่มีเลย)
|
 |
 |
 |
 |
Date :
2013-10-15 12:47:09 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ป๊าาาาาดดดดดดดดด
บ่เซาจั๊กเทือ
|
 |
 |
 |
 |
Date :
2013-10-15 12:47:25 |
By :
fonfire |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 29 เขียนโดย : fonfire เมื่อวันที่ 2013-10-15 12:47:25
กระผมไม่รู้ความหมาย แต่ถ้าให้ผมเดาคงไม่ใช่คำชมแน่นอนครับ ถึงอย่างไรผมก็ไม่โกธร
เพราะว่าผมไม่มีเวลาเหลือให้กับมันอีกแล้ว (ความโกรธ) พูดให้เข้าใจง่ายฯ ผมเป็นคนหน้าด้านนั่นแหละครับ +55555
ตัวอย่างการเขียน สไตล์ Store Procedure ของผม
Code (SQL)
USE [xDB]
GO
/****** Object: StoredProcedure [dbo].[xGen] Script Date: 10/15/1900 12:52:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: โชคไม่เคยเข้าข้าง (กู)
-- Create date: 1900-07-10
-- Description:
-- =============================================
ALTER PROCEDURE [dbo].[ClassGen]
-- Add the parameters for the stored procedure here
@p1 int = 0,
@p2 int = 0
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @field table (fieldname varchar(50), fieldtype varchar(50))
declare @table_name varchar(50)
set @table_name = 'msrUsers' -- this is the table name
insert into @field
Select sc.name, st.name
from
sysobjects so,
syscolumns sc,
systypes st
where
so.id = sc.id
and so.xtype = 'U'
and so.name = @table_name
and st.xtype = sc.xtype
print 'Public Class ' + @table_name
declare @fieldname varchar(50)
declare @fieldtype varchar(50)
declare @constructor varchar(500)
declare @assign varchar(500)
declare cur cursor for
select fieldname, fieldtype
from @field
open cur
fetch next from cur
into @fieldname, @fieldtype
set @constructor = ''
set @assign = ''
while @@fetch_status = 0
begin
set @fieldtype = case @fieldtype
when 'int' then 'Integer'
when 'smallint' then 'Int16'
when 'tinyint' then 'Short'
when 'varchar' then 'String'
when 'nvarchar' then 'String'
when 'bit' then 'Boolean'
when 'float' then 'Double'
when 'datetime' then 'DateTime'
else @fieldtype
end
set @constructor = @constructor + 'ByVal v' + @fieldname + ' AS ' + @fieldtype + ', '
set @assign = @assign + '_' + @fieldname + ' = v' + @fieldname + ' : '
print ''
print 'Private _' + @fieldname + ' AS ' + @fieldtype
print 'Public Property ' + @fieldname + '() AS ' + @fieldtype
print ' Get'
print ' return _' + @fieldname
print ' End Get'
print ' Set (value AS ' + @fieldtype + ')'
print ' _' + @fieldname + ' = value'
print ' End Set'
print 'End Property'
print ''
fetch next from cur
into @fieldname, @fieldtype
end
print 'Public Sub New(' + substring(@constructor, 0, len(@constructor)) + ')'
print ' ' + substring(@assign, 0, len(@assign) -1)
print 'End Sub'
print 'End Class'
END
|
 |
 |
 |
 |
Date :
2013-10-15 12:57:00 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมลืมบอกไปว่า #NO 30 ผมเอามาจากเมืองฝรั่งเขา ผมนั่งดูมันอยู่ตั้งนาน มันทำอะไรของมันว่ะ
พอผมพิจารณาอย่างถ้วนถี่ ใช่เลย ผมก็ประยุกต์ใช้เอา
พอพูดถึงคำว่าประยุกต์ ก็ย้อนกลับไป ที่ Block1, Block สมมุติว่า มันไม่มีล่ะ มันเป็นไปได้ครับ
คำตอบคือ บ้านหม้อ, Sila Researdh, ETT, และอีกเยอะเลยครับ
|
 |
 |
 |
 |
Date :
2013-10-15 13:10:12 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|

ยังใช้ Join แบบเก่าอยู่เหรอครับ แสดงว่าลุงต้องเก๋าพอสมควรเลย
SP Gen Class ก็เข้าใจน่ะครับ ตามประสางู ๆ ปลา ๆ ของผม
ว่าแต่ว่าทำ parameter ไว้ทำไมเหรอครับ ไม่เห็นใช้เลย
ตัว table name ไม่รับจาก parameter อ่ะครับ
ฝั่งไว้ใน code ดีกว่าเหรอครับ
แล้วทำไมต้องทำ var table ด้วยในมือ query ผ่าน cursor ได้เลย
ถามเป็นความรู้น่ะครับ  
|
ประวัติการแก้ไข 2013-10-15 13:16:28
 |
 |
 |
 |
Date :
2013-10-15 13:11:27 |
By :
fonfire |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
http://www.sqlservercentral.com/Forums/Topic516496-23-1.aspx
|
ประวัติการแก้ไข 2013-10-15 13:25:47
 |
 |
 |
 |
Date :
2013-10-15 13:21:02 |
By :
fonfire |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 32 เขียนโดย : fonfire เมื่อวันที่ 2013-10-15 13:11:27
ผมดีใจที่คุณเข้าใจ (ความรู้มันอยุ่ที่ตัวของคุณ) ที่เหลือก็อยู่ที่การประยุกต์
ผมขยายความคำว่า "เก่า" จะพูดว่ามันล้าสมัยมันก็ไม่ผิดแต่มันก็ไม่ถูกต้องเสมอไปครับ ยกตัวอย่างเช่น
RS232 ก็ยังใช้กันอยู่ทั่วฯไป ตามโรงงานต่างฯ ทำไมไม่เปลี่ยนเป็น USB/วิธีอื่นฯ ที่ดีกว่าล่ะ
ทุกโรงงาน (คน) ย่อมมีเหตุผลของตัวเองครับ ระบบไม่เหมือนกัน หน้างานไม่เหมือนกัน ภาระค่าใช้จ่ายและอีกจิปาถะ
การเปลี่ยนแปลงระบบอย่าลืมนะครับ ทำแล้วมันต้องดีกว่าเดิม แล้วใครจะรัปประกันว่ามันดีกว่าเดิม
อย่าลืมนะครับแค่เราคนเดียว แต่จริงฯแล้วมันมีอีก ภาระที่อยู่ข้างหลังมันมีหลายคน เช่น เมีย, ลูก, etc
|
 |
 |
 |
 |
Date :
2013-10-15 13:29:33 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมบอกว่า เก๋า ครับ ไม่ใช่ เก่า  
|
ประวัติการแก้ไข 2013-10-15 13:34:26
 |
 |
 |
 |
Date :
2013-10-15 13:30:45 |
By :
fonfire |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
  
|
 |
 |
 |
 |
Date :
2013-10-15 13:46:47 |
By :
watcharop |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
รวมคำสั่ง SQL สไตล์ของผม
ผมจำอะไรได้ไม่หมดครับ ผมสงสัยผมก็จะรันดู แล้วผมก็นึกอ๋อ ตัดแปะมั่ง เอามาจาก www ผมจำไม่ได้จริงฯครับ
เผื่อใครหลงทางไปมาอ่านเจอตรงนี้ และประยุกต์ใช้ได้บ้าง
อันนี้คือสิ่งทดแทนคำขอโทษเจ้าของกระทู้ จากผมคนไร้นาม
Code (SQL)
USE tempdb
GO
IF OBJECT_ID(N'tempdb..#A') IS NULL --IS NOT NULL
BEGIN
CREATE TABLE #A (ID int)
INSERT INTO #A VALUES (1), (2), (3)
END
SELECT * FROM #A
IF OBJECT_ID(N'tempdb..#B') IS NULL --IS NOT NULL
BEGIN
CREATE TABLE #B (ID int)
INSERT INTO #B VALUES (2), (3), (4)
END
SELECT * FROM #B
/*
DECLARE #A TABLE (ID int)
DECLARE #B TABLE (ID int)
INSERT INTO #A VALUES (2),(3),(4)
INSERT INTO #B VALUES (2),(3),(4)
*/
SELECT * FROM #A x FULL OUTER JOIN #B y ON x.ID = y.ID
/*----------- -----------
1 NULL
2 2
3 3
NULL 4
(4 row(s) affected)
*/
SELECT * FROM #A x JOIN #B y ON x.ID = y.ID
/*----------- -----------
2 2
3 3
(2 row(s) affected)
*/
SELECT * FROM #A x CROSS JOIN #B y
/*----------- -----------
1 2
2 2
3 2
1 3
2 3
3 3
1 4
2 4
3 4
(9 row(s) affected)
*/
/*
That is not legal because A.Val is out of scope within the derived table;
this is because the derived table is evaluated independently of the other tables in the SELECT.
To limit the rows in table B so that B.Val = A.Val,
we must do that outside of the derived table via a join or in the criteria
SELECT * FROM #A a CROSS JOIN (SELECT x.ID FROM #B x WHERE x.ID = a.ID) b
*/
SELECT a.*, b.* FROM #A a CROSS JOIN (SELECT * FROM #B) b
WHERE a.ID = b.ID
/*
----------- -----------
2 2
3 3
(2 row(s) affected)
*/
/*
Summary : Full Outer Join
all matching rows (inner join) + all rows from A not matching B
+ all rows from B not matching A
(it applies actually a left and a right join at the same time)
*/
/*
Summary : Cross Join
is a cartesian product, so this will in fact combine all rows from A with all rows from B
*/
/*OK Finally
cross join is a*b rows,
full outer join gives matched and unmatched rows
*/
SELECT #A.*, b.* FROM #A CROSS APPLY (SELECT #B.ID FROM #B ) b
SELECT * FROM #A CROSS APPLY (SELECT TOP 1 * FROM #B ORDER BY ID DESC) b
/*
SELECT #A.*, b.ID FROM #A CROSS JOIN (SELECT #B.ID FROM #B WHERE #B.ID = #A.ID) b
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "#A.ID" could not be bound.
*/
SELECT #A.*, b.ID FROM #A CROSS APPLY (SELECT #B.ID FROM #B WHERE #B.ID = #A.ID) b
-- CROSS APPLY also allows us to quickly get columns from the "previous" row
-- in a table quite easily:
SELECT a.*, Prev.*
FROM #A a
CROSS APPLY
(
SELECT TOP 1 * FROM #A p
WHERE p.ID < a.ID ORDER BY ID DESC
) Prev
/*
Note that the above CROSS APPLY will not return
any orders without a previous order;
we would use OUTER APPLY to ensure that all orders are returned even
if no previous orders exist:
*/
SELECT a.*, Prev.*
FROM #A a
OUTER APPLY
(
SELECT TOP 1 * FROM #A p
WHERE p.ID < a.ID ORDER BY ID DESC
) Prev
IF OBJECT_ID(N'tempdb..#A') IS NOT NULL
BEGIN
DECLARE @ValueA int;
END
IF OBJECT_ID(N'tempdb..#B') IS NOT NULL
BEGIN
DECLARE @ValueB int;
END
|
 |
 |
 |
 |
Date :
2013-10-15 14:32:23 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 35 เขียนโดย : fonfire เมื่อวันที่ 2013-10-15 13:30:45
ผมนึกออกแล้วว่า คุณบอกว่าไม่จำเป็นต้องใช้ PIVOT/UNPIVOT ก็ได้ในหัวข้อกระทู้ที่ #???
ผมมีอีกวิธีหนึ่งคุณใช้ไอ้นี่แทนก็ได้ครับ
OUTER APPLY ทดแทนคำสั่ง PIVOT/UNPIVOT เร็วกว่าเห็นฯ จึ๊ํกฯฯฯ เลยครับ
และก็อีกอย่างหนึ่งเวลาคุณ ORDER BY อย่าทำใน QUERY ให้ทำใน Temp Table เร็วปึ๊ดเลยครับ > 10 เท่า ครับ
โชคดีครับ
|
 |
 |
 |
 |
Date :
2013-10-15 15:01:17 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 38 เขียนโดย : watcharop เมื่อวันที่ 2013-10-15 14:29:20
ประมาณนี้มั้งครับ +55555
Code (VB.NET)
Public Shared Function Write2Database(ByVal BranchID As Integer, ByVal sysID As Short,
ByVal MenuID As Integer, ByVal ErrorAction As String,
ByVal ErrorDescription As String, ByVal ErrorDateTime As DateTime,
ByVal ErrorUserID As Integer, ByVal ErrorIPAddress As String) As Boolean
Dim suc As Boolean = False
Try
Dim value As New List(Of WL_Model.sysErrorLog) From {New WL_Model.sysErrorLog With {.BranchID = BranchID,
.sysID = sysID,
.MenuID = MenuID,
.ErrorAction = ErrorAction,
.ErrorDescription = ErrorDescription,
.ErrorDateTime = ErrorDateTime,
.ErrorUserID = ErrorUserID,
.ErrorIPAddress = ErrorIPAddress
}
}
WL_Database.WL_SQLHelperExt.SetData(WL_BLL.sysErrorLog.SetInsertCommand(value))
suc = True
Catch ex As Exception
'Write Error log.
End Try
Return suc
End Function
|
 |
 |
 |
 |
Date :
2013-10-15 16:00:27 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
มีอีหนูคนหนึ่งถามว่า ไม่ผ่าน DS (DataSet) ต้องทำอย่างไร?
คำตอบคือ #NO 42 ไงครับ ประยุกต์นิดหน่อย
|
 |
 |
 |
 |
Date :
2013-10-15 16:04:36 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
555555 คิดถึง พี่ฟง จริง ๆ เลย
|
 |
 |
 |
 |
Date :
2013-10-15 17:17:35 |
By :
fonfire |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เหอๆ หนัก
|
 |
 |
 |
 |
Date :
2013-10-16 10:18:42 |
By :
idolman |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 46 เขียนโดย : idolman เมื่อวันที่ 2013-10-16 10:18:42
รายละเอียดของการตอบ ::
อันนี้ผมไม่รู้ความหมายของคุณครับ
ผมมีความเชื่อว่าเมื่อถึงจุดหนึ่งและสักวันหนึ่ง ถ้าเรายังเดินทางในสายทางนี้ (คอมพิวเตอร์) มันต้องเจอปัญหาแบบนี้ครับ
และไม่มีใครที่จะหนีมันพ้นไปได้ ผมเชื่อเช่นนี้ครับ
1. Web Application สร้างโฟล์เดอร์ในเครื่อง Client ได้หรือไม่
2. Web Application สั่งรันโปรแกรมในเครื่อง Client ได้หรือไม่
3. local, www, etc...
คำตอบเดียว "มันทำได้อยู่แล้ว" ผมรู้ครับว่ามันไม่ใช่เรื่องง่ายฯ แต่ก็ไม่น่าจะเกินความสามารถของเราทุกฯคน
เมื่อได้คำตอบมาแล้ว ก็ประยุกต์ใช้ (ขึ้นอยู่กับความต้องการ) อทิเช่น
1. สั่งปิดเปิดไฟฟ้าผ่านหน้าเวปไซต์
2. สั่งเครื่องจักร หยุด/เริ่มทำงานผ่านหน้าเวปไซต์ (ผมจะเอาใช้งานจริงด้วยครับ)
3. สั่งรันโปรแกรม (.EXE) ในเครื่องลูกค้าแบบ Real time. รับส่งหรือจะทำอะไรก็ว่ากันไปครับ
4. etc อีกเยอะเลย แล้วแต่จะจินตนาการ
จากบรรทัดนี้ไปจนถึงหน้าจอ แทงรวย ผมสมมุติขึ้นมาเฉยฯ ครับ
1. หน้าจอ Login มี SourceCode ระบบป้องกันข้อมูลหลายชั้น ดังนี้ครับ
(ตัวอย่างอันนี้ผมใช้แค่ชั้นเดียวครับ)
Code (VB.NET)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'2012-03-24 Support Windows Client & All Application. example delphi, visual foxpro, etc
If Request.QueryString("UserName") <> Nothing AndAlso Request.QueryString("Password") <> Nothing Then
Dim strUserName As String = Request.QueryString("UserName") '***** byebye Decrypt
Dim strPassword As String = Request.QueryString("Password") '***** byebye Decrypt
' ******************************************************************************************
' Protect Decomplier Algorithm with C++ for Encrypt UserName and Password
' validation here and check the username and password in the database
' *******************************************************************************************
FormsAuthentication.Authenticate("นามคุณ", "รหัสผ่าน") 'Check in web.config with SHA1
FormsAuthentication.SetAuthCookie(strUserName, False, FormsAuthentication.FormsCookiePath)
FormsAuthentication.RedirectFromLoginPage(strUserName, False, FormsAuthentication.FormsCookiePath)
' Create cookie and return it
Dim ticket As New FormsAuthenticationTicket(1,
strUserName,
DateTime.Now,
DateTime.Now.AddDays(30),
False,
New Guid().ToString(),
FormsAuthentication.FormsCookiePath)
' Encrypt the ticket.
Dim encTicket As String = FormsAuthentication.Encrypt(ticket)
' Create the cookie.
Response.Write(encTicket)
Response.End()
Else
FormsAuthentication.SetAuthCookie("Guest", False) 'Test only XXX Remove this line in production
End If
End Sub
2. อันนี้เป็นคำสั่ง SQL Query สำหรับออกรายงาน ในตัวอย่างสมมุตินี้ ผมใช้แค่คำสั่งเดียวครับ
และไม่ได้เขียนเอาไว้เป็น Store Procedure (เรียกตรงตรง)
Code (VB.NET)
Public Function GetPurchaseNumber(Optional ByVal isOverLimit As Boolean = False)
Dim strWhere As String = If(isOverLimit, " WHERE (X.OverP1 > 0 Or X.OverP2 > 0)", String.Empty)
Dim x As String = <xsql>
;
WITH cte
AS (
SELECT *
,ROW_NUMBER() OVER (
ORDER BY InputType DESC
,StringNum ASC
) AS rn
FROM (
SELECT InputType
,StringNum
,LimitPrice1
,LimitPrice2
,Y.Price1
,Y.Price2
,ISNULL(LimitPrice1, 0) + ISNULL(Y.Price1, 0) AS OverP1
,ISNULL(LimitPrice2, 0) + ISNULL(Y.Price2, 0) AS OverP2
FROM GoodLuckConfigSpread AS Z
CROSS APPLY (
SELECT SUM(Price1) AS Price1
,SUM(Price2) AS Price2
FROM GoodLuck a
WHERE a.InputType = Z.InputType
AND a.StringNum = Z.StringNum
) Y
) X <%= strWhere %> --{0}
--WHERE X.OverP1 > 0
--OR X.OverP2 > 0
)
,cte0
AS (
SELECT InputType, MIN(rn) AS rn
FROM cte
GROUP BY InputType
)
,cte1
AS (
SELECT cte.InputType
,StringNum
,OverP1
,OverP2
,cte.rn
,Price1
,Price2
FROM cte0
CROSS JOIN cte WHERE cte0.InputType = cte.InputType AND (cte.rn -cte0.rn ) % 5 = 0
)
SELECT cte1.InputType
,cte1.StringNum AS StringNum_1
,cte1.Price1 AS Price1_1
,cte1.Price2 AS Price2_1
,cte1.OverP1 AS OverP1_1
,cte1.OverP2 AS OverP2_1
,cte2.StringNum AS StringNum_2
,cte2.Price1 AS Price1_2
,cte2.Price2 AS Price2_2
,cte2.OverP1 AS OverP1_2
,cte2.OverP2 AS OverP2_2
,cte3.StringNum AS StringNum_3
,cte3.Price1 AS Price1_3
,cte3.Price2 AS Price2_3
,cte3.OverP1 AS OverP1_3
,cte3.OverP2 AS OverP2_3
,cte4.StringNum AS StringNum_4
,cte4.Price1 AS Price1_4
,cte4.Price2 AS Price2_4
,cte4.OverP1 AS OverP1_4
,cte4.OverP2 AS OverP2_4
,cte5.StringNum AS StringNum_5
,cte5.Price1 AS Price1_5
,cte5.Price2 AS Price2_5
,cte5.OverP1 AS OverP1_5
,cte5.OverP2 AS OverP2_5
FROM cte1
LEFT JOIN cte AS cte2 ON cte1.InputType = cte2.InputType
AND cte2.rn - cte1.rn = 1
LEFT JOIN cte AS cte3 ON cte1.InputType = cte3.InputType
AND cte3.rn - cte1.rn = 2
LEFT JOIN cte AS cte4 ON cte1.InputType = cte4.InputType
AND cte4.rn - cte1.rn = 3
LEFT JOIN cte AS cte5 ON cte1.InputType = cte5.InputType
AND cte5.rn - cte1.rn = 4
</xsql>
Return Query(x.ToString())
End Function
3. อันนี้เป็นหน้าจอสมมุติที่ผมทำขึ้นมา เล่นเล่นครับ

|
 |
 |
 |
 |
Date :
2013-10-16 12:33:14 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมเคารพในเหตุผลของแต่ละบุคคลและแต่ละหน่วยงาน (ทุกทุกคนย่อมมีเหตุผลเป็นของตัวเอง)
และนี่ก็เป็นอีกครั้งหนึ่งที่ผมไม่ได้งานครับ และยังจะมีอีกต่อไป
ผมต้องคิดว่านี่คือรางวัลชีวิตของผม เพราะถ้าผมคิดเป็นอย่างอื่น
นั่นหมายความว่าผมจะได้ศัตรูเพิ่มขึ้นมาโดยไม่จำเป็น
(เท่าที่ผมมีอยู่มันก็มากเำกินพออยู่แล้วครับ)
ผมขอจบหัวข้อกระทู้นี้แต่เพียงเท่านี้ ผมขอโทษเจ้าของหัวกระทู้อีกครั้งหนึ่ง
มา ณ.ที่ด้วยด้วยครับ
ขอแสดงความนับถือ
ผ่านมา
|
 |
 |
 |
 |
Date :
2013-10-17 04:32:18 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|