【问题标题】:SQL Server stored procedure returning correct number of rows, but all rows are the sameSQL Server 存储过程返回正确的行数,但所有行都相同
【发布时间】:2014-10-09 04:37:09
【问题描述】:

不确定问题出在哪里...我编写了一个存储过程(在 SQL Server Mgmt.Studio 中执行时)返回我希望看到的结果:

USE [DataViewer]
GO
/****** Object:  StoredProcedure [dbo].[DV_GetPSCTreeNodes]    Script Date: 08/10/2014 1:48:03 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


-- =============================================
-- Author:      <Me!>
-- Description: <Used by data viewer GUI.>
-- =============================================
ALTER PROCEDURE [dbo].[DV_GetPSCTreeNodes]
    -- Add the parameters for the stored procedure here

    @iNodeLevel int,
    @iParentNodeId bigint

AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @sQuery varchar (2000)

    IF @iNodeLevel >= 5

    RETURN

    ELSE

    -- Insert statements for procedure here
    SET @sQuery = 'SELECT * FROM DataView.dbo.v_Tree
    WHERE L' + CAST((@iNodeLevel + 1) AS VARCHAR(10)) + 'ID IS NULL
    AND L' + CAST((@iNodeLevel) AS VARCHAR(10)) + 'ID = ' + CAST((@iParentNodeId)
    AS VARCHAR(10))

    EXEC (@sQuery)
END

如前所述,如果我在 SMSS 中运行它,我会得到预期的结果。

但是,如果我通过我设置的服务运行它,我会得到正确数量的记录,但它们都是第一行的重复项(我可以查看表格并知道我得到了重复项) .如果我尝试新的参数并在 SSMS 中返回 15 个不同的行,我的网页将显示 15 行重复的第 1 行数据。

这是我的客户打来的电话:

List<v_PowerSystemCIMTree> list = null;
DVServiceClient proxy = new DVServiceClient();

try
{
    list = proxy.DV_GetPSCTreeNodes(2,325550).ToList(); //2 and 325550 are just hardcoded to 
                                                        //check to see if it's working
}
catch (Exception ex)
{
    Console.WriteLine(ex.GetType().FullName);
    Console.WriteLine(ex.Message);
}
finally
{
    proxy.Close();
}
return View(list);

调用我的服务:

readonly DataViewerEntities _Context = new DataViewerEntities();

public List<DataViewer_DAL.v_PowerSystemCIMTree> DV_GetPSCTreeNodes(int firstParam,
long secondParam)
{
    return _Context.DV_GetPSCTreeNodes(firstParam,secondParam).ToList();
}

为什么我会在 Management Studio 中得到一个结果集,但在我的网页上重复数据?

【问题讨论】:

  • 已知问题:由于您从没有定义 主键视图 中进行选择,实体框架将使用所有非可空列作为“实体键”。如果它从具有相同实体键的视图中读取第二行,它只会重复已经读取的第一行 - 它不会查看其他剩余的列....

标签: sql-server-2008 stored-procedures ssms


【解决方案1】:

已知问题:由于您从没有定义 主键视图 中进行选择,实体框架将使用所有不可为空的列作为“实体键”。

如果 EF 从具有 相同实体键(所有不可为空的列中的相同值)的视图中读取第二行,它只会重复已读取的第一行 - 它会 看其他的,剩下的列....

因此,您只需将基础表的主键添加到视图的列,调整 EF 数据模型以显式为视图定义“实体键”,或者您需要在视图中添加一个人工的唯一列(如 ROW_NUMBER()),并确保它不可为空,因此是 EF“派生”实体键的一部分

【讨论】:

  • 非常感谢!毫无疑问,你为我节省了明天的工作时间。
猜你喜欢
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 2010-11-23
相关资源
最近更新 更多