如何使用 BindingSource 插入 SQL 服务器

How to Insert Into SQL Server Using BindingSource

我想从 SQL 服务器插入数据库,其中 BindingSource 在 Windows 表单和 VB.

现在我有一个 DataTable,它的 DataTableAdapter 处于 'Details' 模式,还有一堆 TextBox(和其他控件,但这不是问题),它们的 Text 属性绑定到我的 BindingSource。

如果我填充 TableAdapter XDataTableAdapter.Fill(XDataSet.XTable) 那些 TextBox 接收来自第一个条目的数据,并且 BindingSource 具有数据库中的每一行和每一列值,因此 BindingSource 和适配器工作。

我不想修改现有条目,而是想插入一个新条目,其内容与 link 在各种文本框中编辑的内容相同。

我被告知我应该使用 XBindingSource.AddNew() 最后,一旦我确定了文本框中的数据 XDataTableAdapter.Update(XDataSet.XTable).

问题是,在我执行 AddNew 之前,我的 BindingSource 可以读取正在写入的内容。但是一旦我到达 AddNew,BindingSource 的计数就会递增 1,但是无论 TextBoxs 的内容如何,​​其当前行的项目都是空的。

所以问题是,在 BindingSource.AddNew 之后,数据库中的行正确地包含了它的值,但是当前的新行没有从文本框的绑定源中读取它们是空的。是否有 BindingSource 执行的任何指令,以便它知道新行应该读取文本框?

所以当我到达更新指令时,新行是空的,所以它不会改变任何东西。

我的问题是,我如何告诉 BindingSource 新的当前行是在 TextBox 中写入的内容。

我只是想直接从控件绑定中插入我的数据库,而不必手动 link 每个。

如果可以的话,我会纠正一些误解;希望它能帮助您了解正在发生的事情:

Right now I have a DataTable with its DataTableAdapter in 'Details' mode and a bunch of TextBoxs (and other Controls, but that isn't the issue) whose Text attributes are bound to my BindingSource.

你有一个 TableAdapter - 当你使用这种访​​问数据库的方法时,VS 为你生成的事物类型的通用名称。请务必将它们称为 TableAdapter,因为这是我们对它们的认识,它们与 DataAdapter 不同,DataAdapter 是访问数据库的更基本的东西。如果您将其称为 DataTableAdapter

,人们可能会对您的意思感到困惑

TableAdapter 没有“详细信息”模式。 “详细信息”指的是您在数据源中所做的事情 window - 您将 datagrid 更改为 details 然后拖动一个节点表示一个 datatable 到表单上,出现了一堆文本框等,还有一个 table 适配器、数据集、绑定源、绑定导航器,也许还有一个 table适配器管理器。此时除了 运行 程序你什么也做不了,它将能够保存新数据。 “详细信息”的意思是“创建一堆文本框而不是数据网格”并且是数据源的函数 window only

If I fill the TableAdapter XDataTableAdapter.Fill(XDataSet.XTable) those TextBoxs receive the data from the first entry, and BindingSource has every row from the db and every column value, so BindingSource and the adapters work.

同样,稍微调整一下术语:您不填充 TableAdapter,TableAdapter 是一种填充数据的设备table。它填充的数据table 存在于数据集中。绑定源绑定(连接)到数据table。 datatable 保存从数据库下载的本地数据的缓存。文本框绑定到绑定源。因为文本框一次只能显示一条记录,所以绑定源会保留“当前”记录的信息。绑定导航器(工具栏)移动绑定源的当前指针,这会导致文本框更改值。您可以使用文本框更改值或添加新值。这会导致绑定源将更改传输到基础数据table,影响它认为是“当前”行的任何行。在某些时候,您将更改的数据 table 保存回数据库。基础数据table 行从未更改(下载时的状态)更改为已修改。这就是 table 适配器如何知道 运行 SQL UPDATE 查询 - 它查看行的状态

Instead of modifying the existing entries I would like to insert a new one with its contents as those linked in the various TextBoxs. I was told I should then use XBindingSource.AddNew() and lastly, once I am certain of the data in the TextBoxs XDataTableAdapter.Update(XDataSet.XTable).

你确实可以做到这一点。 bindingnavigator 上有一个 + 按钮可以执行此操作,或者您可以编写一些其他代码来调用 bindingsource 上的 AddNew()。当您调用 AddNew 时,绑定源会创建一个新数据行 ,但它不会立即向数据table 添加任何内容。当您将绑定源告诉 AddNew 时,它将切换为将其当前指向新项目,所有文本框变为空白,您可以在其中键入新的详细信息。这些详细信息将进入新的临时行,但请记住,该行还不是基础数据的一部分table

The problem is, before I execute AddNew my BindingSource can read what is being written. But once I reach AddNew, the count of BindingSource increments in 1, but the Items of its current row are empty, regardless of the content of the TextBoxs.

这不是问题,这是设计使然。它只是与打开 Word 并编写文档相同——它还没有保存在您的硬盘上,它只是在内存中。您需要做一些事情来将其提交到硬盘,就像您需要对绑定源做一些事情以使其将新项目提交到底层数据存储中一样(数据table)

要使其提交,您需要执行以下操作:导航到另一条记录,或在绑定源上调用 EndEdit()。此时它将行添加到底层 table 并且这个新行的 RowState 为 Added - 这意味着当 table 适配器 运行s 它的更新(实际上应该被称为保存)它将使用内置的 SQL INSERT 查询来保存行;因为它是 Added/new/needs 插入到 DB

So the issue is, after BindingSource.AddNew, the rows from the db contain its values correctly, but the current new one has them empty, without reading from the bindingsources of the textboxes. Is there any instruction for BindingSource to execute so it knows that the new row should read the textboxs?

我认为你做事的顺序不对。你应该添加新,然后用新数据填充文本框,然后做一些事情,比如离开新数据,或者点击保存或其他一些按钮,在 form/the 绑定源。新行的提交发生在绑定源的 EndEdit() 上;将行放入 table 但此时它仍未保存到数据库中。要保存,必须调用 tableadapter.Update(theTable)

这可能看起来有点奇怪,但还是把它想象成 MS Word。您可以打开一个现有文档,然后您可以对一个新文档执行 Ctrl+N,然后编写该文档。新文档尚未保存到磁盘。

在 table 适配器术语中,过程是相同的:您可以下载现有数据库 table,然后您可以为新行执行 AddNew,然后写入新行的详细信息。新行尚未保存到数据库中。