2016-11-23 6 views
-1

私はこれを初めてやっています。私はいくつかのガイダンスが必要です。私はDatagridviewsをデータソースに設定しました。今、レコードをDBから適切に更新または挿入するにはどうすればいいですか?Datagridview - 更新/挿入の適切なワット

私の質問:

  1. 現在、私のような/アップデートの追加/削除(Datagridviews下のいずれかのボタンを持っていけない - 私は間違いなくそれらを必要としたりせずに、すべてのアクションを処理することが可能であるか - Iドン? TableAdapterManagerを使用しないでください)

  2. MERGEステートメント - 特定のテーブルとDatagridviewを比較し、同じテーブルに更新または挿入を実行するために使用できますか?

  3. 手動でINSERTまたはUPDATEを実行する場合は、まず何が行われ、何を行う必要があるかを確認する方法はありますか?

私は出回っ両方を行うためのコードを持っていますが、それが必要として動作していない、問題は、私は1つだけ、フォーム上のデータを保存するためのボタンがあるということです - そしてそのボタンをDBにデータを挿入または更新する必要がありフォーム上の2 Datagridviews + Databinded Textboxから。したがって、基本的に同じフォームで更新/挿入できる3つのテーブルがあります - Datagridviewsは関連データを表示し、Databinded Texboxesはマスターテーブルレコードを表示します。

ご迷惑をおかけして申し訳ございません。

EDIT(ここでは私の完全なコードです - 最初のデータをロードするにはBtn_Saveのコードは、その後、フォームおよびデータグリッドに):

Imports System.Data 
Imports Oracle.DataAccess.Client ' ODP.NET Oracle managed provider 
Imports Oracle.DataAccess.Types 

Imports System.IO 
Imports System 
Imports System.Windows.Forms 
Imports System.ComponentModel 

Public Class Form2 

    Private da, da1 As OracleDataAdapter 
    Private cb, cb1 As OracleCommandBuilder 
    Private ds, ds1 As DataSet 
    Public OpenedForm1 As Form1 'required for obtaining record ID - this form opens when user double clicks on datagridview record 

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
      BtnSave.Enabled = False 'for eliminating errors when using dataset Update (Oracle recommendation) 
      Dim SQL1 As String = "SELECT * from TABLE1 WHERE ID_Table1=" & OpenedForm1.DataGridView1.CurrentRow.Cells(0).Value.ToString 
      Dim DGV1_SQL As String = "SELECT ID_TABLE2, ID_TABLE1, Name, Surname, WHERE ID_TABLE1=" & OpenedForm1.DataGridView1.CurrentRow.Cells(0).Value.ToString 
      Dim DGV2_SQL As String = "SELECT TABLE3.SERIAL, TABLE3.MODEL," _ 
     & " TABLE3.TYPE FROM TABLE3 INNER JOIN (TABLE1 INNER JOIN TABLE1_TABLE3 ON TABLE1.ID_Table1=TABLE1_TABLE3.ID_Table1_FK) ON " _ 
     & "TABLE3.ID_Table3=TABLE1_TABLE3.ID_Table3_FK WHERE TABLE1_TABLE3.ID_TABLE1_FKK=" & Openedform1.DataGridView1.CurrentRow.Cells(0).Value.ToString 

     Try 

      Oracleconn() 

'Then I do all DB queries and display results on form 
'For SQL1 Databind all textboxes – this is a master record on form 
'For DGV2_SQL and DGV2_SQL fill datasets and set Datagrids to datasource 
'I'm also hiding all primary key fields and bounding datagrids to Binding sources to enable Binding navigators under them. 

    End Sub 


     Private Sub BtnSave_Click(sender As Object, e As EventArgs) Handles BtnSave.Click 

'First I assign some variables for Oracle parameters, such as dealing with Null Date values 

      Oracleconn() 'My connection to DB 

     Using cmd As OracleCommand = New OracleCommand() 

      cmd.Connection = Oracleconn() 
      cmd.Parameters.Clear() 

'Adding a lot of paramters here for master record like this... 
      cmd.Parameters.Add(New OracleParameter("ID", TxtID.Text)) 
)) 
'Only Update for master record – Textboxes on form – works just fine 
      cmd.CommandText = "UPDATE TABLE1" _ 
       & " SET ID_TABLE1= : id .etc 

      If Not (TxtSerial.Text = "" Or TxtInventar.Text = "11111" Or TxtInventar.TextLength < 9) Then 

       cmd.ExecuteNonQuery() 
       cmd.Parameters.Clear() 

'Then checking 1st datagridview for data in It 
       For Each row As DataGridViewRow In DGV1.Rows 

        If row.Cells(1).Value <> Nothing Then 

         'Adding parameters again 

'Then my attempt for doing update or Insert with MERGE – doesn't work 

         cmd.CommandText = "MERGE INTO TABLE2 v" _ 
          & "USING (SELECT * FROM TABLE2 WHERE ID_TABLE2='" & row.Cells(1).Value & "') u" _ 
          & " ON u.ID_TABLE2" _ 
          & " WHEN MATCHED THEN UPDATE SET all fields except ID's " _ 
         ' & " WHEN NOT MATCHED BY v" _ 
         ' & " THEN INSERT... all fields" _ 
         ' & " VALUES.... from parameters" 

cmd.ExecuteNonQuery() 
         cmd.Parameters.Clear() 

         'This was used before, but ofcourse It only updates 
         da.Update(ds.Tables(0)) 

         BtnSave.Enabled = True 

        Else 
         MsgBox("You cannot save without 1st field empty !") 
         Exit For 
        End If 

       Next 

'Then check for next Datagrid – this one is hard, It's a joined Table(entitity) from Table1 and Table3, with showing data from that joined Table too 
       For Each row As DataGridViewRow In DGV2.Rows 

'Adding parameters and just performing update – didn't start the Insert so far 

       MsgBox("Saved.", MsgBoxStyle.Information, "Editing records") 

       'Refresh Datagridview in Form1 - which is also opened 
       OpenedForm1.BtnSearch() 

      Else 
       MsgBox("1st field is required to be filled If you want to save.", MsgBoxStyle.Exclamation, "Editing records") 

      End If 

     End Using 

     OracleClose() 'close my connection 

    End Sub 
+0

Ple aseはあなたのコードを示しています。たとえそれが動作しなくても。 –

+0

@Alexb、Ok、ちょっと時間が必要です。すぐ戻るでしょう。 – LuckyLuke82

+0

@AlexB。ここには、私はそれを変更するには時間をかけなければならなかった、私の元のコードは投稿するには長すぎます。 – LuckyLuke82

答えて

1

あなたは基本的に第1のインサートを行う必要があり、その後の更新は、その後、削除します。あなたは子供の前に親を挿入しなければなりません。外来キーがカスケード削除されない限り、親の前に子供を削除してください。更新に関しては、順序は関係ありません。例えば。

Dim parentAdapter As SqlDataAdapter 
Dim childAdapter As SqlDataAdapter 

Dim data As DataSet 

Dim parentTable As DataTable 
Dim childTable As DataTable 

'... 

Dim parentInserts = parentTable.GetChanges(DataRowState.Added) 
Dim parentUpdates = parentTable.GetChanges(DataRowState.Modified) 
Dim parentDeletes = parentTable.GetChanges(DataRowState.Deleted) 

Dim childInserts = childTable.GetChanges(DataRowState.Added) 
Dim childUpdates = childTable.GetChanges(DataRowState.Modified) 
Dim childDeletes = childTable.GetChanges(DataRowState.Deleted) 

If parentInserts IsNot Nothing Then 
    parentAdapter.Update(parentInserts) 
End If 

If childInserts IsNot Nothing Then 
    childAdapter.Update(childInserts) 
End If 

If parentUpdates IsNot Nothing Then 
    parentAdapter.Update(parentUpdates) 
End If 

If childUpdates IsNot Nothing Then 
    childAdapter.Update(childUpdates) 
End If 

If childDeletes IsNot Nothing Then 
    childAdapter.Update(childDeletes) 
End If 

If parentDeletes IsNot Nothing Then 
    parentAdapter.Update(parentDeletes) 
End If 

data.AcceptChanges() 
+0

私はまだ混乱しています。それぞれの行動にボタンが必要ですか?そうでない場合は、コードで処理する方法は?...私はレコードを表示してdatagridviewを持っているとしましょう:私は最初の行を変更し、それを完全にdiferrentで書く。 2列目では、いくつかのフィールドを変更するだけです。そして、3行目(空の行)に別の新しいレコードを追加します...コードは、削除、更新、挿入する必要があることをどのように知っていますか? – LuckyLuke82

+0

'DataRowState'はあなたの友人です。更新のために、通常、特別なボタンは必要ありません。追加/削除にはいくつかのオプションがあります:コンテキストメニュー、キーボードショートカット、ボタン、... –

+0

私はあなたに何をすべきかを示しました。私が提供したコードは、あなたが望むすべてを行います。あなたはそれを全く勉強するのに気にかけましたか?あなたは 'DataTable'で' GetChanges'と呼んでいると思いますか?たぶんそれは、その 'DataTable'からの変更を取得します。 'GetChanges'を呼び出すときに、' Added'、 'Modified'、' Deleted'の 'DataRowState'を渡すとどうでしょうか?たぶん、そのタイプに変更を制限するかもしれません。あなたが必要とするのは、保存を開始し、私が提供したコードを実行するだけです。すべてが保存されます。明らかにあなたのデータを扱うために名前を変更する必要がありますが、私は理由のためにそのコードを提供しました。 – jmcilhinney

0

私が正直に私はそれを前にしたので私ができるように、最高の正直な方法にあなたに答えさせてください。

私はProgを使ったものに基づいて回答します。 Lang。そしてデータベースと幸いVB.Netは私の言語で、MySQLはデータベースです。

私の回答:(あなたの質問順)

1.Yourあなたがそれらを必要とするかどうかを尋ねますか?私のためにはい!私はそれをしたので、

  • Button: Addは、テーブル内のすべてのあなたのDataGridViewのデータを保存します(追加、更新、削除)(データが移入)DatagridViewと3 Buttonsとフォームと考えてください。いくつかのリンクやチュートリアルが表示されますhere
  • Button: Editは、選択した内容に基づいて特定のデータを更新しますhere。私がしたことは、それらをテキストボックスに転送し、更新を行うことです。
  • Button: Deleteはactullyボタンupdateからのリンクは、あなただけのYESそれとDelete Query

2.10000パーセントを編集しますあなたのガイドになりますあなたの選択された行に基づいてデータを削除します! thisを参照してください。その出力は、両方が同じ場合、datagridviewに色を設定することです。 (音は出ていますか?manualyは私のために難しいだろう3.Doing D)

はそうここに私のヒントは、あなたのDataGridViewを編集いけない理由は、その後Update CommandのDataGridViewが編集可能なんですが、plsはそれがあるので、更新されません少なくとも1列を提供します。それを愛しますあなたのwhere clause

の基本はそうそこに行く私は私が知っているすべてを言ったし、それはあなたが覚えている

をコーディングするので、幸運と幸せに従わなければならないものにあなたに依存します:1つの出力をコーディングで Theresの無間違って何千もの実行方法

+0

複数のボタンは必要ありません。グリッドデータソースに新しい行を追加するには、データ入力行を一番下に入力します。その行に入力するだけで、既存の行を更新します。行を選択し、Deleteキーを押して行を削除します。作業が完了したら、一度にたくさん保存してください。 – jmcilhinney

+0

@jmcilhinney非常に感謝してくれてありがとうございました。私が言ったように、私は何をしたのか、何をする必要がないのかに基づいて答えをくれました。その唯一の意見はとにかく感謝:) –

+0

@ShadowFiend、応答のおかげだが、私はあなたが2番目の答えの意味はわからない、私はMERGEコマンドとの関係は表示されません? – LuckyLuke82

関連する問題