.net无法获取数据表来更新数据库以获取复选框矩阵

时间:2015-03-25 16:10:51

标签: .net sql-server winforms

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

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

矩阵摘要:汽车制造商拥有一系列车辆和3个部门,包括建筑,零件,建筑和工业。精加工。在显示Matrix之前,已在程序中选择了Employee。基本上每辆车都有一行显示车辆名称,然后是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)

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

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的行都与表中的一行有关。该行将在相关字段PART,CONST或FIN中存储相关的员工ID和车辆ID以“1”(勾号)存储(或组合,1行可以勾选所有3个)。

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

我尝试在表适配器定义的高级选项中勾选“生成插入,更新和删除语句”,但这不会发生。当你回到定义时,它们会再次变灰。我已经调查了这个并且我相信(如果我错了,请纠正我)这是因为我的select查询中列出了多个表。 另一点是我真的不认为我需要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的车辆建造部门接受培训

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

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

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

保罗。

2 个答案:

答案 0 :(得分:0)

您对问题的根本原因是正确的。您的选择查询很复杂(有连接)这一事实是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值的名称相同。

看看:

答案 1 :(得分:0)

我是这个问题的海报,我想如果其他人有类似的问题,我会更新你发生的事情。

首先是因为我的select语句创建了" Matrix" 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是Selected Employee的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的1 ---每当进行更改时未从VehicleTrainingMatrix表中获取的行。无论我尝试了什么,包括将表主键设置为EmployeeID,VehicleID(where子句中使用的2列),我无法解决此错误。 由Select语句创建的Matrix在屏幕上具有正确的数据,但它只能处理对现有行的更改。即我勾选已经有一个勾号的行的另一个部门(部件等)(只要这是我做的唯一更改)一切正常。但是,如果我勾选当前没有刻度的行(但是已由Select with Joins创建),则会发生并发错误。花了太多时间试图让Visual Studio按照我的意愿工作,我决定做一个有效的解决方法! 在我从DB填充表适配器之前,我运行以下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)"

基本上,这会在Fill获取它们之前创建Matrix中所需的所有行。现在允许对任何行进行任何更改。

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

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

我希望这可以帮助那些人。 保罗。