簡體   English   中英

針對Access 2010 DB的SQL語句不能與ODBC一起使用

[英]SQL statement against Access 2010 DB not working with ODBC

我正在嘗試對Access DB運行一個簡單的語句來查找記錄。

記錄中的數據驗證非常糟糕,我無法對其進行消毒。 意思是,它必須保持原樣。

我需要能夠搜索帶有空格和刪除連字符的字符串。 以下語句將直接在Access 2010中使用:

select * from dummy where Replace(Replace([data1],' ',''),'-','') = 'ABCD1234';

通過PHP從ODBC連接運行它不會。 它會產生以下錯誤:

SQL error: [Microsoft][ODBC Microsoft Access Driver] Undefined function 'Replace' in expression., SQL state 37000 in SQLExecDirect

在運行該函數的數據庫中創建查詢並嘗試間接搜索其值會導致相同的錯誤:

select * from dummy_indirect where Expr1 = 'ABCD1234';

我試圖使用兩個ODBC驅動程序。 ODBCJR32.dll(03/22/2010)和ACEODBC.dll(02/18/2007)。 據我所知,這些應該是最新的,因為它與完整的Access 2010和Access 2010數據庫引擎一起安裝。

有關如何解決此錯誤並實現相同效果的任何想法都是受歡迎的。 請注意,我無法以方式,形狀或形式更改數據庫。 該間接查詢是在另一個mdb文件中創建的,該文件具有從原始DB鏈接的原始表。

*更新*

OleDB並沒有真正影響任何事情。

$dsn= "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\dummy.mdb;";

我也沒有嘗試將它用作網絡后端。 我不是一個虐戀者。

我必須支持遺留系統,它確實使用Access作為后端。 數據從其他舊系統填充,我必須將其集成到更現代的系統中。 因此,在支持遺留系統的服務器上運行的Apache / PHP創建API。

我需要能夠搜索具有字母數字大小寫標識符的表,以獲得唯一的數字標識符並綁定到生成器(訪問中的自動編號)。 用戶多年來一直使用垃圾箱(使用偶發符號進行不一致的數據輸入),因此我唯一的解決方案是從字段值和搜索值中刪除除字母數字之外的所有內容,並嘗試對其執行LIKE比較。

如果不是支持訪問的replace(),我可以使用哪些ODBC兼容函數做同樣的比較?

回顧一下,除非從Access應用程序會話中運行查詢,否則Access數據庫引擎將無法識別Replace()函數。 來自Access外部的任何嘗試都將觸發“未定義函數”錯誤消息。 您無法通過從ODBC切換到OleDb作為連接方法來避免錯誤。 而且你也不能通過將引擎隱藏在單獨的查詢中(在相同或另一個Access數據庫中)並使用該查詢作為主查詢的數據源來欺騙引擎使用Replace()

此行為由Access的沙盒模式確定。 該鏈接頁面包含默認沙箱模式中可用的功能列表。 該頁面還描述了如何更改沙箱模式。 如果絕對必須具有可用於查詢的Replace() ,則最低設置(0)可能允許它。 但是,我不建議你這樣做。 我自己從未這樣做過,所以對后果一無所知。

至於Replace()替代方案,它將有助於了解您正在搜索的值的可變性。 如果空格或短划線字符僅出現在一個或幾個一致的位置,則可以使用Like表達式進行模式匹配。 例如,如果搜索字段值包含4個字母,可選空格或短划線,后跟4個數字,則此類WHERE子句應適用於“ABCD1234”的變體:

SELECT * FROM dummy
WHERE
       data1 = 'ABCD1234'
    OR data1 Like 'ABCD[- ]1234';

另一種可能性是與值列表進行比較:

SELECT * FROM dummy
WHERE
       data1 IN ('ABCD1234','ABCD 1234','ABCD-1234');

但是,如果您的搜索字段值可以在字符串中的任何位置包含任意數量的空格或短划線,那么這種方法就不合適了。 對於使查詢任務更容易的某種方式,我會看起來很難:

  1. 您無法清除存儲的值,因為您禁止以任何方式更改原始Access數據庫。 也許你可以創建一個新的Access數據庫,導入數據,然后清理它。
  2. 將原始Access數據庫設置為SQL Server中的鏈接服務器,並構建查詢以利用SQL Server功能。
  3. 投降。 :-(將更大的數據集提取到PHP客戶端代碼中,並評估要使用哪些行以及要忽略哪些行。

我不確定你能用ODBC和你的約束來做到這一點。 MS Access驅動程序是有限的 (按設計; MS希望您使用SQL Server作為后端)。

你能用OLEDB嗎? 這可能是一種選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM