5

我正在尝试对 Access DB 运行一个简单的语句来查找记录。

记录中的数据验证非常糟糕,我无法对其进行清理。意思是,它必须保持原样。

我需要能够搜索删除了空格和连字符的字符串。以下语句将在 Access 2010 direct 中起作用:

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 文件中创建的,该文件具有从原始数据库链接的原始表。

* 更新 *

OleDB 并没有真正影响任何事情。

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

我也没有尝试将它用作 Web 后端。我不是施虐狂。

我必须支持一个使用 Access 作为后端的遗留系统。数据来自其他旧系统,我必须将其集成到更现代的系统中。因此,使用 Apache/PHP 创建一个在支持遗留系统的服务器上运行的 API。

我需要能够搜索具有字母数字大小写标识符的表,以获取唯一且与生成器相关联的数字标识符(访问中的自动编号)。用户多年来一直将其用作垃圾箱(数据输入不一致,带有零星符号),因此我唯一的解决方案是从字段值和搜索值中删除除字母数字之外的所有内容,并尝试对其执行 LIKE 比较。

如果不支持访问的 replace(),存在哪些 ODBC 兼容函数可以用来进行相同类型的比较?

4

2 回答 2

5

Replace()回顾一下,除非您的查询是在 Access 应用程序会话中运行的,否则Access db 引擎将无法识别该函数。来自 Access 外部的任何尝试都将触发“未定义函数”错误消息。您无法通过从 ODBC 切换到 OleDb 作为连接方法来避免错误。而且您也不能通过将引擎Replace()隐藏在单独的查询中(在同一个或另一个 Access db 中)并将该查询用作主查询的数据源来欺骗引擎。

此行为由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. 在 SQL Server 中将原始 Access db 设置为链接服务器并构建查询以利用 SQL Server 功能。
  3. 投降。:-( 将更大的数据集拉入您的 PHP 客户端代码,并评估要使用哪些行与忽略哪些行。
于 2012-09-22T14:38:00.837 回答
-2

我不确定您是否可以使用 ODBC 和您的约束来做到这一点。MS Access 驱动程序受到限制(根据设计;MS 希望您将 SQL Server 用于后端)。

你能用OLEDB吗?这可能是一种选择。

于 2012-09-21T21:17:42.303 回答