【问题标题】:The data reader is incompatible with the specified, ...does not have a corresponding column in the data reader with the same name数据读取器与指定的不兼容,...在数据读取器中没有对应的同名列
【发布时间】:2016-12-14 01:32:34
【问题描述】:

我的工作项目有问题(使用 ADO.net 实体框架)。我的数据库有 2 个表:

https://i.stack.imgur.com/y3NzM.png

这是我的存储过程:

CREATE PROCEDURE [dbo].[SP_SELECT]
AS
BEGIN
    SELECT I.Id, I.Name, C.Name
    FROM ITEM I, CATEGORY C
    WHERE I.CategoryID = C.Id
END

我尝试运行此存储过程并收到一条消息错误显示:“数据读取器与指定的 'TEST2Model.SP_SELECT_Result' 不兼容。类型的成员 'Name1' 没有对应的列在同名数据读取器中。”

我确实认为 ITEM 中的属性“名称”和 CATEGORY 中的“名称”之间存在问题。 请帮忙,谢谢!

【问题讨论】:

  • 试图让两列同名可能是个坏主意。在SELECT 中给他们起别名。您要选择的 C# 类型是什么?它有两个同名的属性吗?
  • 你能展示一下C#代码吗?

标签: c# sql .net database


【解决方案1】:

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

这个错误很明显。最像您有一个名为SP_SELECT_Result 的类,并且在某一时刻,您的存储过程返回了一个包含Name1 列的结果,因此生成了该类。然后,您已经修改了存储过程,但您尚未更新该代码。因此,在读取存储过程的结果期间,DataReader 试图设置SP_SELECT_ResultName1 属性,但它找不到它,因为您的存储过程的结果中不再包含该属性。

现在您的结果中有 2 个具有相同名称的列:Name。这是行不通的。

如何解决?

更改您的存储过程以返回具有唯一名称的列。此外,在 Visual Studio 中右键单击模型中的存储过程并选择从数据库更新,以便它可以使用最新的存储过程更改来更新 SP_SELECT_Result

【讨论】:

  • 感谢您的解释和解决方案。它对我有用。我给我的专栏起一个别名。我的专栏是“ACTION_NAME”,我将查询更改为“选择 ACTION_NAME ActionName ...”。因为类的属性名称是“ActionName”。再次感谢。
【解决方案2】:

您需要为每一列指定一个唯一的名称,以便 DataReader 在您使用 Item[] 时能够识别每一列。在本例中,我将第二列和第三列的名称分别更改为“ItemName”和“CategoryName”。

CREATE PROCEDURE [dbo].[SP_SELECT]
AS
BEGIN
    SELECT I.Id, I.Name ItemName, C.Name CategoryName
    FROM ITEM I, CATEGORY C
    WHERE I.CategoryID = C.Id
END

【讨论】:

    【解决方案3】:

    有时您需要检查您的存储过程是否进行了一些验证并返回一个空的数据读取器,或者由于验证而没有返回数据。

    我碰巧有存储过程,但它在插入之前有一些验证并有一个打印语句。

    【讨论】:

    • 那么在这种情况下我需要做什么?
    • @ChitraNandpal 确保您返回预期的对象。即使您进行验证尝试返回预期结果。如果 EF 期望 Int,请确保在存储过程中返回一个 int。
    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2013-09-18
    相关资源
    最近更新 更多