故事
我正在為使用 MS Access 資料庫的企業開發一個專案。我們在不添加關系的情況下將 MS Acces db 轉換為 sql db。并成功將它們匯入到 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])));
此運算式鍵入不正確,或者它太復雜而無法計算。例如,一個數值運算式可能包含太多復雜的元素。嘗試通過將運算式的一部分分配給變數來簡化運算式。
uj5u.com熱心網友回復:
好吧,如果你做了一個很好的遷移,那么TOPS就行了?
好吧,如果您使用內置(舊版)SQL 服務器驅動程式,那么 datetime2 列將顯示為文本。事實上,停止所有和你正在嘗試解決這個問題的每一個改變。
應該有零,我重復關于日期時間問題的零變化。當此處需要進行零更改時,您會沿著一條路走下去,試圖解決問題。
10秒測驗?在設計視圖中打開鏈接表,并檢查日期/時間列是否被視為日期時間,或作為文本!!!!
如果它們被視為文本,那么這就是你的大問題,并且不需要嘗試修復代碼和查詢!!!- 我重復一遍,不需要。因此,當您不需要任何東西時,您就會大吃一驚。
datetime 問題有兩種解決方案:如果您使用了 Access 遷移助手,那么在遷移之前,將映射更改為在 sql server 上使用 datetime,而不是 datetime2
第二種解決方案:安裝 采用本機11(或更高版本我認為17或19現在是最新的)SQL驅動程式。但是,當你這樣做時,你必須重新鏈接。因此,看起來您將 sql 驅動程式更新為更高版本的本機驅動程式,但您還必須記住重新鏈接表并 100%(不,200%)確保使用較新的驅動程式重新鏈接表。在這樣做之后,再一次,將鏈接表翻轉到 Access 中的設計視圖中的 10 秒測驗 - 再次 100%、200% 確保日期時間列確實被視為日期時間。
所以,你有兩個選擇——只有你可以決定哪個是更少的作業。
不要在 sql server 表中使用 datetime2 資料型別。這將確保運行該應用程式的所有作業站都能正常作業。
接受并使用 datetime2 列,但是您必須使用較新的“本機 17 或更高版本的 odbc 驅動程式重新鏈接,但您現在還必須在每個作業站上安裝該驅動程式。在某些情況下這可能會很痛苦,但如果您更新odbc 驅動程式,這是一個非常好的主意,那么您必須如上所述確保在所有運行 Access 的作業站上安裝相同的較新驅動程式。當然,它必須是相同版本的 odbc 驅動程式。
因此,內置的“舊版”sql 驅動程式較舊,不是最好的,但這確實意味著您不必在每個作業站上更改、設定或安裝 odbc 驅動程式(默認情況下,它安裝在所有版本的 Windows 上 - 并且至少 20 年來一直如此。
所以,不要去更改 VBA 代碼、表單和你的 sql 查詢。
如果您遷移到 sql server,并且還在設計模式下檢查表,它會將列視為日期時間?
THEN ZERO ZERO ZERO 對那些現有的要求和表格進行零更改。有并且可能有其他一些變化,但日期時間不是這些變化之一。所以,正如我所說,停止你現在做的事情,解決上述問題。如果您不這樣做,您可以在接下來的兩周內追查日期時間錯誤和在此區域不需要更改的問題。
如前所述,我非常喜歡較新的 sql 驅動程式,但最大的缺點是您必須在每個作業站上安裝較新的 odbc 驅動程式。因此,在一些較大的企業部署中,我們繼續使用“遺留”或所謂的“非本地”sql 驅動程式。(Sql Server 驅動程式)。但是,有了這種選擇,我們必須非常小心,不要使用,也不要將 datetime2 列引入資料庫,因為它們被內置的遺留驅動程式視為文本列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/429060.html
下一篇:如何從ExcelVBA運行查詢
