访问“IIf”条件会扰乱表的模式

时间:2013-08-02 13:31:57

标签: vb.net ms-access getschematable

我有一个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也很好。

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

我验证了源表TableA,tableB&的架构。 tableC,由应用程序正确解释。

造成这个问题的原因是什么?除了废除“IIf”条件外,还有什么办法可以解决这个问题吗?

N.B。使用System.Data.DataTable.GetSchemaTable(),OleDB函数获取模式表和JetOLEDB4​​.0 dll获得并测试了shema

1 个答案:

答案 0 :(得分:4)

IIf语句似乎正在使其查询字段显示为备忘录类型。也许您可以尝试在IIf([tableC_column] IS NOT NULL, [tableC_column], Iif([tableB_column] IS NOT NULL, [tableB_column], "NA"))函数中包装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应该强制字段为字符串类型。