1

我有一个 ms-access 文件,其中有一些表是通过在 db 文件中的其他表上使用连接生成的。其中一个表(称为“Pin_Codes”)在脚本中有一个访问“IIf”条件来填充该列。相同的 SQL 脚本如下。

SELECT TableA.POSTCODE AS PINCODE,
       IIf([tableC_column] IS NOT NULL, [tableC_column], Iif([tableB_column] IS NOT NULL, [tableB_column], "NA")) AS DISTRICT
FROM   (TableA
        LEFT JOIN [tableB]
          ON TableA.POSTCODE = [tableB].Postcode)
       LEFT JOIN [tableC]
         ON TableA.POSTCODE = [tableC].Postcode_Final;

所以表 Pin_Codes 中有 2 列名为 PINCODE(类型字符串)和 DISTRICT(类型字符串)

我在我的应用程序中导入了这个访问文件,它首先检查 accdb 文件中所有表的模式。但是当它得到 Pin_Codes 的模式时,DISTRICT 列的 max_length 大约为 577346(应该是 255,因为它是字符串类型)。PINCODE 的 max_length 可以达到 255。

即使是一个虚拟的 IIf 条件(始终具有真条件和相同的真假部分)也会产生此错误。此外,删除 DISTRICT 列的 IIf 条件(并用 tableB_column 或“NA”填充它)解决了这个问题,长度值变为 255。

我验证了源表 TableA、tableB 和 tableC 的架构,应用程序正在正确解释这些架构。

这个问题的原因可能是什么,有什么办法(除了取消“IIf”条件)来克服这个问题吗?

注意 使用 System.Data.DataTable.GetSchemaTable()、OleDB 函数来获取架构表和 JetOLEDB4​​.0 dll 获得并测试了 shema

4

1 回答 1

4

似乎该IIf语句正在使其查询字段看起来是一种备忘录类型。也许您可以尝试将IIf([tableC_column] IS NOT NULL, [tableC_column], Iif([tableB_column] IS NOT NULL, [tableB_column], "NA"))or包装Nz([tableC_column], Nz([tableB_column], "NA"))在一个CStr()函数中:

SELECT TableA.POSTCODE AS PINCODE,
       CStr(IIf([tableC_column] IS NOT NULL, [tableC_column], Iif([tableB_column] IS NOT NULL, [tableB_column], "NA"))) AS DISTRICT
FROM   (TableA
        LEFT JOIN [tableB]
          ON TableA.POSTCODE = [tableB].Postcode)
       LEFT JOIN [tableC]
         ON TableA.POSTCODE = [tableC].Postcode_Final;

或者

SELECT TableA.POSTCODE AS PINCODE,
       CStr(Nz([tableC_column], Nz([tableB_column], "NA"))) AS DISTRICT
FROM   (TableA
        LEFT JOIN [tableB]
          ON TableA.POSTCODE = [tableB].Postcode)
       LEFT JOIN [tableC]
         ON TableA.POSTCODE = [tableC].Postcode_Final;

CStr 应该强制该字段为字符串类型。

于 2013-08-07T23:38:20.287 回答