【问题标题】:The data reader is incompatible with the specified [X]. A member of the type数据读取器与指定的 [X] 不兼容。类型的成员
【发布时间】:2021-02-28 19:08:21
【问题描述】:

我是 ASP.NET MVC 的新手,在调用插入记录的存储过程时收到此错误消息:

数据读取器与指定的“SITHModel.Request”不兼容。类型的成员“ID”在数据读取器中没有同名的对应列。

在 return 语句中抛出异常。

public virtual ObjectResult<Request> AddRequest(Nullable<int> routeID, string email, string description, string aDDEDBYID)
{
    var routeIDParameter = routeID.HasValue ?
            new ObjectParameter("RouteID", routeID) :
            new ObjectParameter("RouteID", typeof(int));

    var emailParameter = email != null ?
            new ObjectParameter("Email", email) :
            new ObjectParameter("Email", typeof(string));

    var descriptionParameter = description != null ?
            new ObjectParameter("Description", description) :
            new ObjectParameter("Description", typeof(string));

    var aDDEDBYIDParameter = aDDEDBYID != null ?
            new ObjectParameter("ADDEDBYID", aDDEDBYID) :
            new ObjectParameter("ADDEDBYID", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Request>("AddRequest", routeIDParameter, emailParameter, descriptionParameter, aDDEDBYIDParameter);
}

AddRequest 在下面。

ALTER PROCEDURE [dbo].[AddRequest]
    (@RouteID int,
     @Email nvarchar(100),  
     @Description nvarchar(4000),   
     @AddedByIDnvarchar(128))
AS
BEGIN
    INSERT INTO Request (RouteID, Email, Description, AddedByID, ChangedByID)
    VALUES (@RouteID, @Email, @Description, @AddedByID, @AddedByID)
END

我不希望存储过程返回任何内容,并且我对其他类似模型和存储过程没有问题。

控制器

// POST: Requests/Create
// To protect from overposting attacks, enable the specific properties you want to bind to, for 
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,RouteID,Email,Description,AddedByID,ChangedByID,DateAdded,DateChanged")] Request request)
{
    if (ModelState.IsValid)
    {
        var userID = "00000000-0000-0000-0000-000000000001";

        if (User.Identity.IsAuthenticated)
        {
            userID = User.Identity.GetUserId();
        }
            
        db.AddRequest(request.RouteID, request.Email, request.Description, userID);

        return RedirectToAction("ThankYou");
    }

    ViewBag.AddedByID = new SelectList(db.AspNetUsers, "Id", "Email", request.AddedByID);
    ViewBag.ChangedByID = new SelectList(db.AspNetUsers, "Id", "Email", request.ChangedByID);
    ViewBag.RouteID = new SelectList(db.Routes, "ID", "Name", request.RouteID);

    return View(request);
}

知道我可以更新或删除什么来使其正常工作吗?

【问题讨论】:

  • new ObjectParameter("RouteID", typeof(int)) 会将类型 Int32 添加为参数值,对吗?也许你想要 new ObjectParameter("RouteID", default(int)) ?
  • 您正在执行 ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction,这意味着您希望函数返回一些与某些请求类型匹配的行。但是正如您自己所说的那样-您的程序不会返回任何内容,因此会出现错误。只需使用不带泛型参数的 ExecuteFunction,并且不要从该方法返回任何内容
  • 我删除了返回类型,这是有道理的,但是我仍然得到同样的异常。有什么想法吗?
  • 您需要stackoverflow.com/questions/24126767/… 之类的东西吗?
  • 这个也不行。

标签: c# sql-server asp.net-mvc tsql


【解决方案1】:

ExecuteFunction&lt;Request&gt; 必须具有 Request 类型的输出。

在存储过程结束时,编写一个返回 Request 对象列的 Select。

这些列必须对应于Request 对象类属性。

你也可以跳过写泛型。

改变

return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Request>("AddRequest", routeIDParameter, emailParameter, descriptionParameter, aDDEDBYIDParameter);

return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("AddRequest", routeIDParameter, emailParameter, descriptionParameter, aDDEDBYIDParameter);

但如果你需要存储过程的结果,首先将存储过程更改为

ALTER PROCEDURE [dbo].[AddRequest]
    (@RouteID int,
     @Email nvarchar(100),  
     @Description nvarchar(4000),   
     @AddedByIDnvarchar(128))
AS
BEGIN
    INSERT INTO Request (RouteID, Email, Description, AddedByID, ChangedByID)
    VALUES (@RouteID, @Email, @Description, @AddedByID, @AddedByID)
    
    SELECT * FROM Request
END

然后使用ObjectContext.ExecuteFunction&lt;Request&gt;

  return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Request>("AddRequest", routeIDParameter, emailParameter, descriptionParameter, aDDEDBYIDParameter);

【讨论】:

  • 你检查过没有NULL的参数吗?
【解决方案2】:

我最终不得不从我的模型中删除这个实体,删除控制器,然后重新添加实体和控制器。像魅力一样工作!

【讨论】:

    【解决方案3】:

    由于它不是模型的一部分且操作不需要,请尝试从控制器 Create() API 的 Bind 属性中删除 ID

    public ActionResult Create([Bind(Include = "RouteID,Email,Description,AddedByID,ChangedByID,DateAdded,DateChanged")] Request request)
    

    而不是

    public ActionResult Create([Bind(Include = "ID,RouteID,Email,Description,AddedByID,ChangedByID,DateAdded,DateChanged")] Request request)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2013-09-18
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多