Microsoft Access 表单在 SQL 数据库中出现错误
Microsoft Access form gives errors with SQL database
故事
我正在为一家使用 MS Access 数据库的企业开展项目。我们在不添加关系的情况下将 MS Acces 数据库转换为 sql 数据库。并成功将它们导入到Acces中。在表单的某些选项卡中,数据有效,而其他选项卡无效。
问题
我们在 Access 中使用 Forms,它在与 MS Access 表一起使用时工作正常。但是当我们切换到 MS SQL 时,表单的某些部分停止工作。据我们所知,它似乎与日期有关,但很难调试此类错误。
我们如何修复或找出导致这些错误的原因?
3238: ODBC--数据超出范围。
error
更新
与此同时,我们将 ODBC 驱动程序编辑为本机 SQL 11
我们得到这个新错误。我们发现正是这个查询导致了错误。
我们认为这是一个日期格式问题,但不知道如何解决。
SELECT [tbl_Accommodatie]![Gemeente] & " " & [tbl_Accommodatie]![Naam] & " " & [tbl_Accommodatie]![Adres] AS Accommodatiegegevens,
tbl_Onderwijstype.OnderwijstypeKort, tbl_Sporttak.Activiteit,
[tbl_Sporttak]![Activiteit] & " - " & [tbl_Programma]![TitelActiviteit] AS txtActiviteit,
IIf([tbl_Programma]![Reservatie]=1,"OK",IIf([tbl_Programma]![Reservatie]=2,"Geweig.",IIf([tbl_Programma]![Reservatie]=3,"Onbek.",IIf([tbl_Programma]![Reservatie]=5,"OK, maar","Geannul.")))) AS Status,
tbl_Accommodatie.Gemeente, tbl_Sporttak.InschrFrmBAS, tbl_Programma.ProgrammaID, tbl_Programma.TerreinKeuze,
tbl_Programma.UrenReservatie, tbl_Programma.Datum,
tbl_Programma.InzetPersoneel FROM ((tbl_Programma
INNER JOIN tbl_Sporttak ON tbl_Programma.SporttakId = tbl_Sporttak.SporttakID)
INNER JOIN tbl_Accommodatie ON tbl_Programma.AccommodatieId = tbl_Accommodatie.AccommodatieID)
INNER JOIN tbl_Onderwijstype ON tbl_Programma.OnderwijstypeId = tbl_Onderwijstype.OnderwijstypeID
WHERE (((tbl_Programma.Datum)='2020/01/01')
AND ((tbl_Programma.SchooljaarId)=IIf([forms]![frmMenuAlgemeen]![chkMetVorigSchooljaar]=False,[forms]![frmMenuAlgemeen]![txtGekozenSchooljaar],[forms]![frmMenuAlgemeen]![txtGekozenSchooljaar]-1) Or (tbl_Programma.SchooljaarId)=IIf([forms]![frmMenuAlgemeen]![chkMetVorigSchooljaar]=False,[forms]![frmMenuAlgemeen]![txtGekozenSchooljaar],[forms]![frmMenuAlgemeen]![txtGekozenSchooljaar])));
This expression is typed incorrectly, or it is too complex to be evaluated. For example, a numeric expression may contain too many complicated elements. Try simplifying the expression by assigning parts of the expression to variables.
好的,如果你迁移得很好,那么 TOPS 就上榜了吗?
好吧,如果您使用内置(旧版)SQL 服务器驱动程序,则 datetime2 列将显示为文本。事实上,请停止您所做的所有更改以尝试解决此问题。
应该是零,我重复关于日期时间问题的零更改。当这里需要零更改时,您沿着一条路尝试修复问题。
10秒测试?在设计视图中打开链接 table,并检查 date/time 列是否被视为日期时间,或 AS TEXT!!!!
如果它们被视为文本,那就是你的大问题,不需要尝试修复代码和查询!!! - 我再说一遍,不需要。因此,当需要 none 时,您正在努力追逐。
日期时间问题有两种解决方案:
如果您使用了 Access 迁移助手,那么在迁移之前,将映射更改为在 sql 服务器上使用 datetime,而不是 datetime2
第二种方案:
安装+采用本机11(或者我认为17或19现在是最新的)SQL驱动程序。但是,当您这样做时,您必须 RE-LINK。因此,看起来您将 sql 驱动程序更新为更高版本的本机驱动程序,但您还必须记住 re-link 您的 tables 并 100%(不,200%)确定您 re-link 使用较新的驱动程序编辑了 table。这样做之后,然后再次进行 10 秒测试,将链接 table 切换到 Access 中的设计视图 - 再次 100%、200% 确定日期时间列确实被视为日期时间。
因此,您有两个选择 - 只有您可以决定哪个工作较少。
不要在 sql 服务器 table 中使用 datetime2 数据类型。这将确保 运行 该应用程序能够正常工作的所有工作站。
接受并使用 datetime2 列,但是您必须 re-link 使用较新的“本机 17 或更高版本的 odbc 驱动程序,但您现在还必须在每个工作站上安装该驱动程序。这可能会很痛苦在某些情况下,但是如果您更新 odbc 驱动程序,这是一个非常好的主意,那么您必须按照说明确保在 运行 访问的所有工作站上安装相同的更新驱动程序。当然,它必须是相同版本的 odbc 驱动程序。
所以内置的“传统”sql 驱动程序较旧,不是最好的,但这确实意味着您不必在每个工作站上更改或设置或安装 odbc 驱动程序(它是由默认安装在 windows 的所有版本上 - 至少 20 年来一直如此。
因此,不要继续更改 VBA 代码、表单和您的 sql 查询。
如果您迁移到 sql 服务器,并且还检查设计模式中的 table,它会将列视为日期时间?
THEN ZERO ZERO ZERO 需要对那些现有的要求和表格进行零更改。有并且可以有一些其他的变化,但 datetime 不是这些变化之一。所以,正如我所说,停止你现在所做的事情,解决上述问题。如果您不这样做,您可以在接下来的两周内追查日期时间错误和问题,而无需在此区域进行任何更改。
如上所述,我非常喜欢较新的 sql 驱动程序,但最大的缺点是您必须在每个工作站上安装较新的 odbc 驱动程序。因此,在一些较大的公司部署中,我们继续使用“遗留”或所谓的“非本机”sql 驱动程序。 (Sql 服务器驱动程序)。但是,有了这个选择,我们必须非常小心,不要使用,也不要将 datetime2 列引入数据库,因为它们被内置的旧版驱动程序视为文本列。
故事
我正在为一家使用 MS Access 数据库的企业开展项目。我们在不添加关系的情况下将 MS Acces 数据库转换为 sql 数据库。并成功将它们导入到Acces中。在表单的某些选项卡中,数据有效,而其他选项卡无效。
问题
我们在 Access 中使用 Forms,它在与 MS Access 表一起使用时工作正常。但是当我们切换到 MS SQL 时,表单的某些部分停止工作。据我们所知,它似乎与日期有关,但很难调试此类错误。
我们如何修复或找出导致这些错误的原因?
3238: ODBC--数据超出范围。
error
更新
与此同时,我们将 ODBC 驱动程序编辑为本机 SQL 11 我们得到这个新错误。我们发现正是这个查询导致了错误。 我们认为这是一个日期格式问题,但不知道如何解决。
SELECT [tbl_Accommodatie]![Gemeente] & " " & [tbl_Accommodatie]![Naam] & " " & [tbl_Accommodatie]![Adres] AS Accommodatiegegevens,
tbl_Onderwijstype.OnderwijstypeKort, tbl_Sporttak.Activiteit,
[tbl_Sporttak]![Activiteit] & " - " & [tbl_Programma]![TitelActiviteit] AS txtActiviteit,
IIf([tbl_Programma]![Reservatie]=1,"OK",IIf([tbl_Programma]![Reservatie]=2,"Geweig.",IIf([tbl_Programma]![Reservatie]=3,"Onbek.",IIf([tbl_Programma]![Reservatie]=5,"OK, maar","Geannul.")))) AS Status,
tbl_Accommodatie.Gemeente, tbl_Sporttak.InschrFrmBAS, tbl_Programma.ProgrammaID, tbl_Programma.TerreinKeuze,
tbl_Programma.UrenReservatie, tbl_Programma.Datum,
tbl_Programma.InzetPersoneel FROM ((tbl_Programma
INNER JOIN tbl_Sporttak ON tbl_Programma.SporttakId = tbl_Sporttak.SporttakID)
INNER JOIN tbl_Accommodatie ON tbl_Programma.AccommodatieId = tbl_Accommodatie.AccommodatieID)
INNER JOIN tbl_Onderwijstype ON tbl_Programma.OnderwijstypeId = tbl_Onderwijstype.OnderwijstypeID
WHERE (((tbl_Programma.Datum)='2020/01/01')
AND ((tbl_Programma.SchooljaarId)=IIf([forms]![frmMenuAlgemeen]![chkMetVorigSchooljaar]=False,[forms]![frmMenuAlgemeen]![txtGekozenSchooljaar],[forms]![frmMenuAlgemeen]![txtGekozenSchooljaar]-1) Or (tbl_Programma.SchooljaarId)=IIf([forms]![frmMenuAlgemeen]![chkMetVorigSchooljaar]=False,[forms]![frmMenuAlgemeen]![txtGekozenSchooljaar],[forms]![frmMenuAlgemeen]![txtGekozenSchooljaar])));
This expression is typed incorrectly, or it is too complex to be evaluated. For example, a numeric expression may contain too many complicated elements. Try simplifying the expression by assigning parts of the expression to variables.
好的,如果你迁移得很好,那么 TOPS 就上榜了吗?
好吧,如果您使用内置(旧版)SQL 服务器驱动程序,则 datetime2 列将显示为文本。事实上,请停止您所做的所有更改以尝试解决此问题。
应该是零,我重复关于日期时间问题的零更改。当这里需要零更改时,您沿着一条路尝试修复问题。
10秒测试?在设计视图中打开链接 table,并检查 date/time 列是否被视为日期时间,或 AS TEXT!!!!
如果它们被视为文本,那就是你的大问题,不需要尝试修复代码和查询!!! - 我再说一遍,不需要。因此,当需要 none 时,您正在努力追逐。
日期时间问题有两种解决方案: 如果您使用了 Access 迁移助手,那么在迁移之前,将映射更改为在 sql 服务器上使用 datetime,而不是 datetime2
第二种方案: 安装+采用本机11(或者我认为17或19现在是最新的)SQL驱动程序。但是,当您这样做时,您必须 RE-LINK。因此,看起来您将 sql 驱动程序更新为更高版本的本机驱动程序,但您还必须记住 re-link 您的 tables 并 100%(不,200%)确定您 re-link 使用较新的驱动程序编辑了 table。这样做之后,然后再次进行 10 秒测试,将链接 table 切换到 Access 中的设计视图 - 再次 100%、200% 确定日期时间列确实被视为日期时间。
因此,您有两个选择 - 只有您可以决定哪个工作较少。
不要在 sql 服务器 table 中使用 datetime2 数据类型。这将确保 运行 该应用程序能够正常工作的所有工作站。
接受并使用 datetime2 列,但是您必须 re-link 使用较新的“本机 17 或更高版本的 odbc 驱动程序,但您现在还必须在每个工作站上安装该驱动程序。这可能会很痛苦在某些情况下,但是如果您更新 odbc 驱动程序,这是一个非常好的主意,那么您必须按照说明确保在 运行 访问的所有工作站上安装相同的更新驱动程序。当然,它必须是相同版本的 odbc 驱动程序。
所以内置的“传统”sql 驱动程序较旧,不是最好的,但这确实意味着您不必在每个工作站上更改或设置或安装 odbc 驱动程序(它是由默认安装在 windows 的所有版本上 - 至少 20 年来一直如此。
因此,不要继续更改 VBA 代码、表单和您的 sql 查询。
如果您迁移到 sql 服务器,并且还检查设计模式中的 table,它会将列视为日期时间?
THEN ZERO ZERO ZERO 需要对那些现有的要求和表格进行零更改。有并且可以有一些其他的变化,但 datetime 不是这些变化之一。所以,正如我所说,停止你现在所做的事情,解决上述问题。如果您不这样做,您可以在接下来的两周内追查日期时间错误和问题,而无需在此区域进行任何更改。
如上所述,我非常喜欢较新的 sql 驱动程序,但最大的缺点是您必须在每个工作站上安装较新的 odbc 驱动程序。因此,在一些较大的公司部署中,我们继续使用“遗留”或所谓的“非本机”sql 驱动程序。 (Sql 服务器驱动程序)。但是,有了这个选择,我们必须非常小心,不要使用,也不要将 datetime2 列引入数据库,因为它们被内置的旧版驱动程序视为文本列。