Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,036

HOME > .NET Framework > Forum > [C#] DataGridView - UPDATE ROW พร้อม INSERT ข้อมูลหากข้อมูลนั้นเป็นข้อมูลใหม่



 

[C#] DataGridView - UPDATE ROW พร้อม INSERT ข้อมูลหากข้อมูลนั้นเป็นข้อมูลใหม่

 



Topic : 110179



โพสกระทู้ ( 174 )
บทความ ( 0 )



สถานะออฟไลน์




Code (C#)
 SqlConnection conn = new SqlConnection("Data Source=10.11.1.1;Initial Catalog=GIS;User ID=sa;Password=Pocket007");
            conn.Open();
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = @"select std_quation_id,job_name,ORIGIN,DESTINATION,VEHICLE_TYPE_ID,SUP_PRICE,PORT_ID,CUSTOMER_NAME,YARD from MT_FLST_QT_QUOTATION where QT_ID like('%" + qt_id.Text + "%')";
            DataTable dt = new DataTable();
        
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);


            dataGridView1.Columns.Clear();
            dataGridView1.DataSource = null;
            dataGridView1.DataSource = dt;

            conn.Close();

ปุ่มค้นหาครับ



 string sqlquery2 = ("SELECT * FROM MT_FLST_QT_QUOTATION ");
 int mm;
                    mm = dataGridView1.Rows.Count - 1;

                    for (int i = 0; i < mm; i++)
                    {
                        
                        strSQLupdate2 = "UPDATE MT_FLST_QT_QUOTATION SET job_name=@jn,QT_ID=@QT_ID2,ORIGIN=@ORIGIN,SUP_PRICE=@SUP,DESTINATION=@DEST,VEHICLE_TYPE_ID=@V_TYPE,PORT_ID=@PORT_ID,CUSTOMER_NAME=@cn,yard=@yard WHERE std_quation_id='" + dataGridView1.Rows[i].Cells[0].Value.ToString() + "' ";


                        objCmdupdate2 = new SqlCommand(strSQLupdate2, objConn);
                    }



sql โค๊ดตรงอัพเดทครับ


Code (C#)
  int jj;
                    jj = dataGridView1.Rows.Count - 1;
                    
                    for (int i = 0; i < jj; i++)
                    {
                        objCmdupdate2.Parameters.Add(new SqlParameter("@std", dataGridView1.Rows[i].Cells[0].Value));

                        objCmdupdate2.Parameters.Add(new SqlParameter("@jn", dataGridView1.Rows[i].Cells[1].Value));
                        objCmdupdate2.Parameters.Add(new SqlParameter("@QT_ID2", qt_id.Text));
                        objCmdupdate2.Parameters.Add(new SqlParameter("@ORIGIN", dataGridView1.Rows[i].Cells[2].Value));
                        objCmdupdate2.Parameters.Add(new SqlParameter("@DEST", dataGridView1.Rows[i].Cells[3].Value));
                        objCmdupdate2.Parameters.Add(new SqlParameter("@V_TYPE", dataGridView1.Rows[i].Cells[4].Value));
                        objCmdupdate2.Parameters.Add(new SqlParameter("@SUP", dataGridView1.Rows[i].Cells[5].Value));
                        objCmdupdate2.Parameters.Add(new SqlParameter("@PORT_ID", dataGridView1.Rows[i].Cells[6].Value));
                        objCmdupdate2.Parameters.Add(new SqlParameter("@CN", dataGridView1.Rows[i].Cells[7].Value));
                        objCmdupdate2.Parameters.Add(new SqlParameter("@YARD", dataGridView1.Rows[i].Cells[8].Value));
                        objCmdupdate2.ExecuteNonQuery();
                        objCmdupdate2.Parameters.Clear();
                    }

นี่โค้ด ตรง button อัพเดท ครับ (ก๊อบมาไม่หมดนะครับยาวมากกลัวขี้เกียจอ่านกัน)


หทด

1.ก่อนเซฟข้อมูล ใส่ ข้อมูลไว้ใน Row บรรทัดเดียว

2

2.พอจะเซฟอีกที จะเป็นการอัพเดทแล้วครับ
ซึ่งตอนนี้การอัพเดทขึ้นอยู่กับ เลขที่ใบเสนอ ราคาครับ

Gridview การอัพเดทขึ้นอยู่ primary key แต่ละ row และ เลขที่ใบเสนอ

แต่ปัญหา คือ

ในปุ่ม SAVE
มี 1 ใบเสนอราคา สามารถมีบิลย่อยได้ หลายๆ บรรทัดครับ
ถ้าสมมุติ มี เลขที่ใบเสนอราคาแล้ว แต่ละ row จะทำการอัพเดทครับ ถ้าไม่มีเลขที่ใบเสนอราคา โปรแกรมจะทำการ insert แทนครับ
ในกรณีที่ มี เลขบิลอยู่แล้วในส่วน Header แต่ ใน Gridview อยากจะเพิ่ม Row อีก ณ ตอนนี้ผมกด มันก็อัพเดท อย่างเดียวครับ อยากให้มัน Insert ด้วยในตัว สามารถทำได้ไหมครับ

รบกวนแชร์โค๊ดupdate ทีเดียวทั้ง Gridview พร้อม insert ไปด้วยเลย
หรือแนวทางก็ได้ครับ ประมาณว่า
Code
If row2 = new data row2 insert to database

แบบนี้นะครับ
ผมว่า Logic ผมมันเริ่มเพี้ยนๆ บางทีก็เหนื่อยกับการเป็นโปรแกรมเมอร์ตัวคนเดียว

ปล.เข้าใจนะครับว่าผมอธิบายอะไรไม่ค่อยเข้าใจ จะพยามแก้ไขภาษาไทยให้ดีขึ้นครับ



Tag : .NET, Ms SQL Server 2005, Win (Windows App), C#, VS 2010 (.NET 4.x)









ประวัติการแก้ไข
2014-07-24 16:37:32
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2014-07-24 16:36:11 By : nongpaoza View : 5900 Reply : 5
 

 

No. 1



โพสกระทู้ ( 611 )
บทความ ( 0 )



สถานะออฟไลน์


ลองคัดลอกโค๊ดด้านล่างไปรันบน SSMS --> New Query

Code (SQL)
DECLARE @TestTable TABLE (Quot_No varchar(10), RefNo int, CustomerName varchar(50))
/*Test Data*/
INSERT INTO @TestTable (Quot_No, RefNo, CustomerName) 
VALUES ('no-1', 2, 'Customer B')

/* Update/Insert/Delete */
MERGE INTO @TestTable AS TS
USING (
 VALUES (
  'no-1'
  ,1
  ,'Customer A'
  )
  ,(
  'no-1'
  ,2
  ,'Customer B Change update'
  )
  ,(
  'no-1'
  ,3
  ,'Customer C'
  )  
 ) AS DS(Quot_No, RefNo, CustomerName)
   ON TS.Quot_No = DS.Quot_No AND TS.RefNo = DS.RefNo
WHEN MATCHED AND DS.CustomerName = N'' /*Empty Customer Name*/
 THEN
  DELETE   
WHEN MATCHED
 THEN
  UPDATE
  SET CustomerName = DS.CustomerName
WHEN NOT MATCHED BY TARGET
 THEN
  INSERT (Quot_No, RefNo, CustomerName)
  VALUES (DS.Quot_No, DS.RefNo, DS.CustomerName);

/*Display Data*/   
SELECT * FROM @TestTable ORDER BY 1, 2




ตัวอย่างผลลัพธ์ที่ได้
cuid_01








ประวัติการแก้ไข
2014-07-24 18:12:19
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-24 18:09:47 By : หน้าฮี
 


 

No. 2



โพสกระทู้ ( 611 )
บทความ ( 0 )



สถานะออฟไลน์


อันนี้เหมือนข้างบนครับ แต่ผมสมมุติและเพิ่มแถวที่ต้องการลบ (RefNo = 4)
ลองคัดลอกโค๊ดด้านล่างไปรันบน SSMS --> New Query --> F5

Code (SQL)
DECLARE @TestTable TABLE (Quot_No varchar(10), RefNo int, CustomerName varchar(50))
/*Test Data*/
INSERT INTO @TestTable (Quot_No, RefNo, CustomerName) 
VALUES ('no-1', 2, 'Customer B')
INSERT INTO @TestTable (Quot_No, RefNo, CustomerName) 
VALUES ('no-1', 4, 'Customer D')

/* Update/Insert/Delete */
MERGE INTO @TestTable AS TS
USING (
 VALUES (
  'no-1'
  ,1
  ,'Customer A'
  )
  ,(
  'no-1'
  ,2
  ,'Customer B Change update'
  )
  ,(
  'no-1'
  ,3
  ,'Customer C'
  )
  ,(
  'no-1'
  ,4
  ,'' /*ค่าว่าง/Empty*/
  )     
 ) AS DS(Quot_No, RefNo, CustomerName)
   ON TS.Quot_No = DS.Quot_No AND TS.RefNo = DS.RefNo
WHEN MATCHED AND DS.CustomerName = N'' /*Empty Customer Name*/
 THEN
  DELETE   
WHEN MATCHED
 THEN
  UPDATE
  SET CustomerName = DS.CustomerName
WHEN NOT MATCHED BY TARGET
 THEN
  INSERT (Quot_No, RefNo, CustomerName)
  VALUES (DS.Quot_No, DS.RefNo, DS.CustomerName);

/*Display Data*/   
SELECT * FROM @TestTable ORDER BY 1, 2





ตัวอย่างผลลัพธ์ที่ได้ (RefNo = 4 โดนลบไปแล้ว ภายใต้เงื่อนไขสมมุติ ถ้าชื่อลูกค้ามีค่าว่าง)
cuid_01


ประวัติการแก้ไข
2014-07-24 18:27:52
2014-07-24 18:29:44
2014-07-24 18:31:17
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-24 18:27:02 By : หน้าฮี
 

 

No. 3



โพสกระทู้ ( 611 )
บทความ ( 0 )



สถานะออฟไลน์


จาก #NO1 และ #NO2

สมนาม TS คือ ตารางที่ต้องการ Update ในที่นี้คือ Quotation Detail Table ของคุณนั่นแหละครับ
สมนาม DS คือ ค่าที่ต้องการ Update/Insert/Delete ในที่นี้คือ วนลูปอ่านค่ามาจาก DataGridView ของคุณนั่นแหละครับ

อันนี้คิดเล่นฯครับ ซุกซนไปเรื่อย (คล้ายฯโฆษณานาฬิกายี่ห้อหนึ่ง แฟนเยอะพูดไปเรื่อย)
Code (SQL)
WHEN MATCHED AND DS.CustomerName = N'' /*Empty Customer Name*/
 THEN
  DELETE   
WHEN MATCHED AND TS.CustomerName <> DS.CustomerName
 THEN
  UPDATE
  SET CustomerName = DS.CustomerName
WHEN MATCHED
 THEN
  UPDATE
  SET CustomerName = '+55555'


ค่าว่างในที่คือ '' หรือไม่มีค่านั่นแหละครับ (Char(0)) ไม่ใช่ค่า null นะครับ
NULL คือยังไม่ถึงเวลามีค่า อทิเช่น เด็กหญิง A ตอนนี้อายุ 5 ขวบ แน่นอนว่ายังไม่มีผัว แต่ในอนาคตไม่แน่ เผลอฯหลายคนด้วยซ้ำไปครับ

Good Lucks.


ประวัติการแก้ไข
2014-07-24 19:31:03
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-24 19:24:57 By : หน้าฮี
 


 

No. 4



โพสกระทู้ ( 174 )
บทความ ( 0 )



สถานะออฟไลน์


ขอบคุณครับ ท่านปรมาจารย์
คำสั่ง MERGE , USING ไม่เคยใช้เลยครับ

Code (SQL)
Incorrect syntax near 'MERGE'.



ผมจะลองแกะดู ครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-25 09:14:49 By : nongpaoza
 


 

No. 5



โพสกระทู้ ( 611 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 4 เขียนโดย : nongpaoza เมื่อวันที่ 2014-07-25 09:14:49
รายละเอียดของการตอบ ::


ฟังก์ชั่น Merge ใช้ได้กับ SQL Server 2008 (R2) ขึ้นไปครับ (ลืมบอกไป)

ไม่มีก็คือไม่มีนั่นแล มันยังมีอีกหนึ่งในร้อยแปดพันเก้าวิธีการ
ตรวจสอบ RowState เอาก็ได้เหมือนกันครับ
ส่วนการตรวจสอบ ColumnsState ไม่น่าจะทำได้ครับ (.NET 4.0/4.5)
(เมื่อ 2,000 ปีที่แล้ว ภาษาดีเบต/FoxPro มันตรวจสอบได้แม้กระทั่ง ColumnsState ครับ )


ผมเคยคำถามว่า "ข้อมูลไม่มีการเปลี่ยนแปลง/แก้ไข" แล้วเอ็งจะบันทึกข้อมูลลง Database ทำห่าอะไรฟ่ะ
บางคน : ร้องไห้ แย แย แย แย


น่าจะมองออกนะครับว่าผมต้องการสื่อถึงอะไร?


Code (VB.NET)
Public Class Form1 'Windows Forms Application
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim dtTemp As New DataTable()
        dtTemp.Columns.AddRange(New DataColumn() {New DataColumn("Quot_No", GetType(String)),
                                                  New DataColumn("RefNo", GetType(Integer)),
                                                  New DataColumn("CustomerName", GetType(String))})

        dtTemp.Rows.Add(New Object() {"no-1", 1, "Customer A"})
        dtTemp.Rows.Add(New Object() {"no-1", 2, "Customer B"})
        dtTemp.Rows.Add(New Object() {"no-1", 3, "Customer C"})
        dtTemp.Rows.Add(New Object() {"no-1", 4, "Customer D"})

        dtTemp.AcceptChanges() '***** 

        dtTemp.Rows(1).Item("CustomerName") = "Customer B Update" 'ทดสอบแก้ไขข้อมูล
        dtTemp.Rows(3).Delete() 'ทดสอบลบข้อมูล 
        dtTemp.Rows.Add(New Object() {"no-1", 5, "Customer E Added"}) 'ทดสอบเพิ่มข้อมูล

        Dim CheckRowsState = dtTemp.GetChanges() 'Added, Deleted, Modified

        If CheckRowsState IsNot Nothing Then
            For i As Integer = 0 To CheckRowsState.Rows.Count - 1
                If CheckRowsState.Rows(i).RowState = DataRowState.Added Then
                    MsgBox(CheckRowsState.Rows(i).Item("CustomerName")) 'Customer E Added
                End If
                If CheckRowsState.Rows(i).RowState = DataRowState.Modified Then
                    MsgBox(CheckRowsState.Rows(i).Item("CustomerName")) 'Customer B Update
                End If
                If CheckRowsState.Rows(i).RowState = DataRowState.Deleted Then
                    Dim drCol0 = CheckRowsState.Rows(i)("Quot_No", DataRowVersion.Original)
                    Dim drCol1 = CheckRowsState.Rows(i)("RefNo", DataRowVersion.Original)
                    Dim drCol2 = CheckRowsState.Rows(i)("CustomerName", DataRowVersion.Original)
                    MsgBox(drCol0 & ", " & drCol1 & ", " & drCol2) ' no-1, 4, Customer D
                End If
            Next
        End If

        dtTemp.AcceptChanges() '*****

    End Sub
End Class



จ๊ะเอ๋


ปล. แปลงเป็น C# เอาเองนะครับ (C#ข่อยเขียนบ่เป็นเด้อC#)


ประวัติการแก้ไข
2014-07-25 12:40:22
2014-07-25 12:41:57
2014-07-25 12:52:07
2014-07-25 13:00:01
2014-07-25 13:04:39
2014-07-25 13:05:12
2014-07-25 13:06:51
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-07-25 12:34:19 By : หน้าฮี
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : [C#] DataGridView - UPDATE ROW พร้อม INSERT ข้อมูลหากข้อมูลนั้นเป็นข้อมูลใหม่
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่