none
請問如何將在DataGridView上的資料,回傳到資料庫裡呢? RRS feed

  • 問題

  • 如標題!!

    目前在表單下的DataGridView1的資料,都是由很多地方回傳回來的,

    那又要如何將顯示在DataGridView1的資料,回傳到資料庫裡呢??

    附上部份程式碼......

    程式碼區塊

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     

    Dim cmd As New SqlClient.SqlCommand
            cmd = New SqlClient.SqlCommand("SELECT B_CprPInvertory.LocationID AS 物料格編號,A_Component.ComponentID AS 物料編號,B_CprPInvertory.DPNum AS 發料數量,B_CprPInvertory.DepNo2 AS 領料部門,B_CprPInvertory.Man2 AS 領料人員,B_CprPInvertory.SysID AS 系統編號,B_CprPInvertory.EquipID AS 設備編號,B_CprPInvertory.BatchNo AS 批號,B_CprPInvertory.Remark AS 備註, '' AS 系統名稱, '' AS 設備名稱 FROM  A_Component INNER JOIN B_CprPInvertory ON A_Component.ComponentID = B_CprPInvertory.ComponentID ", cn)

     

     

     

    程式碼區塊

            da.SelectCommand = cmd
            da.Fill(ds, "B_CprPInvertory")

            Dim i As Integer
            For i = 0 To ds.Tables("B_CprPInvertory").Columns.Count - 1
                DataGridView1.Columns.Add(ds.Tables("B_CprPInvertory").Columns(i).Caption, ds.Tables ("B_CprPInvertory").Columns(i).ColumnName.ToString)
            Next

            ds.Tables("B_CprPInvertory").Clear()
            DataGridView1.Columns.Clear()
            DataGridView1.DataSource = ds.Tables("B_CprPInvertory")

     

     

    • 已移動 璉璉 2010年3月6日 上午 04:00 (從:Visual Studio一般討論區(General))
    2007年12月13日 上午 06:04

解答

  • HI,

     

    在你的程式中已經有自行建立UpdateCommand, 所以可以不需要使用SqlCommandBuilder(其用途就是要自動建立InsertCommand, UpdateCommand, 與DeleteCommand), 另外資料來源如果抓兩個Table(利用Inner Join敘述), 則查詢的結果要自行寫程式更新回資料庫, 沒有辦法利用SqlCommandBuilder做到

     

    tihs

     

    • 已標示為解答 璉璉 2010年3月6日 上午 04:00
    2007年12月17日 上午 08:36

所有回覆

  • 如果資料來源是來自單一表格,可以用 SQL 直接操作,或用 DataAdapter.Update() 直接做更新。

    但必須要:

    • 資料有改過(DataRow.RowState 是 Added, Modified, Deleted 其中之一)。
    • DataAdapter.InsertCommand, DataAdapter.UpdateCommand 與 DataAdapter.DeleteCommand 必須要設定。

    才可以經由 DataAdapter.Update() 寫入資料庫。

     

    但如果是來自多表格,那就得各自更新,沒有一次可更新數個表格的方法,並且最好加入 Transaction 功能,否則會有更新不完全的問題。

    2007年12月13日 上午 06:31
    版主
  • 不好意思!! 因為我沒有寫過將資料傳回到資料庫過,

    所以還是不太清楚要怎麼寫這個過程,

    所以,再次麻煩你們了。

    因為一開始連接的來源就不只一個資料來源,那麼再請問要如何將多表格,各自更新回去呢?

    又要如何使用Transaction 功能呢??

     

    因為是使用一個Button按鈕,將資料回傳到來源的資料庫裡。

    那麼我是在Form_Load,將資料回傳呢?

    還是在Button_Click,將資料回傳呢?

     

    2007年12月14日 上午 01:08
  • HI,

     

    沒有寫過將資料傳回到資料庫的程式, 那您可能要先看一點ADO.NET相關的書或文件, Transaction可以查SqlTransaction, TransactionScope, 和CommittableTransaction類別的說明

     

    將資料寫回資料庫的動作寫在Button的Click事件即可

     

    tihs

    2007年12月14日 上午 01:40
  •  新手上路min 寫信:

    不好意思!! 因為我沒有寫過將資料傳回到資料庫過,

    所以還是不太清楚要怎麼寫這個過程,

    所以,再次麻煩你們了。

     

    沒寫過就試寫啊。

    這能當做理由嗎?

     

     新手上路min 寫信:

    因為一開始連接的來源就不只一個資料來源,那麼再請問要如何將多表格,各自更新回去呢?

    又要如何使用Transaction 功能呢??

     

    如果沒寫過 SQL,就去買本 SQL 的書來看,

    更新多表格只是操作多個 UPDATE 指令而已。

     

    Update Data Source by using DataAdapter:

    http://msdn2.microsoft.com/zh-tw/library/33y2221y(VS.80).aspx

    Perform Transaction:

    http://msdn2.microsoft.com/zh-tw/library/2k2hy99x(VS.80).aspx

     

     新手上路min 寫信:

    因為是使用一個Button按鈕,將資料回傳到來源的資料庫裡。

    那麼我是在Form_Load,將資料回傳呢?

    還是在Button_Click,將資料回傳呢?

     

    你都已經說在 Button 下指令了。

    不必多說,試寫就對了。

    2007年12月14日 上午 02:05
    版主
  • 以下是我看了一些參考後,所寫的,但還是有錯,無法將資料回傳到資料庫裡,

    目前先試著傳回一個欄位LocationID,但執行到row("LocationID") = "new B_CprPInvertory"

    出現資料行 'LocationID' 不屬於資料表 B_CprPInvertory。

    請問是我那裡寫錯呢??

     

    雖然看了執行交易,但還是不懂要怎麼寫........

    Perform Transaction:

    http://msdn2.microsoft.com/zh-tw/library/2k2hy99x(VS.80).aspx

     

    程式碼區塊

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

     

      Dim cmd As New SqlClient.SqlCommand
            cmd = New SqlClient.SqlCommand("SELECT B_CprPInvertory.LocationID AS 物料格編號,A_Component.ComponentID AS 物料編號,B_CprPInvertory.DPNum AS 發料數量,B_CprPInvertory.DepNo2 AS 領料部門,B_CprPInvertory.Man2 AS 領料人員,B_CprPInvertory.SysID AS 系統編號,B_CprPInvertory.EquipID AS 設備編號

     FROM  A_Component INNER JOIN B_CprPInvertory ON A_Component.ComponentID = B_CprPInvertory.ComponentID ", cn)

     

            da.SelectCommand = cmd
            da.Fill(ds, "B_CprPInvertory")

       Dim builder As SqlClient.SqlCommandBuilder = New SqlClient.SqlCommandBuilder(da)


            da.UpdateCommand = New SqlCommand("Update B_CprPInvertory Set LocationID=@LocationID" & "DepNo2=@DepNo2" & "Man2=@Man2" & "SysID=@SysID" & "EquipID=@EquipID" WHERE  LocationID=@LocationID" & "DepNo2=@DepNo2" & "Man2=@Man2" & "SysID=@SysID" & "EquipID=@EquipID", cn)


         da.UpdateCommand.Parameters.Add("@LocationID", SqlDbType.VarChar, 20, "LocationID")


     

            Dim parameter As SqlParameter = da.UpdateCommand.Parameters.Add("@LocationID", SqlDbType.Int)
            parameter.SourceColumn = "LocationID"
            parameter.SourceVersion = DataRowVersion.Original


            Dim row As DataRow = ds.Tables("B_CprPInvertory").Rows(0)
            row("LocationID") = "new B_CprPInvertory"

                   
            da.Update(ds, "B_CprPInvertory")

        End Sub

     

     

     

    2007年12月14日 上午 07:32
  • HI,

     

    row("LocationID") = "new B_CprPInvertory"

     

    這行程式有錯, 可能的原因是欄位名稱(Location)寫錯了

     

    tihs

    2007年12月15日 上午 04:58
  • Hi    tihs

     

    執行上還是有問題,想請問一下,幾個問題.......

    1.因為之前看過一些別人的文章,也說過,如果用在有關聯式的資料來源,就必須用SqlCommandBuilder

    自動產生單一資料表命令,用於調節對具有關聯 SQL Server 資料庫之 DataSet 的變更。這個類別無法被繼承。

    但是查了一下文件之後,有點不是很懂,因為我的資料來源是從兩個資料庫抓出來的,

    但是如果使用SqlCommandBuilder的話,它只會對單一個資料表產生命令,

    那和關聯的又有什麼地方有用到呢?

    這點不是很懂...........如果可以的話,是否可以講比較白話文的意思讓我了解一下呢??

    再請問一下,目前我寫的程序是正確的嗎?

     

     

    2007年12月17日 上午 02:09
  • HI,

     

    在你的程式中已經有自行建立UpdateCommand, 所以可以不需要使用SqlCommandBuilder(其用途就是要自動建立InsertCommand, UpdateCommand, 與DeleteCommand), 另外資料來源如果抓兩個Table(利用Inner Join敘述), 則查詢的結果要自行寫程式更新回資料庫, 沒有辦法利用SqlCommandBuilder做到

     

    tihs

     

    • 已標示為解答 璉璉 2010年3月6日 上午 04:00
    2007年12月17日 上午 08:36