VisualStudioでのデータセットとデータベース接続の問題を解決するにはどうすればよいですか?

Aug 21 2020

MSAccessデータベースでVB.NETを使用しています。相互に関係のある2つのテーブルがあります。

以下に従って、データセットとバインディングソースとのデータベース接続を確立しました。

  1. 下のデータソースは、新たな追加データソースを
  2. データソースタイプとしてのデータベース
  3. データベースモデルとしてのデータセット>>
  4. 選択したデータ接続
  5. データベースオブジェクトの下で、顧客テーブルのような目的でビューをクリックしたテーブルを選択しました
  6. その後、終了します。
  7. 次に、データソースで、[データセット]、[顧客のテーブル]の順に選択し、詳細とデータグリッドビューをフォームにドラッグして、レコードの更新を追加、削除するためのボタンを追加します。
  8. 次に、アプリケーションを実行します。

アプリケーションを実行した後、データベースとの間でレコードを表示追加更新、および削除していません。

データベースにレコードを追加するためのコード

CustomersBindingSource.AddNew()

データベースへのレコードを更新するためのコード

CustomersBindingSource.EndEdit()
CustomersTableAdapter.Update(SrsbdbDataSet.Customers)

データベースからレコードを削除するためのコード

CustomersBindingSource.RemoveCurrent()

また、app.configファイルから接続文字列を編集して、接続文字列の問題を確認しましたが、問題には役立ちませんでした。

どこが間違っているのか教えてください。

回答

1 CaiusJard Aug 21 2020 at 10:37

CustomersBindingSource.AddNew()

これはアクセスデータベースにレコード追加しません。BindingSourceのリストにレコードを追加します。これは(BindingSourceでEndEditが呼び出されたときに)YourDataSetName.Customers新しいDataRowとしてDataTableにプッシュされます-すべての行を確認する場合でYourDataSetName.Customersあなたは、いくつかがあることを参照してくださいね(あなたがアプリを起動したときに、おそらくDBからダウンロード)し、彼らが持っているDataRowState変わらないのが、その後、追加した新しいものが追加されたのDataRowStateと、そこにあります

DBにはまだ何も保存されていません。このデータは、あるのみであるデータセットのデータテーブルにクライアント側の表現データベーステーブルの。それ自体はデータベーステーブルではありません。確かに、データベーステーブルよりも多くの、または少ない列とさまざまなタイプを持つことができます。これは、データベースデータの一時的なストレージにすぎません。ダウンロード、追加、変更、削除、保存などを行います。関連するDataRowは、データに対して行ったこれらすべてのことを追跡し、追加/変更/削除/変更されていないかどうかを記録します。

TableAdapterは、DataTableとデータベースの間でデータをやり取りするものです。

CustomersTableAdapter.Update()データをDBに保存するときに呼び出します。これUpdateは、SQL UPDATEクエリのみを実行すると人々に思わせるため、Microsoftに代わって名前を付けるのはくだらない考えでした。呼び出された場合SaveChanges(後で呼び出された場合、EFはSaveChangesを使用します)、より明確になります。「更新は保存を意味します」ということを覚えておく必要があります。

したがってUpdate(datatable or dataset here)、変更/削除/追加されたすべての行を含むDataTableを呼び出して渡します。TableAdapterは、DataTable全体を行ごとにスキャンして、各行のDataRowStateを確認します。追加されている場合、TableAdapterは組み込みのINSERTSQLクエリを呼び出して行を保存します。変更されている場合は、SQLUPDATEが実行されます。削除された状態はSQLDELETEを引き起こします。データ行は、ダウンロードされた元のデータと現在のデータを認識しています。これは、他の誰かが私たちが持っていた時間にこの行を保存したかどうかを判断するのに不可欠な場合があります。そのため、変更を私たちの行で上書きすることを回避できます。

このプロセスの最後に、データが保存され、行の状態がすべて変更なしに設定されました(データベース内のデータが同じになったため、行データを保存する必要がなくなりました)。

プロセスのその部分は、ファイルを編集するときにテキストエディタタブに表示される小さな*のようなものと考えてください。状態が追加/変更/削除されたデータ行には、保存する必要のある未保存の変更があります。保存後、状態は未変更に戻ります。TableAdapter.UpdateはSaveと呼ばれるべきだったと言いましたか?


全体として、保存のプロセスは、編集コントロールにEndEdit()依頼して、関連するバインディングEndEditソースに依頼することです。これにより、すべての変更がコミットされて保存の準備ができたデータテーブルが確保され、を呼び出しますtableadapter.Updateおそらく、ユーザーが入力していたコントロールは、ユーザーが保存ボタンをクリックすると、フォーカスが失われたときに編集をコミットします。ただし、endeditを呼び出すと確実になります。不明な場合は、新しいフォームを作成し、DataGridViewを[データソース]ウィンドウからドロップして、[保存]ボタンがどのように接続されているかを確認します。メモリから、検証、いくつかのEndEdits、およびUpdateAll(TableAdapterManager、 TableAdaptersを管理し、正しい順序でUpdateを呼び出して、親行が子行の前に保存されるようにします)


さらに変更を加え始めると、行の状態が再び変更されますが、以前と同様に、DBに変更をコミットするのは、どのような変更を加えたかに関係なく、TableAdapter.Update()です。


ここで最後に注意するのは、Accessがファイルベースのデータベースであるということです。おそらくあなたはあなたのプロジェクトを例えば:

C:\projects\accesswhatever\

そして、あなたは例えばあなたのデスクトップにあなたのアクセスデータベースを持っていました:

c:\users\you\desktop\access.mdb

Access DBを物事に接続すると、VSは長くて言葉の多いダイアログ(誰も読まない;))を表示し、基本的に「データベースをプロジェクトに配置し、コピーしてビルド時のbinフォルダ」

そのため、その影響を考慮せずに[OK]をクリックして、ビルドします。ディスクは次のようになります。

 C:\users\you\desktop\access.mdb                            'call it DB X
 C:\projects\accesswhatever\access.mdb                      'call it DB Y
 C:\projects\accesswhatever\bin\debug\access.mdb            'call it DB Z

実行中のプログラムは、最後のDB Zにデータを保存します。ビルドするたびに(コードを変更すると、[再生]をクリックするたびに発生する可能性があります)、Visual StudioはZを削除し、YをZにコピーします。

あなたは今本当に混乱しています。あなたのコードはそれが節約していると言っています。デスクトップのDBXまたはプロジェクトベースのDBYのいずれかを探していて、このデータが一体どこにあるのか疑問に思っていますか?

これは、DB Zのbin\debugフォルダー内のapp.exeの隣にあります。ビルドするたびに、VSは変更されたデータベースをワイプし、以前からクリーンなデータベースに置き換えることを忘れないでください。これを変更する場合は、ソリューションエクスプローラーでDBをクリックし、[出力にコピー]を[常にコピー]から[新しい場合はコピー]に設定します。これで、スキーマを変更するたびにのみコピーされるようになりました。新しいテーブルを追加すると、VSは適切にキュレートされたテストデータベースを新しいテーブルでワイプします。しかし、新しい空のDBには少なくともそれがあるため、OKのようになります。あなたのプログラムがなしでクラッシュする余分なテーブル:)

XingyuZhao Aug 27 2020 at 03:24

別の方法は、DataGridViewに直接新しいレコードを追加し、接続に新しいOleDbDataAdapterを使用することです。

'CustomersBindingSource.AddNew()'を削除し、DataGridViewでレコードを編集します。

「レコードの更新」ボタンのコード。

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim connstring = "your connection string"
    Dim adapter As OleDbDataAdapter = New OleDbDataAdapter("select * from Customer", connstring)
    Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(adapter)
    builder.QuotePrefix = "["
    builder.QuoteSuffix = "]"
    adapter.Update(CustomerDataSet.Customer)

End Sub