Логический столбец в Microsoft Access и фильтрация данных с использованием linq - PullRequest
2 голосов
/ 07 марта 2009

[Извиняюсь за длинный вопрос, но я подумал, что другим будет яснее ответить]

У меня есть база данных 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

Есть какие-нибудь подсказки, почему это должно происходить?

Ответы [ 3 ]

2 голосов
/ 07 марта 2009

Попробуйте просто использовать объект OleDbCommand с сгенерированным SQL и перебирать то, что возвращается с помощью OleDbDataReader.

Затем попробуйте эту строку SQL

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

Я полагаю, что это может иметь какое-то отношение к базовым значениям, используемым для типа данных Да / Нет в базе данных Jet.

Да / Нет

Логическое поле может быть отображается как Да / Нет, Правда / Ложь или Вкл выкл. В коде используйте константы Верно и неверно, эквивалентно -1 и 0 соответственно.

Загляните на сайт BLS в разделе Сообщество разработчиков. Существует исходный код для решения Linq to Access

0 голосов
/ 10 марта 2009

Посмотрите и посмотрите, что поле productTable.active содержит базу данных Access, Могу поспорить, что это, вероятно, не 0 или 1. Это может быть -1.

То, что вы можете захотеть, выглядит примерно так:

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

Обновление:
(
О. говорит мне, что это не сработает в linq / C #; но должен быть способ сделать эквивалент следующего SQL в linq

Select * 
from Customers
where active = -1

)

В противном случае (например, он отображается как да / нет | истина / ложь) попробуйте прочитать значение Active in и вывести его через msgbox, чтобы посмотреть, что оно действительно содержит.

0 голосов
/ 07 марта 2009

Как заметил Расс, это выглядит как проблема с другим представлением логических значений.

Попробуйте изменить «Где p.active» на «Где p.active <> 0»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...