更新查询中的不同数据类型

时间:2015-11-29 00:06:55

标签: vba ms-access access-vba

我正在执行这两个查询。

Dim ItemID As String
Dim MemberID As String
Dim updatLibItemSQL As String
Dim DueDate As String

updatLibItemSQL = "UPDATE [tblLibraryItem]"
updatLibItemSQL = updatLibItemSQL & " SET [Status] = '" & inStockString & "',[CheckedOutToMemberID] = '',[DueDate]=''"
updatLibItemSQL = updatLibItemSQL & " WHERE [ItemID] = '" & ItemID & "'"
currDatabase.Execute updatLibItemSQL, dbFailOnError

Dim checkOutReturnSQL As String
checkOutReturnSQL = "UPDATE [tblCheckoutReturn]"
checkOutReturnSQL = checkOutReturnSQL & " SET [ReturnDate] = '" & Date & "'"
checkOutReturnSQL = checkOutReturnSQL & " WHERE [ItemID] = '" & ItemID & "' AND [MemberID] = '" & MemberID & "' AND [DueDate] = '" & DueDate & "'"
currDatabase.Execute checkOutReturnSQL, dbFailOnError

如果从两个查询中删除了MemberID和截止日期部分,则两者都运行良好。我不知道什么是错的。

在表格中,MemberID是NUMBER,DueDate是日期/时间类型字段。我不知道如何在第一次查询中将它们变为空,以及如何在以后的查询中使用where子句。

如果错了,请帮助纠正我

2 个答案:

答案 0 :(得分:1)

'空'有点主观 - 当你进行初始插入时,你为CheckedOutToMemberID和DueDate提供了什么值?数据库中的一个简单答案是使用值NULL。 NULL表示"没有值" (实际上它可能意味着你想要的任何意思,但我们会坚持"没有价值")。

在您的第一个查询中:

updatLibItemSQL = "UPDATE [tblLibraryItem]"
updatLibItemSQL = updatLibItemSQL & " SET [Status] = '" & inStockString & "',[CheckedOutToMemberID]=NULL,[DueDate]=NULL"
updatLibItemSQL = updatLibItemSQL & " WHERE [ItemID] = '" & ItemID & "'"
currDatabase.Execute updatLibItemSQL, dbFailOnError

在WHERE部分中,您不能只说[field] = NULL,这是因为NULL不是值 - 它是字段值所在的状态。您必须使用IS运算符:[field] IS NULL(或查看它是否具有值[field] IS NOT NULL)。在您的情况下,如果您想检查MemberId和DueDate是否为NULL,请使用:

checkOutReturnSQL = "UPDATE [tblCheckoutReturn]"
checkOutReturnSQL = checkOutReturnSQL & " SET [ReturnDate] = '" & Date & "'"
checkOutReturnSQL = checkOutReturnSQL & " WHERE [ItemID] = '" & ItemID & "' AND [MemberID] IS NULL AND [DueDate] IS NULL"
currDatabase.Execute checkOutReturnSQL, dbFailOnError

您可以使用IsNull函数检查VBA中的字段值是否为NULL:https://msdn.microsoft.com/en-us/library/office/gg278616.aspx

答案 1 :(得分:1)

日期字段永远不会包含字符串;它包含Null或日期/时间值。

因此:

Dim ItemID As String
Dim MemberID As String
Dim updatLibItemSQL As String
Dim DueDate As String

updatLibItemSQL = "UPDATE [tblLibraryItem]"
updatLibItemSQL = updatLibItemSQL & " SET [Status] = '" & inStockString & "',[CheckedOutToMemberID] = '',[DueDate] = Null"
updatLibItemSQL = updatLibItemSQL & " WHERE [ItemID] = '" & ItemID & "'"
currDatabase.Execute updatLibItemSQL, dbFailOnError

Dim checkOutReturnSQL As String
' DueDate must hold a string like "2015/11/28":
' DueDate = Format(somedatevalue, "yyyy\/mm\/dd")
checkOutReturnSQL = "UPDATE [tblCheckoutReturn]"
checkOutReturnSQL = checkOutReturnSQL & " SET [ReturnDate] = #" & Format(Date, "yyyy\/mm\/dd") & "#"
checkOutReturnSQL = checkOutReturnSQL & " WHERE [ItemID] = '" & ItemID & "' AND [MemberID] = '" & MemberID & "' AND [DueDate] = #" & DueDate & "#"
currDatabase.Execute checkOutReturnSQL, dbFailOnError