2

[很抱歉问题很长,但我认为其他人回答会更清楚]

我有一个 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

任何线索为什么它应该发生?

4

3 回答 3

2

尝试仅将 OleDbCommand 对象与生成的 SQL 一起使用,并遍历使用 OleDbDataReader 返回的内容。

然后尝试使用这个 SQL 字符串

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

我相信这可能与 Jet 数据库中用于 Yes/No 数据类型的基础值有关。

是/否

逻辑字段可以显示为是/否、真/假或开/关。在代码中,使用常量 True 和 False,分别相当于 -1 和 0。

看看开发者社区下的BLS 站点- 有 Linq to Access 解决方案的源代码

于 2009-03-07T11:36:52.753 回答
0

正如 Russ 所指出的,这看起来像是布尔值不同表示的问题。

尝试将“Where p.active”更改为“Where p.active <> 0”

于 2009-03-07T11:50:32.830 回答
0

看看 productTable.active 字段包含 Access 数据库的内容,我敢打赌它可能不是 0 或 1。它可能是 -1。

你可能想要的是这样的:

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

更新:(
OP
告诉我这在 linq/C# 中不起作用;但必须有一种方法可以在 linq 中执行与以下 SQL 等效的操作

Select * 
from Customers
where active = -1

)

如果失败(例如,它显示为 yes/no | true/false),请尝试读取 Active in 的值并通过 msgbox 输出它,以查看它真正包含的内容。

于 2009-03-10T15:49:38.283 回答