Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OleDB只返回DbNull,我做错了什么?_C#_Oledb_Oledbdatareader - Fatal编程技术网

C# OleDB只返回DbNull,我做错了什么?

C# OleDB只返回DbNull,我做错了什么?,c#,oledb,oledbdatareader,C#,Oledb,Oledbdatareader,我有以下代码: // 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 OleDb

我有以下代码:

// 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.
}
//personCount=7291;正确值
int personCount=(int)新的OleDbCommand(“从[Individual]中选择COUNT(*)作为[COUNT]”,_access.ExecuteScalar();
列表人员=新列表();
OleDbCommand personQuery=新OleDbCommand(“从[个人]中选择*”,\u访问);
使用(OleDbDataReader personReader=personQuery.ExecuteReader())
{
内部人员;
while(personReader.Read())
{
curPerson++;
//这运行了好几次
如果(personReader.IsDBNull(0))继续;
//[snip]创建一个新人物并将其添加到人物中
}
//此时,curPerson==7291,但列表为空。
}
这是我的密码。字段0是主键,因此不应为null,但从数据库返回的每一行都将所有字段设置为DBNull!我看不出我做错了什么,有人能解释一下吗

我的连接字符串是:

Provider=Microsoft.Jet.OLEDB.4.0;数据源=C:\path\to\database.mdb


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

固定版本:

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

在数据库上执行查询时,返回列的顺序是什么?你查过了吗?没办法说。就像我说的,每个字段都返回DBNull。(至少,对于我在执行
if(IsDBNull)之前手动检查的2-3条记录)继续;
整体检查。我不敢相信。你确定序号位置0是主键吗?access和accessGp是否属于同一个数据库?你可以做一件事来调试这种情况-使用此查询填充数据集,并将其绑定到数据网格。这样你就知道确切的数据是什么。@adatapost:它们是ame变量,在我的清理过程中滑过。用*你只是说“给我所有列”。您没有定义返回字段的顺序。虽然顺序通常与定义中的顺序相同,但在这种情况下,优化器决定稍微调整一下。最安全的方法是按名称而不是按索引读取字段。同意,我通常在PHP/MySQL中这样做,但我可以说OleDb不支持这一点。哦,好的。