【问题标题】:"The data reader has more than one field" error in Entity Framework实体框架中的“数据读取器具有多个字段”错误
【发布时间】:2013-04-10 17:12:21
【问题描述】:

我正在使用 Entity Framework 执行这个简单的查询

db.Database.SqlQuery<string>("SELECT * FROM hospital");

但是我收到了这个错误:

数据读取器有多个字段。多个字段对 EDM 基元或枚举类型无效。

可能是什么问题?

【问题讨论】:

  • 试试这个 db.ExecuteStoreCommand("SELECT * FROM hospital");
  • 它说我不包含 ExecuteStoreCommand 的定义...您是否缺少 using 指令或 assambly 参考?
  • 试试这个 db.Database.ExecuteSqlCommand
  • 它也不起作用,在foreach中抛出异常'cannot convert int to IEnumerable'

标签: c# .net entity-framework


【解决方案1】:

看看医院表是什么样子会很有用,但假设像医院这样简单的东西由 HospitalId 和 HospitalName 组成,那么您有几个选择。

//would work if all you're trying to do is get the Name:
db.Database.SqlQuery<IEnumerable<string>>("SELECT hospitalName FROM hospital"); 

//where you define MyEntity as the same structure as the table would work
db.Database.SqlQuery<MyEntity>("SELECT * FROM hospital"); 

// would theoretically work although I haven't tried it.  Where the Tuple 
// items would have to match the database types in order.  I.e. if field 1 
// is an int and field 2 is a string then Tuple<int,string>
db.Database.SqlQuery<IEnumerable<Tuple<int, string>>>("SELECT * FROM hospital");

基本上错误是代码不知道如何将医院的结构填充到字符串中

【讨论】:

  • 并非所有 holpital 值中的值都是字符串
  • 第一个给出错误:“数据读取器有多个字段。多个字段对 EDM 基元或枚举类型无效”。一位说,ID与数据库中的ID不同,但相同。最后一个说:“结果类型'System.Collections.IEnumerable'可能不是抽象的,必须包含默认构造函数。”
  • 整个问题是,函数 SqlQuery 需要一个容器来压缩结果,所以 SqlQuery 意味着您最多可以检索一个字符串类型的字段。所以你可能应该使用 cgotbergs 第二个例子!
  • 你知道,我会选择第二个。 ID 与数据库中的 ID 不同的问题是,由于某种原因,我不得不将表的所有字段添加到查询字符串中。我的意思是,我必须写“SELECT hospital_phone, holpital_street, etc, etc FROM hospital”,如果我写“SELECT hospital_name FROM hospital”,就会发生异常......
  • 使用 IEnumerable 总是对我失败。我使用 List 并且效果很好:)
【解决方案2】:

如果您尝试执行 INSERTUPATEDELETE 命令,也可能会收到此错误

不要使用SqlQuery,而是使用ExecuteSqlCommand

using (var ctx = new SchoolDBEntities())
{
    int noOfRowUpdated = ctx.Database.ExecuteSqlCommand("Update student 
            set studentname ='changed student by command' where studentid=1");

    int noOfRowInserted = ctx.Database.ExecuteSqlCommand("insert into student(studentname) 
            values('New Student')");

    int noOfRowDeleted = ctx.Database.ExecuteSqlCommand("delete from student 
            where studentid=1");
}

欲了解更多详情,请访问 - http://www.entityframeworktutorial.net/EntityFramework4.3/raw-sql-query-in-entity-framework.aspx

【讨论】:

    【解决方案3】:

    这解决了我的问题,有些结果没有达到预期的效果

    string storedProcedure = "Admin_AutoGenerateKeywordsFortblCompany @Company_ID=" 
                              + CompId;
    
    var s = db.ExecuteStoreQuery<List<string>>("exec " + storedProcedure).ToList();
    

    这里可以捕获单个或多个结果

    【讨论】:

    • 对于 2016 年的答案,您正在使用 ObjectContext 上学,这很好,但我会在您的代码中为人们解释这一点。
    【解决方案4】:

    根据 cgotberg 给我的第二个答案,我将回答我自己的问题。 该代码的问题是某些表的字段与数据库中的字段不同(我正在寻找异常但我找不到它,对此感到抱歉)但它确实存在。 出于某种原因,我不得不将表的所有字段添加到查询字符串中。我的意思是,我必须写“SELECT hospital_phone、holpital_street 等 FROM hospital”,如果我写“SELECT hospital_name FROM hospital”,就会发生异常。

    希望我已经解释清楚了。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多