【问题标题】:OleDB only returning DbNull, what have I done wrong?OleDB 只返回 DbNull,我做错了什么?
【发布时间】:2009-08-21 04:45:51
【问题描述】:

我有以下代码:

// personCount = 7291; correct value
int personCount = (int)new OleDbCommand("SELECT COUNT(*) AS [count] FROM [Individual]", _access).ExecuteScalar();
List<Person> people = new List<Person>();

OleDbCommand personQuery = new OleDbCommand("SELECT * FROM [Individual]", _access);

using (OleDbDataReader personReader = personQuery.ExecuteReader())
{
    int curPerson;

    while (personReader.Read())
    {
        curPerson++;
        // This runs several times
        if (personReader.IsDBNull(0)) continue;
        // [snip] create a new Person and add it to people
    }
    // at this point, curPerson == 7291 but the list is empty.
}

这是我的确切代码。字段 0 是主键,因此不应为空,但从数据库返回的每一行都将所有字段设置为 DBNull!我看不出我做错了什么,有人能解释一下吗?

我的连接字符串是:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\path\to\database.mdb

【问题讨论】:

  • 当您对数据库执行查询时,返回的列的顺序是什么?你检查过吗?
  • 无法判断。就像我说的,每个字段都返回 DBNull。 (至少,对于我在进行if (IsDBNull) continue; 进行集体检查之前手动检查的 2-3 条记录。
  • 我不敢相信。您确定序数位置 0 是主键吗? _access 和 _accessGp 是否属于同一个数据库?
  • 您可以做一件事来调试这种情况 - 使用此查询填充数据集,并将其绑定到数据网格。这样您就可以知道确切的数据是什么。
  • @adatapost:它们是同一个变量,通过我的清理。

标签: c# oledb oledbdatareader


【解决方案1】:

出于某种原因,使用* 列选择器会使列混乱。使用特定列表可以解决此问题。我仍然很好奇为什么会发生这种情况。

固定版本:

OleDbCommand personQuery = new OleDbCommand("SELECT [ID], [Surname], ... FROM [Individual]", _access);

【讨论】:

  • 带 * 你只是说“给我所有的列”。您没有定义它们应该返回的顺序。虽然顺序通常与定义相同,但在这种特殊情况下,优化器决定发挥一点作用。最安全的方法是按名称而不是按索引读取字段。
  • 同意,我通常在 PHP/MySQL 中这样做,但据我所知,OleDb 不支持这一点。哦,好吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 2011-08-17
  • 2011-06-01
  • 1970-01-01
相关资源
最近更新 更多