提问人:A.J 提问时间:8/8/2023 最后编辑:marc_sA.J 更新时间:8/9/2023 访问量:81
在 VBA Access 中将 null 日期时间值传递给 SQL Server 存储过程
Pass null datetime value to SQL Server stored procedure in VBA Access
问:
我在客户表中将 Access 与 SQL Server(客户出生日期是可选列)一起使用,如果用户在按存储过程日期创建记录时将其保留为 null,则记录为 (30/12/1899),如屏幕截图所示:
我找到了这个解决方案,但我真的不知道我需要在代码或数据库中更改的位置。
我已经尝试按照代码传递空日期access.vba
cmd.Parameters.Append cmd.CreateParameter("@p_custi_birth_date", adDBTimeStamp, adParamInput, , Format(CDate(Nz(!custi_birth_date, Empty)), "YYYY-MM-DD"))
这是存储过程中的 SQL 语句,用于在参数为空时记录 null
CAST(NULLIF(@p_custi_birth_date, '') AS DATE)
答:
0赞
topsail
8/8/2023
#1
我不太确定 vba 方面 - 我将假设您遵循您发布的链接中的建议,以确保您将日期作为字符串传递,并且该字符串是 sql server 理解的有效日期字符串 - 在我看来,这意味着使用 or ,而不是使用 or , 不过,如果必须的话,请随时尝试后者。yyyy-mm-dd
yyyymmdd
mm/dd/yyyy
dd/mm/yyyy
但是在存储过程中,我认为您不想将空字符串转换为日期(您将得到一个像 1900-01-01 这样的日期,这不是您想要的)。因此,这可能更适合您的存储过程(假设传入了有效的日期字符串,或者是空字符串,或者可能是 null):
-- //@p_custi_birth_date is a date string such as '2000-12-31'
case
when isnull(@p_custi_birth_date, '') = '' then null
else cast(@p_custi_birth_date as date)
end
评论
0赞
A.J
8/8/2023
我认为问题出在一边,因为我试图在 SQL Server 中手动执行存储过程,并且我传递了 null 日期并且每件事都做得很好,所以问题仍在访问中,我无法将 null 日期传递给 SQL Serverms.access
0赞
topsail
8/8/2023
你试过这些建议吗?您发布的链接中有一个(传递一个而不是(在这种情况下,您可以传递 null 或空字符串,或者格式化的日期字符串,以便 sql server 可以使用它)。nbk发布的另一个答案中还有另一个建议。advarchar
adDbTImeStamp
1赞
A.J
8/9/2023
我总是尽量避免使用日期,因为在SQLServer之间真的很难处理,我尝试过,但总是在访问代码中显示错误varchar
access
and
0赞
nbk
8/8/2023
#2
在 Access 和 SQL Server 中,可以使用 测试变量。ISDATE
对于 SQL Server,它可以是:
IIF(NOT ISDATE(@p_custi_birth_date), NULL, CAST(@p_custi_birth_date AS DATE))
对于访问
IIf(IsNull(!custi_birth_date),Null,CDate(!custi_birth_date))
评论
0赞
A.J
8/9/2023
运行时错误 94 无效使用 null ,我认为日期字段不使用 Null 概念
0赞
nbk
8/9/2023
不,这意味着在您的表定义中您不允许 null,但是正如您想要的 null 我假设您的字段可以接受 null,因此您需要更改列
评论
adVarChar
adDBTimeStamp
adDBTimeStamp
adVarChar
''
date