我有一个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
答案 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应该强制字段为字符串类型。