【问题标题】:.net can't get datatable to update DB for a checkbox matrix.net 无法获取数据表来更新复选框矩阵的数据库
【发布时间】:2015-05-29 10:19:03
【问题描述】:

我正在使用 MS Visual Studio 2013 为客户创建员工培训计划,但似乎无法弄清楚一件事...

我遇到的问题是将复选框矩阵中的任何更改写回相关表 (VehicleTrainingMatrix)

矩阵摘要:汽车制造商拥有一系列车辆和 3 个部门,即制造、零件、制造和精加工。在显示矩阵之前,已在程序中选择了员工。基本上,每辆车都有一行显示车辆名称,然后是 3 个复选框(每个部门 1 个),如果该员工已针对特定车辆的特定部门接受过培训,则您在相关位置输入 Tick。简单,所以我想!?!?

数据表已从数据源拖到表单上。

它基于以下SQL ...

    SELECT V.Vehicle, VTM.PART AS Parts, VTM.CONST as Construction, VTM.FIN AS Finishing
FROM VehicleTrainingMatrix AS VTM RIGHT OUTER JOIN
 Vehicles AS V ON VTM.VehicleID = V.ID AND VTM.EmployeeID = @IDparam
ORDER BY V.Vehicle

在我的程序中,我有以下行来加载数据:

Me.VehicleTrainingMatrixTableAdapter.FillByID(TrainingDBDataSet.VehicleTrainingMatrix, SelectedEmployeeID)

您应该看到查询中的 IDparam 被提供的 SelectedEmployeeID 变量满足。

VehicleTrainingMatrix 表定义:

    CREATE TABLE [dbo].[VehicleTrainingMatrix](
[ID] [int] IDENTITY(1,1) NOT NULL,
[EmployeeID] [int] NOT NULL,
[VehicleID] [int] NOT NULL,
[PART] [bit] NULL,
[CONST] [bit] NULL,
[FIN] [bit] NULL,
PRIMARY KEY CLUSTERED 
([ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]

基本上,矩阵中带有 Tick 的任何行都与表中的一行相关。该行将存储相关的员工 ID 和车辆 ID,并在相关字段 PART、CONST 或 FIN(或组合,1 行可以勾选所有 3 个)中带有“1”(打勾)。

加载数据有效。我遇到的问题是将任何车辆训练矩阵对 VTM 表的更改写回数据库。

我尝试在表适配器定义的高级选项中勾选“生成插入、更新和删除语句”,但没有发生这种情况。当您返回定义时,它们再次变灰。我已经对此进行了研究,我相信(如果我错了,请纠正我)这是因为我的选择查询中列出了超过 1 个表。 另一点是我真的不认为我需要 VehicleTrainingMatrix.ID 字段,我只是在试图解决这个问题时才添加它不能写回数据库问题(我已经尝试对这个问题进行排序几天了)其中一个帖子似乎表明我需要一个主键来执行此操作。

我已手动将以下内容添加到 SQL 中

INSERT INTO [dbo].[VehicleTrainingMatrix]
       ([EmployeeID]
       ,[VehicleID]
       ,[PART]
       ,[CONST]
       ,[FIN])
 VALUES
       (621, 2, 1, NULL ,NULL)

621 = 员工 ID,

2 = 车辆 ID 值

1 = 该员工在 ID 2 车辆的零件部门接受培训

NULL = 该员工未在 ID 2 车辆的施工部门接受培训

NULL = 该员工未在 ID 2 车辆的施工部门接受培训

希望以上内容包含所需的所有详细信息,但要总结一下从数据库中读取的数据表并完美地填充矩阵。我的问题是我怎样才能对矩阵进行任何更改(只有新的刻度我将禁用取消选中的能力,但不太确定如何)。如果未勾选的行中有勾选,则更改可能涉及必须在表 VehicleTrainingMatrix 中创建新行,或者只是更新现有行。

所以你知道我的水平,我刚刚回到编程领域(在做了几年的支持之后)并且基本上已经自学了 .net(请不要用 C 示例回应)和 VS 2014。我学到了很多东西曲线,但在这个问题上做得很好。我可能会丢失某些术语,因此我希望能得到解释,而不是简短的回答。

非常感谢任何花时间提供帮助的人。

保罗。

【问题讨论】:

    标签: .net sql-server winforms


    【解决方案1】:

    您对问题的根本原因是正确的。您的选择查询很复杂(具有连接)这一事实是 Visual Studio 无法自动为您生成插入/更新/删除语句的原因。

    然后,您需要做的是提供这些查询。

    您可以右键单击数据源并打开属性视图(如果它通常尚未在屏幕右侧打开)。然后,在属性中找到InsertCommandDeleteCommandUpdateCommand 属性。单击小... 按钮进行编辑。

    UpdateCommand 可能看起来像这样:

     UPDATE [dbo].[VehicleTrainingMatrix]
        SET [PART] = @Parts 
          , [CONST] = @Construction
          , [FIN] = @Finishing
     WHERE [EmployeeID] = @EmployeeId
       AND [VehicleID] = @VehicleID
    

    确保不提供值或参数。将ParameterSource 设置为none。这样您使用的数据控件将自动设置参数。

    查询中使用的参数名称必须与 GridView、DetailsView 或 FormView 中的 DataKeyNames 值的名称相同。

    看看:

    【讨论】:

    • 嗨,迈克,首先让我感谢您的回复,非常感谢。感谢您确认我的问题的实际原因是什么(包含连接的查询)。无论如何,我首先创建了 UpdateCommand(我的 TableAdapter 的属性),只是你输入它的方式......但我收到了错误。在尝试解决这些问题时,我将 EmployeeID 和 VehicleID 列添加到我的查询中(我会将它们隐藏在表单中),因为它们也被引用为参数,因此认为必须选择它们(如果我弄错了,请随时纠正我) .这并没有解决错误。继续...
    • 当我运行 Me.TrainingTableAdapterManager.UpdateAll(Me.TrainingDBDataSet) 我得到错误一个未处理的异常...附加信息:参数化查询'(@Parts 位,@Construction 位,... ...' 需要参数'@Parts',它没有提供。只是为了澄清你关于不提供参数值的注释......当我第一次创建更新命令时,Visual Studio 自动创建了一个参数集合. 上述错误与这些参数有关。所以我尝试将参数从 Collection 更改为 None 但仍然得到类似的错误只是更短...
    • 我用谷歌搜索了这个,发现我可能需要更改更新查询中的参数,例如@Parts 到 '%@Parts%'(包括引号)。这只是将错误更改为:附加信息:将 varchar 值 '%@EmployeeID%' 转换为数据类型 int 时转换失败。我已经仔细检查过,EmployeeID 在它使用的每个表中都有一个 Int 数据类型,所以我不明白那个。摘要:我确信我们走在正确的轨道上,但只是遗漏了一些东西。如果您(或其他任何人,我不挑剔)可以帮助完成此任务,您将成为我的一周。再次感谢保罗。
    • 嘿,保罗 - 抱歉耽搁了。这是针对 Windows 窗体应用程序还是 Web 窗体应用程序?
    • 你好迈克,我只是想在睡觉前检查一下。不要为延迟道歉,我很感谢您的帮助。它是使用 VS Express 2013 在 VB.net 中编写的 Windows 窗体/MS SQL Server exe。我想检查两件事:1. 在 TA 的 UpdateCommand 的属性中 - 我是否应该保留自动生成的参数(它们看起来对新手来说是正确的)或者我应该删除它们吗? 2. 在代码中,我是否应该以某种方式将参数提供给更新命令。当前,Matrix 表列在 UpdateAll(Me.TrainingDBDataSet) 命令中。所以我不相信我需要单独的更新? :}
    【解决方案2】:

    我是这个问题的发布者,我想我会告诉你发生了什么,以防其他人有类似的问题。

    首先因为创建“矩阵”DataGridView 的选择语句在其中加入了 Visual Studio 无法自动生成插入、更新和删除语句。

    我的选择声明:

    SELECT        V.Vehicle, VTM.Parts, VTM.Construction, VTM.Finishing, VTM.EmployeeID, V.ID AS VehicleID
    FROM            VehicleTrainingMatrix AS VTM RIGHT OUTER JOIN
                         Vehicles AS V ON VTM.VehicleID = V.ID AND VTM.EmployeeID = @IDparam
    ORDER BY V.Vehicle
    

    @IDparam 是选定员工的 ID,通过以下方式使用:

    Me.VehicleTrainingMatrixTableAdapter.FillByID(TrainingDBDataSet.VehicleTrainingMatrix, SelectedEmployeeID)
    

    我手动添加了以下语句: 插入语句:

    INSERT INTO VehicleTrainingMatrix
                         (EmployeeID, VehicleID, Parts, Construction, Finishing)
    VALUES        (@EmployeeID,@VehicleID,@Parts,@Construction,@Finishing)
    

    更新声明:

    UPDATE       VehicleTrainingMatrix
    SET                EmployeeID = @EmployeeID, VehicleID = @VehicleID, Parts = @Parts, Construction = @Construction, Finishing = @Finishing
    WHERE        (VehicleID = @VehicleID) AND (EmployeeID = @EmployeeID)
    

    此时,通过表单上的 DGV 更新适用于我手动输入的现有行,但导致错误:--- 附加信息:并发违规:UpdateCommand 影响 0 of 1 --- 每当对不是来自 VehicleTrainingMatrix 表的行。无论我尝试什么,包括将表的主键设置为 EmployeeID、VehicleID(where 子句中使用的 2 列),我都无法绕过这个错误。 Select 语句创建的矩阵在屏幕上有正确的数据,但它只能处理对现有行的更改。即我勾选了已经有勾选的行的另一个部门(零件等)(只要这是我所做的唯一更改)一切都很好。但是,如果我勾选当前没有刻度的行(但已由 Select with Joins 创建),则会发生并发错误。在花了太多时间试图让 Visual Studio 像我想要的那样工作之后,我决定做一个解决方法,它很管用! 在从数据库填充表适配器之前,我运行以下 SQL 命令:

    sqlCmd.CommandText = "INSERT INTO VehicleTrainingMatrix (EmployeeID, VehicleID, Parts, Construction, Finishing) " & _
                                    "SELECT " & SelectedEmployeeID & ", V.ID, NULL, NULL, NULL " & _
                                    "FROM Vehicles V WHERE NOT EXISTS " & _
                                        "(SELECT VehicleID FROM VehicleTrainingMatrix VTM WHERE VTM.EmployeeID = " & SelectedEmployeeID & " AND VTM.VehicleID = V.ID)"
    

    基本上,这会在填充获取它们之前在数据库中创建矩阵所需的所有行。这现在允许对任何行进行任何更改。

    我在上面的 Insert Where 语句失败之前尝试过的一件事是...我知道创建的 Matrix 中的 EmployeeID 字段对于没有 VehicleTrainingMatrix 记录的任何车辆行都是空白的 我以编程方式使用 EmployeeID 填充 TableAdapter 行所以所有字段都有一个值。这没什么区别。

    注意:VS 从我的 SQL 语句创建的参数 - 我只是不理会它们。即我不会删除它们。

    我希望这对那里的人有所帮助。 保罗。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多