首页 > 解决方案 > 更新表中的所有更改

问题描述

VS2017的Tableadapter更新配置

各位亲爱的会员,不好意思,又得用VS2017的一个VB.net SQL问题来骚扰你们了。我现在在互联网上搜索了很多天,但没有找到解决我问题的方法。所有示例都是或 C 且已过时。

情况如下: • 创建了一个 Tabteaapter 更新方法来更改数据库中的字段。• 修改了所有行中的一个字段(RENUM 字段Oserial)。• 尝试使用 Tableadapter 更新数据库中的更改。• 始终会生成错误,除非将Oserial 字段设置为另一个字段或文字的值(设置Oserial = PID),在这种情况下,DB 确实发生了变化,但没有使用正确的值。

我不明白如何配置更新平板电脑中的所有更改而不设置新值的更新方法。希望有人可以帮助我或告诉我在哪里可以找到示例源代码。

我的代码:------------

Public parmPID As String = "159"

Public Sub Renum()
    Dim n As Integer = 0

    Dim DS As New Pr2DataSet1()
    Dim TA As New Pr2DataSet1TableAdapters.OBjectsTableAdapter()

    TA.OBjectsFillByPIDOserial(DS.OBjects, parmPID)
    Try
        For Each dr As DataRow In DS.Tables(0).Rows
            n = n + 1
            DS.Tables(0).Rows(n - 1).Item   ("Oserial") = n 
       Next

        TA.ObjectsUpdateOserial(parmPID)
        TA.Connection.Close()

    Catch x As Exception
        Labelbox.Text = x.ToString
    End Try
End Sub

数据库设计:---------------

CREATE TABLE [dbo].[OBjects] (
[PID]          INT   NOT NULL,
[OID]  INT   IDENTITY (1, 1) NOT  ULL,
[Oserial]      INT    NOT NULL,

SQL 查询 1 :------------------------

UPDATE [dbo].[OBjects] 
set Oserial= PID
WHERE (PID = @parmPID)

这工作正常,但改变了 PID 值

SQL 查询 2 :------------------------

UPDATE [dbo].[OBjects] 
set Oserial 
WHERE (PID = @parmPID)

错误: : - - - - - - - - - - -

System.Data.SqlClient.SqlException (0x80131904):关键字“WHERE”附近的语法不正确。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,

标签: vb.net

解决方案


当然这是行不通的:

UPDATE [dbo].[OBjects] 
set Oserial 
WHERE (PID = @parmPID)

您没有指定要设置Oserial的内容。您必须指定一个值来将该列设置为,就像您在您所说的 SQL 中所做的那样有效。您可以指定文字值、表达式或参数,但您必须指定计算结果为您想要将列设置为的值的值。

然而,事实是,你只是做错了储蓄。您的表格适配器已经有一个方法可以为您保存所有更改:Update方法。你不需要其他任何东西。只需更改此:

TA.ObjectsUpdateOserial(parmPID)

对此:

TA.Update(DS.OBjects)

你可以走了。

表适配器的工作方式是它包含一个或多个查询,即SELECT语句,和三个动作语句,即INSERTUPDATEDELETE语句各一个。

默认情况下,表适配器有Fill,GetDataUpdate方法。您可以调用FillGetData执行默认查询,这基本上是一个SELECT *并且应该保持这种方式。该Fill方法将填充现有的DataTable,而该GetData方法将创建一个新的DataTable并填充它。您通常使用Fillfor a DataTablein aDataSetGetDatafor a lone DataTable

一旦你做了任何你想做的改变,你打电话Update,这些改变将被保存。 使用 a of 、for rows 和for rowsUpdate执行InsertCommandfor all 。DataRowsRowStateAddedUpdateCommandModifiedDeleteCommandDeleted

如果您想添加另一个查询,例如按特定列过滤,那么您可以在设计器中执行此操作。这样做将添加两个新方法,它们等效于FillGetData执行您的新查询而不是默认查询。您应该为这些方法使用提供的FillByGetDataBy前缀,并在过滤器中的列之后命名它们。在您的情况下,如果您正在过滤,PID那么这些方法应该被命名为FillByPIDand GetDataByPID

无论您使用这些方法来填充 aDataTable还是使用默认值,您仍然可以使用Update将所有更改保存在 a 中DataTable。如果您想查看这些操作命令中使用的 SQL,请在DataSet设计器中选择您的表适配器并查看“属性”窗口中的InsertCommandUpdateCommandDeleteCommand


推荐阅读