如何解决Visual Studio中的数据集和数据库连接问题?

问题描述

我正在将VB.NET与MS Access数据库一起使用。有两个相互关联的表。

我遵循以下步骤与数据集和绑定源建立数据库连接。

  1. 数据源添加新的数据源
  2. 数据库作为数据源类型
  3. 数据集作为数据库模型>>
  4. 选择数据连接
  5. 数据库对象下,我选择了想要客户表等目的的表,也单击了视图
  6. 然后完成。
  7. 现在位于数据源,选择数据集,然后选择客户表,然后将详细信息和数据网格视图拖动到表单中,并添加用于添加的按钮,删除更新记录。
  8. 现在运行该应用程序。

运行应用程序后,它不是从/记录查看添加更新删除记录到数据库

用于将记录添加数据库代码

CustomersBindingSource.AddNew()

用于将记录更新到数据库代码

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

用于从数据库删除记录的代码

CustomersBindingSource.RemoveCurrent()

我还编辑了app.config文件中的连接字符串,以检查连接字符串问题,但对该问题没有帮助。

请让我知道我在哪里做错了。

解决方法

CustomersBindingSource.AddNew()

这不会在访问数据库中添加记录 ,而是将记录添加到BindingSource的列表中(当在BindingSource上调用EndEdit时)将其推入YourDataSetName.Customers DataTable作为新的DataRow-如果要查看YourDataSetName.Customers中的所有行,您会发现其中有些行(可能是在启动应用程序时从数据库下载的),并且其中有{{3} },然后添加了一个新数据,其中DataRowState已添加

尚未将任何内容保存到数据库。该数据仅在数据集的数据表中为 ,该数据表是数据库表的客户端表示。它本身不是数据库表。它当然可以比数据库表具有更多或更少的列和不同类型。它只是数据库数据的临时存储;您可以下载,添加,更改,删除,也许保存等。相关的DataRow会跟踪您对数据所做的所有操作,并记录是否已添加/修改/删除/未更改等

TableAdapter是在DataTable和数据库之间来回推送数据的东西

要将数据保存到数据库时,请致电CustomersTableAdapter.Update()。命名Update代表Microsoft是一个废话,因为它使人们认为它仅执行SQL UPDATE查询;如果它被称为SaveChanges(后来是EF;使用EF的SaveChanges),它将更加清晰。。您只需要记住一个-“更新即保存”

因此,您调用Update(datatable or dataset here)并将其所有修改/删除/添加的行传递给DataTable。 TableAdapter逐行扫描整个DataTable,查看每行的DataRowState。如果已添加,则TableAdapter将调用其内置的INSERT SQL查询以保存行。如果已修改,则执行SQL UPDATE。删除状态会导致SQL DELETE。数据行知道下载的原始数据和现在的数据。有时候这对于确定是否有人在我们拥有该行时保存了这一行至关重要,因此我们可以避免用我们的行覆盖他们的更改

在此过程结束时,已保存数据,所有行状态都从其原来的状态设置为Unchanged(因为现在数据库中的数据相同,因此不再需要保存行数据)。

在编辑文件时,过程的这一部分就像在文本编辑器选项卡上显示的小*一样-处于“已添加/已修改/已删除”状态的数据行具有未保存的更改,需要保存。保存后,状态返回到未更改。我是否提到过TableAdapter.Update应该被称为“保存”?


总而言之,保存的过程将是要求编辑控件进入EndEdit(),然后将相关的绑定源请求到EndEdit-这样可确保我们拥有一个已提交并准备保存所有更改的数据表,然后呼叫tableadapter.Update。用户输入的可能控件在失去焦点时会提交其编辑内容,因为用户单击“保存”按钮即可。但是调用endedit可以确保。如果您不确定,请创建一个新表单,将其上的DataGridView放到“数据源”窗口之外,然后查看保存按钮的连线方式-从内存中执行Validate,EndEdits和UpdateAll(TableAdapterManager,管理TableAdapter,以正确的顺序对其进行调用,以确保父行保存在子行之前


如果您开始进行更多修改,则行状态将再次更改,但是就像以前一样,将更改提交到数据库的是TableAdapter.Update(),无论您进行了哪种更改


这里要注意的最后一件事是Access是基于文件的数据库。可能您的项目位于例如:

C:\projects\accesswhatever\

例如,您可以访问数据库您的桌面:

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

当您将访问数据库连接到事物中时,VS会显示一个冗长而冗长的对话框(没有人会读到;)),它基本上说“ ”,我会将数据库放入您的项目中,然后在构建时将其复制到bin文件夹中。

因此,单击“确定”而不考虑其后果,然后进行构建。您的磁盘现在看起来像:

 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。 / p>

您现在真的很困惑;您的代码表示正在保存。您正在桌面上查看DB X,还是在项目库中查看DB Y,想知道这些数据到底在哪里?

它位于DB Z中,位于app.exe旁边的bin\debug文件夹中-请记住,每次构建时,VS都会擦除已更改的数据库,并从很早以前就将其替换为干净的数据库。如果要更改此设置,请在解决方案资源管理器中单击数据库,然后将“复制到输出”从“始终复制”设置为“如果更新则复制”。现在,它仅在您更改模式时才会复制,因此。.添加一个新表,然后VS将使用一个新表擦除您精心策划的测试数据库。.但更像是OK,因为新的空数据库至少具有您的程序将崩溃时没有:)的额外表

,

另一种方法是直接在DataGridView中添加新记录,并使用新的OleDbDataAdapter进行连接。

删除“ CustomersBindingSource.AddNew()”,然后在DataGridView中编辑记录:

enter image description here

“更新记录”按钮中的代码。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...