Microsoft Access表单给出了SQL数据库的错误



故事

我正在为一家使用MS Access数据库的企业做一个项目。我们在不添加关系的情况下将MS Acces数据库转换为sql数据库。并成功地将它们导入了Acces。在表单的某些选项卡中,数据有效,而其他选项卡则无效。

问题

我们在Access中使用Forms,当与MS Access表一起使用时,它可以很好地工作。但当我们切换到MS SQL时,表单的某些部分停止了工作。据我们所知,这似乎与日期有关,但很难调试此类错误。

我们如何修复或找出导致这些错误的原因?

3238:ODBC--数据超出范围。

错误

更新

与此同时,我们已经将ODBC驱动程序编辑为Native 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])));

此表达式类型不正确,或者过于复杂,无法进行求值。例如,一个数字表达式可能包含太多复杂的元素。尝试通过将表达式的一部分分配给变量来简化表达式。

好吧,如果你做了一个好的迁移,那么TOPS在列表中吗?

好吧,如果您使用内置(遗留(SQL server驱动程序,那么datetime2列将显示为文本。事实上,停止你正在做的所有和每一个改变,试图解决这个问题。

应该有零,我重复关于日期时间问题的零变化。当这里需要零变化时,你正沿着一条道路前进,试图解决问题。

10秒的测试?在设计视图中打开链接表,并检查日期/时间列是否显示为日期-时间或as TEXT!!!!

如果它们被视为文本,那么这就是你的巨大问题,并且不需要尝试修复代码和查询!!-我重复一遍,不需要。所以,当你不需要任何东西的时候,你就在大做文章。

日期时间问题有两种解决方案:如果您使用Access迁移助手,那么在迁移之前,请将映射更改为在sql server上使用datetime,而不是datetime2

第二种解决方案:安装+采用本机11(或更高版本,我认为17或19现在是最新的(SQL驱动程序。但是,当你这样做的时候,你必须重新链接。因此,看起来您将sql驱动程序更新为更高版本的本机驱动程序,但您还必须记住重新链接表,并100%(不,200%(确保使用更新的驱动程序重新链接表。在这样做之后,再次进行10秒的测试,将链接表flpping到Access中的设计视图中,并再次100%、200%地确保datetime列确实被视为datetime。

所以,你有两个选择——只有你自己才能决定哪一个工作量较小。

不要在sql server表中使用datetime2数据类型。这将确保运行应用程序的所有工作站都能工作。

请接受并使用datetime2列,但您必须使用较新的"重新链接;本机17或更高版本的odbc驱动程序,但您现在也必须在每个工作站上安装该驱动程序。在某些情况下,这可能会很痛苦,但如果您更新odbc驱动程序,并且这是一个非常好的主意,那么您必须注意,确保在所有运行Access的工作站上安装相同的更新驱动程序。当然,它必须是相同版本的odbc驱动程序。

所以内置的";"遗留";sql驱动程序是旧的,不是最好的,但它确实意味着你不必在每个工作站上更改、设置或安装odbc驱动程序(默认情况下,它安装在所有版本的windows上,而且这种方式已经至少20年了。

因此,不要盲目地更改VBA代码、表单和sql查询。

如果您迁移到sql server,并在设计模式下检查表,它会将该列视为日期-时间?

则要求对这些现有要求和表格进行零零更改。还有其他一些变化,也可能有其他变化,但日期时间不是其中之一。所以,正如我所说,停止你现在正在做的事情,解决上面的问题。如果你不这样做,你可以在接下来的两周里追踪日期时间错误和问题,而这一领域不需要任何更改。

如前所述,我非常喜欢更新的sql驱动程序,但最大的缺点是必须在每个工作站上安装更新的odbc驱动程序。因此,在一些较大的公司部署中,我们继续使用";"遗留";或所谓的";非本地";sql驱动程序。(Sql Server驱动程序(。但是,有了这个选择,我们必须非常小心,不要在数据库中使用或引入datetime2列,因为它们被内置的遗留驱动程序视为文本列。

最新更新