4

C# で GUI を作成しています。lowerPageBound から upperPageBound への要素を取得する次のコード行があります。

command.CommandText = "Select Top " + rowsPerPage + " " +
        CommaSeparatedListOfColumnNames + " From " + tableName +
        " WHERE " + columnToSortBy + " NOT IN (SELECT TOP " +
        lowerPageBoundary + " " + columnToSortBy + " From " +
        tableName + " Order By " + columnToSortBy +
        ") Order By " + columnToSortBy;
adapter.SelectCommand = command;
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
adapter.Fill(table);

生成された SQL ステートメントは、アクセス データベースで使用するとエラー (adapter.Fill(table) が実行されます) を返しますが、SQL データベースでは正常に動作します。

生成される SQL は次のとおりです。

Select Top 25 [ID], [Business Process], [Tier Level], [Application], [CI ID], [Server], [Server Function], [Data Center], [HA], [DR Equip], [Procedure], [Procedure Tested], [Type], [Outcome], [Overall Status] From Data WHERE ID NOT IN (SELECT TOP 0 ID FROM Data ORDER BY ID) ORDER BY ID;

そして、私が受け取るエラー:

Syntax error in query expression 'ID NOT IN (SELECT TOP 0 ID FROM Data ORDER BY ID)'.

これを何時間も修正しようとしましたが、うまくいきませんでした。同じステートメントがアクセス データベースで機能しない理由がわかりません。どんな助けでも大歓迎です!!

4

2 に答える 2

4

Access db エンジンは、クエリのこの部分でエラーをスローします。

SELECT TOP 0 ID FROM Data ORDER BY ID

そのセクションを分割して、新しい Access クエリとしてテストできます。残念ながら、エラー メッセージはあまり役に立ちません。「SELECT ステートメントには、予約語または引数名のスペルが間違っているか、欠落しているか、句読点が正しくありません。」 これは、データベース エンジンが実行されたときに表示される一般的なエラー メッセージのようなものです。問題を正確に説明することができません。

SELECT TOP 0基本的に、それは Access SQL では できないという事実に要約されます。

また、 に関する問題を解決したら、外側のクエリに句SELECT TOP 0が必要になります。ORDER BYがない場合ORDER BY、 によって返される行TOP 25は任意です。

于 2012-07-26T18:22:34.623 に答える
3

ページング機能を実行するには、次のことができます。

  • pagestart が 0 の場合は、NOT IN 句を省略します。
  • メソッドを使用しSELECT TOP pagesize * FROM (SELECT TOP pagestart + pagesize * FROM X ORDER BY Condition) AS Alias ORDER BY Condition DESCます。重要な部分は、2 番目の ORDER BY が最初の方向とは逆になっていることです。クライアントがこれを実行できる必要がありますが、正しい順序を取得するために最終的な ORDER BY が必要になる場合があります。Access 2007 より前は、デザイナーはその派生テーブル (かっこ内の部分) を に変更していまし[SELECT ...]. AS Aliasたが、現在は変更されていません。

これらが不十分な場合は、さらに多くの方法があります。

サポートされていないことについて HansUp が述べたことに加えて、質問への回答としてではなく、有益な情報として、TOP 0SQL Server と Access 構文の他の違いに遭遇する可能性もあります。これを軽減するには、DB レベルの設定を調べて、SQL Server 構文を使用することをお勧めします。完全ではありませんが、Access では通常失敗するいくつかの構文を使用できます。プロジェクトの途中で切り替えると問題が発生する可能性があることに注意してください。ANSI 89 および ANSI 92 構文の非互換性に関する情報を参照してください。

于 2012-07-26T19:27:17.613 に答える