附加信息:您无法添加或更改记录,因为表 'tblRubriek' 中需要相关记录
Posted
技术标签:
【中文标题】附加信息:您无法添加或更改记录,因为表 \'tblRubriek\' 中需要相关记录【英文标题】:Additional information: You cannot add or change a record because a related record is required in table 'tblRubriek'附加信息:您无法添加或更改记录,因为表 'tblRubriek' 中需要相关记录 【发布时间】:2016-05-06 12:27:18 【问题描述】:我有一个学校项目,我需要将数据添加到 3 个相互关联的表中。我的问题是主键与另一个相关,我收到一个错误。
这是我正在运行的代码
Protected Sub bntVerzenden_Click(sender As Object, e As EventArgs) Handles bntVerzenden.Click
Dim intGebruikersID, intRubriekID As Integer
Dim VerkopenConn As New OleDb.OleDbConnection
Dim VerkopenCommArtikel, VerkopenCommGebruiker, GebruikersIDComm, RubriekIDComm As New OleDb.OleDbCommand
VerkopenConn.ConnectionString = My.Settings.SvShopConnection
VerkopenCommArtikel.Connection = VerkopenConn
VerkopenCommGebruiker.Connection = VerkopenConn
GebruikersIDComm.Connection = VerkopenConn
RubriekIDComm.Connection = VerkopenConn
'Gebruiker gegevens aan de database toevoegen
VerkopenCommGebruiker.CommandText = "INSERT INTO tblGebruiker (GebruikersNaam, GebruikersVoornaam, GebruikersEmail, GebruikersGSM) VALUES (@GebruikersNaam, @GebruikersVoornaam, @GebruikersEmail, @GebruikersGSM)"
VerkopenCommGebruiker.Parameters.AddWithValue("@GebruikersNaam", txtNaam.Text)
VerkopenCommGebruiker.Parameters.AddWithValue("@GebruikersVoornaam", txtVNaam.Text)
VerkopenCommGebruiker.Parameters.AddWithValue("@GebruikersEmail", txtEmail.Text)
VerkopenCommGebruiker.Parameters.AddWithValue("@GebruikersGSM", txtGsm.Text)
'GebruikersID uit de database halen
GebruikersIDComm.CommandText = "SELECT tblGebruiker.GebruikersID FROM tblGebruiker WHERE tblGebruiker.GebruikersNaam = @Naam AND tblGebruiker.GebruikersVoornaam = @VNaam;"
GebruikersIDComm.Parameters.AddWithValue("@Naam", txtNaam.Text)
GebruikersIDComm.Parameters.AddWithValue("@VNaam", txtVNaam.Text)
'RubriekID uit de database halen
RubriekIDComm.CommandText = "SELECT tblRubriek.RubriekID FROM tblRubriek WHERE tblRubriek.RubriekNaam = @RubriekNaam"
RubriekIDComm.Parameters.AddWithValue("@RubriekNaam", lstRubriek.SelectedItem.ToString)
'Artikel gegevens aan de database toevoegen
VerkopenCommArtikel.CommandText = "INSERT INTO tblArtikel (ArtikelBeschrijving, ArtikelPrijs, RubriekID, ArtikelAankoopdatum, ArtikelTekoopgezet, ArtikelBeschikbaar, GebruikersID) VALUES ( @ArtikelBeschrijving, @ArtikelPrijs, @RubriekID, @ArtikelAankoopdatum, @ArtikelTekoopgezet, @ArtikelBeschikbaar, @GebruikersID)"
VerkopenCommArtikel.Parameters.AddWithValue("@ArtikelBeschrijving", txtArtikelBeschrijving.Text)
VerkopenCommArtikel.Parameters.AddWithValue("@ArtikelPrijs", txtArtikelPrijs.Text)
VerkopenCommArtikel.Parameters.AddWithValue("@RubriekID", intRubriekID)
VerkopenCommArtikel.Parameters.AddWithValue("@ArtikelAankoopdatum", CalAankoop.SelectedDate)
VerkopenCommArtikel.Parameters.AddWithValue("@ArtikelTekoopgezet", calVerkoop.SelectedDate)
VerkopenCommArtikel.Parameters.AddWithValue("@ArtikelBeschikbaar", True)
VerkopenCommArtikel.Parameters.AddWithValue("@GebruikersID", intGebruikersID)
If VerkopenConn.State = ConnectionState.Closed Then VerkopenConn.Open()
VerkopenCommGebruiker.ExecuteNonQuery()
intGebruikersID = Integer.Parse(GebruikersIDComm.ExecuteScalar)
intRubriekID = Integer.Parse(RubriekIDComm.ExecuteScalar)
VerkopenCommArtikel.ExecuteNonQuery()
End Sub
VerkopenCommArtikel.ExecuteNonQuery()
我收到这个错误了吗
System.Data.dll 中出现“System.Data.OleDb.OleDbException”类型的异常,但用户代码中未处理
附加信息:您无法添加或更改记录,因为表“tblRubriek”中需要相关记录。
This is my Database
【问题讨论】:
如果 PK 是由数据库在父表中生成的,那么您需要在保存之前检索它以将其放入子表中。在此处查看我的指南:vbforums.com/… @jmcilhinney 谢谢!我想我已经设法解决了这个问题,但现在我遇到了这个问题。 在尝试转换为Integer
之前,您可能需要先检查ExecuteScalar
是否返回了DBNull
,如果查询没有返回任何行,就会发生这种情况。
@GordThompson 这些是否有效:If Not DBNull.value.Equals(GebruikersIDComm.ExecuteScalar) Then intRubriekID = Integer.Parse(RubriekIDComm.ExecuteScalar)
或者我该如何使用DBNull
?
对不起,我的错。我刚刚对其进行了测试,如果没有找到行,则ExecuteScalar()
返回Nothing
。您可以使用IsNothing()
函数进行检查。另外,我的测试表明您没有使用Option Strict
,因此隐式转换会导致奇怪的行为。将Option Strict On
放在您的模块/类文件的最顶部(并根据需要更正您的代码)以节省一些麻烦。
【参考方案1】:
你正在使用
intRubriekID = Integer.Parse(RubriekIDComm.ExecuteScalar)
要检索intRubriekID
值在您已经设置了参数值
VerkopenCommArtikel.Parameters.AddWithValue("@RubriekID", intRubriekID)
需要先执行SELECT查询,然后设置INSERT INTO tblArtikel
查询的Parameter值,然后执行。
【讨论】:
我已经更改了订单,现在我得到:intGebruikersID = Integer.Parse(GebruikersIDComm.ExecuteScalar)
的值不能为空
我的执行顺序错了,我设法修复了顺序,代码现在可以正常工作了,谢谢你的帮助!
不客气。请记住我所说的启用Option Strict
。我建议您调整您的 Visual Studio 配置,使其成为所有新 VB.NET 项目的默认配置。这真是个好主意。
我只是默认启用了它!以上是关于附加信息:您无法添加或更改记录,因为表 'tblRubriek' 中需要相关记录的主要内容,如果未能解决你的问题,请参考以下文章