1

db ファイル内の他のテーブルの結合を使用して生成されたいくつかのテーブルを含む ms-access ファイルがあります。テーブルの 1 つ ("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 には PINCODE (文字列型) と DISTRICT (文字列型) という名前の 2 つの列があります。

このアクセス ファイルをアプリケーションにインポートすると、最初に accdb ファイル内のすべてのテーブルのスキーマがチェックされます。しかし、Pin_Codes のスキーマを取得すると、DISTRICT 列の max_length は約 577346 になります (文字列型であるため、255 である必要があります)。ただし、PINCODE の max_length は 255 で問題ありません。

ダミーの IIf 条件 (常に真の条件があり、真と偽の部分が同じ) でも、このエラーが発生します。さらに、DISTRICT 列の IIf 条件を削除すると (そして、tableB_column または "NA" と入力すると)、問題が解決し、長さの値は 255 になります。

アプリケーションによって適切に解釈されているソース テーブル TableA、tableB、および tableC のスキーマを確認しました。

この問題の原因は何ですか?これを克服する方法はありますか (「IIf」条件を廃止する以外に)?

NB スキーマは、System.Data.DataTable.GetSchemaTable()、スキーマ テーブルを取得するための OleDB 関数、および JetOLEDB4​​.0 dll の両方を使用して取得およびテストされました。

4

1 に答える 1

4

このIIfステートメントは、クエリ フィールドをメモ型に見せかけているように見えます。おそらく、IIf([tableC_column] IS NOT NULL, [tableC_column], Iif([tableB_column] IS NOT NULL, [tableB_column], "NA"))orNz([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 に答える