2009-03-07 7 views
2

を使用して、Microsoft Accessとフィルタリングデータの列[長い質問の謝罪が、私は他の人が答えるすることが明確になるだろうと思っ]ブールLINQ

私はMicrosoft Accessデータベースを持っており、それが次を持つテーブル「顧客」が含まれていますコラム:

  • ID(自動番号)
  • 名(テキスト)
  • アクティブ(はい/いいえ)

私は以下のようにC#でデータベースのテーブルクラスを作成しました:

[Table (Name = "Products")] 
public class Product 
{ 
    [Column (IsPrimaryKey = true, Name = "ProductID")] 
    public int ID; 

    [Column (Name = "ProductName")] 
    public string Name; 

    [Column (Name = "Active")] 
    public bool Active; 
} 

そして、私はアクティブになっている製品を取得するには、次のコードスニペットを使用しています:

using (var con = new OleDbConnection 
     (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\LearnLinq.accdb")) { 
    var db = new DataContext (con); 
    var productTable = db.GetTable<Product>(); 
    var allProducts = from p in productTable 
         where p.Active 
         select p; 

    foreach (var p in allProducts) { 
     AddLine ("ID: " + p.ID.ToString() + 
      ", Name: " + p.Name + 
      ", Active: " + p.Active.ToString()); 
    } 
} 

問題はその "でクエリ結果の上にあります記録なし"。私は生成されたSQLを分析しようとしました。それは以下のようなものです:

SELECT [t0].[ProductID] AS [ID], [t0].[ProductName] AS [Name], [t0].[Active] 
FROM [Products] AS [t0] 
WHERE [t0].[Active] = 1 

なぜそれが起こっているはずですか?

+0

クラスのために投稿したコードはVBAではありません。どんな言語でプログラミングしていますか?あなたは明らかにAccess、Jetだけを使用していません。これは答えに大きな違いをもたらします。 –

+0

上記のコードは、単純なC#windowsフォームアプリケーションから来ています。 – Hemant

答えて

2

OleDbCommandオブジェクトを生成されたSQLとともに使用し、OleDbDataReaderを使用して返される内容を反復処理してみます。

その後、私はそれがはい/ Jetデータベースではありませんデータ型に使用する基礎となる値とは何かを持っていることと信じて、このSQL文字列

SELECT [t0].[ProductID] AS [ID], [t0].[ProductName] AS [Name], [t0].[Active] 
FROM 
[Products] AS [t0] 
WHERE [t0].[Active] = YES 

てみてください。

はい/いいえ

論理フィールドは、はい/いいえ、真/偽、またはオン/オフ として表示 になることはできません。コードでは、それぞれ のTrueとFalseという定数を使用して、それぞれ-1と0になります。

はラスが、それはブール値の異なる表現に問題があるように見える指摘したようにLINQのは、ソリューションに

0

にアクセスするためのソースコードがある地域社会開発の下BLS siteを見てください。

は「p.active <> 0」

+0

pのアクティブなプロパティはbooleanです。その文を書くことはできません! – Hemant

0

ルックとAccessデータベースが含まれているものをproductTable.activeフィールド参照に「どこp.active」、 私はそれはおそらく、0または1ではない賭けを変更してみてくださいそれは-1かもしれません。

var allProducts = from p in productTable 
        where p.Active = -1 
        select p; 

更新:

O.P.お勧めします何

はこのようなものですlinq/C#ではこれが動作しないと私に伝えます。 )真/偽の値を読んでみてください|が、(例えば、それがはい/いいえとして表示することに失敗

)LINQで

Select * 
from Customers 
where active = -1 

を次のSQLと同等のものを実行する方法がなければなりませんそれが実際に何を含んでいるかを見るためにただmsgboxを通してアクティブにし、それを出力してください。

+0

兄弟はいませんが、 1.等号は割り当てであり、比較には使用できません。 2.クラス定義からわかるように、Activeプロパティはbooleanで、integerと比較することはできません。 – Hemant

+0

違反はありません。私はLinq/C#プログラマーではなく、Cで長年過ごしたので、私はあなたの意見を参考にしています。私の他の考え方については、私の更新を参照してください。 – BIBD