在.net中插入和更新规范化表

时间:2014-08-12 07:10:23

标签: .net database vb.net ms-access-2010

对于我来说,你们在向表格中插入数据以及指出我不能使用单个查询来更新或插入多个表格时,对我来说是一个很好的帮助。所以我再一次需要你的帮助。 我正在编写可以控制plc的软件。但是,用户必须能够制作可以存储在数据库中以供以后使用的口粮。 为此,我创建了3个表:tbl1,tbl2和tbl3。前2个用于口粮(食物类型,体重,必须去的地方)和食物(类型,储存位置)。第三个表使用其ID作为FK连接两个表。

现在,我可以轻松地插入和更新单独的表格,但由于配额可以超过1种类型的食物,我需要能够在一种口粮中添加更多食物并在数据库中更新/插入使用1个按钮(用于插入,1用于更新)。

这是我在插入表格时所熟悉的内容:

Dim Savestr As String
' Dim SaveStr1 As String
Dim Strkoppel As String
Savestr = "INSERT INTO tbl_rantsoen (Rantsoen, Voer, Gewicht) VALUES ('" & tbNieuwRantsoen.Text & "', '" & cbVoer.Text & "','" & tbGewicht.Text & "')"
'SaveStr1 = "INSERT INTO tbl_voersoorten ( Voer) VALUES ('" & cbVoer.Text & "')"
Strkoppel = "INSERT INTO tbl_rantsoenkoppel SELECT a.RantsoenID.  b.VoerID FROM tbl_rantsoen a INNER JOIN tbl_voersoorten b on b.Voer = a.Voer"
'Str2 = "INSERT INTO tbl_rantsoenKoppel (VoerID, RantsoenID) VALUES() WHERE RantsoenID = tbl_rantsoenkoppel.FKRantsoenID AND VoerID = tbl_voersoorten.VoerID"
connection.Open()
cmd = New OleDbCommand(Savestr, connection)
'cmd1 = New OleDbCommand(SaveStr1, connection)
cmd2 = New OleDbCommand(Strkoppel, connection)
cmd.ExecuteNonQuery()
'cmd1.ExecuteNonQuery()
cmd2.ExecuteNonQuery()

更新: 我只是有一个脑力,虽然这包括使用datagridvieuw(不是更好)它可能工作,如果我只是出错(数据类型在表达式中不匹配)

任何人都可以帮我解决这个问题吗?此外,我知道如何使用1 datagridviewrow来填充文本框,我认为当你使用多个记录时它的工作方式大致相同?

编辑:无意中使datagridview工作。 :P现在我可以以正确的方式填充文本框。 :)我现在卡在更新/插入。谁能帮我吗?我收到了这个错误:

de opgegeven wijzigingen zijn niet aangebracht in de tabel omdat daardoor dubbele waarden ontstaan​​ in de index,primaire sleutel of relatie。在de velden的het veld的Wijzig de gegevens遇到了dubbele gegevens,verwijder de index of definieer de index opnieuw zodat dubbele items zijn toegestaan​​。探测器het vervolgens opnieuw。 在ENglish中会出现类似“未在表中进行更改,因为它会在索引,主键或关系中创建双重值。

我正在使用以下查询:

Savestr = "INSERT INTO tbl_rantsoen (Rantsoen, Voer, Gewicht, Locatie) VALUES ('" & tbNieuwRantsoen.Text & "', '" & cbVoer.Text & "','" & tbGewicht.Text & "', '" & cbLocatie.Text & "')"
SaveStr1 = "INSERT INTO tbl_voersoorten ( Voer) VALUES ('" & cbVoer.Text & "')"
Strkoppel = "INSERT INTO tbl_rantsoenkoppel SELECT tbl_rantsoen.RantsoenID, tbl_voersoorten.VoerID FROM tbl_rantsoen INNER JOIN tbl_voersoorten on tbl_rantsoen.Voer = tbl_voersoorten.Voer"

问题:我该如何解决这个问题? (如果需要,我可以上传我的数据库。)

对我的数据库进行了一些更改,现在我收到了错误:De instructie INSERT INTO bevat de volgende onbekende veldnaam:RantsoenID。 u de naam的控制者纠正hebt getypt en probeer het opnieuw。意味着INSERT INTO包含一个未知的字段名,即使该字段确实存在! 错误在cmd3.ExecuteNonQuery中,所以它与StrKoppel有关吗? (StrKoppel是连接食物表和饮食表的字符串)我认为这是因为我不使用两个主表中的唯一字段,唯一的唯一字段是ID字段。

1 个答案:

答案 0 :(得分:0)

这是我对你所需要的最好的猜测。

首先,您需要一个包含两个字段的“Rantsoen”表:RantsoenId和Name。 RantsoenId应该是一个Identity列,以便在插入行时自动生成Id值。该表描述了一种口粮,其中可能含有一种或多种食物。

接下来,您想要一个包含两个字段的FoodType(“Lebensmittel”?)表:FoodTypeId和Description。同样,FoodTypeId应该是一个标识列。

最后。你想要一个包含两列的Rantsoen_Food_Map表:RantsoenId和FoodTypeId。该表描述了哪些Rantsoens包含哪些食物类型。

然后,您可以将这些表连接在一起以查询所需的信息。