无法将空值插入 MS Access 中的外键字段
Can't insert null value into a foreign key field in MS Access
我正在使用 VB.NET 将记录插入 MS Access table。我 运行 遇到一个问题,我要插入一条记录,其中一个值为空。 VB.NET 抛出错误,因为它说我要插入的字段需要一个值。
Sense_LanguageSource
table有六个字段包括ID字段:
- LanguageSourceID(自动编号)
- SenseFK(数量)
- 语言代码(数字)
- SourceWord(短文本)
- 语言来源类型(短文本)
- IsWaseieigo (Yes/No)
LanguageCode 字段也是一个外键,它 link 到 LanguageCodeValue
table,它包含一个 LanguageCodes 列表。
这是我 运行 在 VB.NET 中执行插入的代码:
'Finds the ID of the LanguageCode
sql = "SELECT [LanguageCodeID] FROM [LanguageCodeValue] WHERE [LanguageCode] = """ & ls.LanguageCode & """"
cmd = New OleDbCommand(sql, myConnection)
lcodeID = CInt(cmd.ExecuteScalar)
'Inserts the LanguageSource element
sql = "INSERT INTO [Sense_LanguageSource] ([SenseFK], [LanguageCode], [SourceWord], [LanguageSourceType], [IsWaseieigo]) VALUES (?, ?, ?, ?, ?)"
cmd = New OleDbCommand(sql, myConnection)
cmd.Parameters.Add(New OleDbParameter("[SenseFK]", senseID))
cmd.Parameters.Add(New OleDbParameter("[LanguageCode]", lcodeID))
cmd.Parameters.Add(New OleDbParameter("[SourceWord]", ls.SourceWord))
cmd.Parameters.Add(New OleDbParameter("[LanguageSourceType]", ls.LanguageSourceType))
cmd.Parameters.Add(New OleDbParameter("[IsWaseieigo]", ls.IsWaseieigo))
Try
cmd.ExecuteNonQuery()
cmd.Dispose()
Catch ex As Exception
MsgBox(ex.Message)
End Try
问题是我传递给 LanguageCode 的值是 0。我的代码正在获取一个可能包含也可能不包含 LanguageCode 值的对象,并且 运行 宁 Select 查询在 LanguageCodeValue
table 中找到它的 ID。因为我正在评估的特定对象没有 LanguageCode,所以第一个 select 查询 returns 0。当我尝试将 0 传递给插入命令时,出现错误:
"You cannot add or change a record because a related record is required in table 'LanguageCodeValue'."
我不确定如何解决这个问题。我希望 Sense_LanguageSource
table 和 LanguageCodeValue
table 之间有一个 link,但我不希望它被要求插入一个值LanguageCode
。是否可以将空值插入外键字段?或者有没有办法让它不需要在这个字段中插入一个值?
好吧,我已经想出了解决这个问题的办法——在 LanguageCodeValue
和 Sense_LanguageSource
之间的关系上禁用参照完整性。可能不是最好的解决方案,但它确实允许我在外键字段中输入 0。
编辑:我找到了更好的方法。在 LanguageCodeValue
table 上创建一个带有空白字段的 "Null" 记录,并在我想表明没有 LanguageCode
附加到 [=11= 时引用它] table.
我正在使用 VB.NET 将记录插入 MS Access table。我 运行 遇到一个问题,我要插入一条记录,其中一个值为空。 VB.NET 抛出错误,因为它说我要插入的字段需要一个值。
Sense_LanguageSource
table有六个字段包括ID字段:
- LanguageSourceID(自动编号)
- SenseFK(数量)
- 语言代码(数字)
- SourceWord(短文本)
- 语言来源类型(短文本)
- IsWaseieigo (Yes/No)
LanguageCode 字段也是一个外键,它 link 到 LanguageCodeValue
table,它包含一个 LanguageCodes 列表。
这是我 运行 在 VB.NET 中执行插入的代码:
'Finds the ID of the LanguageCode
sql = "SELECT [LanguageCodeID] FROM [LanguageCodeValue] WHERE [LanguageCode] = """ & ls.LanguageCode & """"
cmd = New OleDbCommand(sql, myConnection)
lcodeID = CInt(cmd.ExecuteScalar)
'Inserts the LanguageSource element
sql = "INSERT INTO [Sense_LanguageSource] ([SenseFK], [LanguageCode], [SourceWord], [LanguageSourceType], [IsWaseieigo]) VALUES (?, ?, ?, ?, ?)"
cmd = New OleDbCommand(sql, myConnection)
cmd.Parameters.Add(New OleDbParameter("[SenseFK]", senseID))
cmd.Parameters.Add(New OleDbParameter("[LanguageCode]", lcodeID))
cmd.Parameters.Add(New OleDbParameter("[SourceWord]", ls.SourceWord))
cmd.Parameters.Add(New OleDbParameter("[LanguageSourceType]", ls.LanguageSourceType))
cmd.Parameters.Add(New OleDbParameter("[IsWaseieigo]", ls.IsWaseieigo))
Try
cmd.ExecuteNonQuery()
cmd.Dispose()
Catch ex As Exception
MsgBox(ex.Message)
End Try
问题是我传递给 LanguageCode 的值是 0。我的代码正在获取一个可能包含也可能不包含 LanguageCode 值的对象,并且 运行 宁 Select 查询在 LanguageCodeValue
table 中找到它的 ID。因为我正在评估的特定对象没有 LanguageCode,所以第一个 select 查询 returns 0。当我尝试将 0 传递给插入命令时,出现错误:
"You cannot add or change a record because a related record is required in table 'LanguageCodeValue'."
我不确定如何解决这个问题。我希望 Sense_LanguageSource
table 和 LanguageCodeValue
table 之间有一个 link,但我不希望它被要求插入一个值LanguageCode
。是否可以将空值插入外键字段?或者有没有办法让它不需要在这个字段中插入一个值?
好吧,我已经想出了解决这个问题的办法——在 LanguageCodeValue
和 Sense_LanguageSource
之间的关系上禁用参照完整性。可能不是最好的解决方案,但它确实允许我在外键字段中输入 0。
编辑:我找到了更好的方法。在 LanguageCodeValue
table 上创建一个带有空白字段的 "Null" 记录,并在我想表明没有 LanguageCode
附加到 [=11= 时引用它] table.