Bagaimana mengatasi masalah dengan koneksi DataSet dan Database di Visual Studio?

Aug 21 2020

Saya menggunakan VB.NET dengan database MS Access. Ada dua tabel yang memiliki hubungan satu sama lain.

Saya mengikuti yang berikut ini untuk membuat koneksi database dengan dataset dan Sumber mengikat.

  1. Di bawah Sumber Data tambahkan Sumber Data baru
  2. Database sebagai tipe sumber data
  3. Dataset sebagai model database >>
  4. Koneksi data yang dipilih
  5. Di bawah objek database , saya memilih Tabel yang diinginkan untuk tujuan seperti tabel pelanggan juga diklik pada tampilan
  6. Lalu selesaikan.
  7. Sekarang di Sumber data , pilih Kumpulan Data lalu Tabel Pelanggan dan seret detail dan tampilan kisi data ke formulir dan tambahkan tombol untuk menambahkan, menghapus pembaruan catatan.
  8. Sekarang jalankan aplikasinya.

Setelah menjalankan aplikasi, Tetapi itu tidak melihat , menambah , memperbarui , dan menghapus catatan dari / ke database.

Kode untuk menambahkan record ke database

CustomersBindingSource.AddNew()

Kode untuk memperbarui record ke database

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

Kode untuk menghapus record dari database

CustomersBindingSource.RemoveCurrent()

Saya juga mengedit string koneksi dari file app.config untuk memeriksa masalah string koneksi tetapi tidak berguna untuk masalah tersebut.

Tolong beri tahu saya di mana kesalahan saya.

Jawaban

1 CaiusJard Aug 21 2020 at 10:37

PelangganBindingSource.AddNew ()

Ini tidak menambahkan record ke database akses , ia menambahkan record ke daftar BindingSource, yang (saat EndEdit dipanggil di BindingSource) didorong ke YourDataSetName.CustomersDataTable sebagai DataRow baru - jika Anda melihat semua baris di YourDataSetName.CustomersAnda akan melihat bahwa ada beberapa (diunduh dari db mungkin, ketika Anda memulai aplikasi) dan mereka memiliki DataRowState dari Tidak Berubah, dan kemudian ada yang baru yang Anda tambahkan, dengan DataRowState Ditambahkan

Belum ada yang disimpan ke DB. Data ini hanya ada dalam set data yang dapat diakses, yang merupakan representasi sisi klien dari tabel database. Ini bukan tabel database itu sendiri. Ini pasti dapat memiliki lebih banyak atau lebih sedikit kolom dan jenis yang berbeda, daripada tabel database. Ini hanya penyimpanan sementara untuk data database; Anda mengunduh beberapa, menambahkan beberapa, mengubah beberapa, menghapus beberapa, mungkin menyimpannya, dll. DataRow yang relevan melacak semua hal yang Anda lakukan pada datanya dan mencatat apakah itu Ditambahkan / Dimodifikasi / Dihapus / Tidak Berubah dll

TableAdapter adalah hal yang mendorong data bolak-balik antara DataTable dan database

Anda menelepon CustomersTableAdapter.Update()ketika Anda ingin menyimpan data ke DB. Penamaan itu Updateadalah ide omong kosong atas nama Microsoft, karena itu membuat orang berpikir itu hanya melakukan query SQL UPDATE; jika sudah dipanggil SaveChanges(dan kemudian dipanggil ; EF menggunakan SaveChanges) akan lebih jelas .. Anda hanya perlu mengingat yang satu - "Perbarui berarti Simpan"

Jadi Anda memanggil Update(datatable or dataset here)dan meneruskan DataTable Anda dengan semua barisnya yang dimodifikasi / dihapus / ditambahkan. TableAdapter memindai seluruh DataTable baris demi baris dengan melihat DataRowState dari setiap baris. Jika Ditambahkan, maka TableAdapter akan memanggil kueri INSERT SQL bawaannya untuk menyimpan baris. Jika Diubah, SQL UPDATE dilakukan. Keadaan terhapus menyebabkan SQL DELETE. Datarow mengetahui data asli yang diunduh dan data seperti sekarang; terkadang hal ini penting untuk dilakukan jika orang lain menyimpan baris ini pada waktu yang kita miliki, jadi kita dapat menghindari menimpa perubahan mereka dengan milik kita.

Pada akhir proses ini, data telah disimpan, semua kondisi baris telah diatur dari apa pun sebelumnya, ke Tidak berubah (karena data di db sekarang sama, data baris tidak perlu lagi disimpan).

Bayangkan bagian proses itu seperti * kecil yang muncul di tab editor teks, saat Anda mengedit file - sebuah datarow dalam status Ditambahkan / Dimodifikasi / Dihapus memiliki perubahan yang belum disimpan yang perlu disimpan. Setelah menyimpan, status kembali ke Tidak Berubah. Apakah saya menyebutkan bahwa TableAdapter.Update seharusnya disebut Simpan?


Secara keseluruhan, proses untuk menyimpan akan meminta kontrol pengeditan untuk EndEdit()kemudian meminta bindingsource yang relevan ke EndEdit- ini memastikan kita memiliki data dengan semua perubahan yang dilakukan dan siap untuk disimpan, dan kemudian memanggil tableadapter.Update. Mungkin kontrol yang diketik pengguna akan melakukan pengeditan ketika kehilangan fokus, karena pengguna mengklik tombol simpan .. Tapi memanggil endedit memastikan. Jika Anda tidak yakin, buat formulir baru, letakkan DataGridView di atasnya dari jendela Sumber Data dan lihat bagaimana tombol Simpan terhubung - dari memori ia melakukan Validasi, beberapa EndEdits dan UpdateAll (TableAdapterManager, mengelola TableAdapters, memanggil Perbarui pada mereka dalam urutan yang benar untuk memastikan bahwa baris induk disimpan sebelum baris anak)


Jika Anda mulai membuat lebih banyak modifikasi, status baris akan berubah lagi tetapi seperti sebelumnya, hal yang melakukan perubahan ke DB adalah TableAdapter.Update () terlepas dari jenis perubahan yang Anda buat


Hal terakhir yang harus diperhatikan di sini adalah Access adalah database berbasis file. Mungkin Anda memiliki proyek Anda di misalnya:

C:\projects\accesswhatever\

Dan Anda memiliki akses db di misalnya desktop Anda:

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

Ketika Anda menghubungkan akses db ke dalam berbagai hal, VS menampilkan dialog yang panjang dan bertele-tele (yang tidak dibaca oleh siapa pun;)) di mana pada dasarnya dikatakan "saya akan meletakkan db di proyek Anda, dan saya akan membuatnya menyalin ke folder bin saat Anda membangun " .

Jadi Anda mengklik OK tanpa mempertimbangkan akibatnya dan Anda membangunnya. Disk Anda sekarang terlihat seperti:

 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

Program Anda yang sedang berjalan akan menyimpan data yang terakhir, DB Z. Setiap kali Anda membangun (yang mungkin terjadi setiap kali Anda mengklik putar, jika Anda membuat perubahan kode), studio visual akan menghapus Z dan menyalin Y ke Z.

Anda sekarang benar-benar bingung; kode Anda mengatakan itu hemat. Anda mencari di DB X di desktop Anda, atau DB Y di basis proyek Anda, dan bertanya-tanya di mana sebenarnya data ini?

Ada di DB Z, di bin\debugfolder, di sebelah app.exe Anda - ingatlah bahwa setiap kali Anda membangun, VS menghapus database Anda yang diubah dan menggantinya dengan yang bersih dari dulu. Jika Anda ingin mengubahnya, klik DB di explorer solusi dan atur "Salin Ke Output" dari "Salin Selalu" ke "Salin Jika Lebih Baru". Sekarang itu hanya akan menyalin setiap kali Anda membuat perubahan skema, jadi .. Tambahkan tabel baru dan kemudian VS akan menghapus tes db Anda yang dikurasi dengan baik dengan yang baru .. Tapi itu lebih baik karena DB kosong baru setidaknya memiliki itu tabel tambahan yang program Anda akan macet tanpa :)

XingyuZhao Aug 27 2020 at 03:24

Alternatifnya adalah menambahkan catatan baru secara langsung di DataGridView dan menggunakan OleDbDataAdapter baru untuk koneksi.

Hapus 'CustomersBindingSource.AddNew ()', dan edit catatan di DataGridView:

Kode di tombol 'Perbarui Rekam'.

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