C# 存储过程返回的是行数而不是列值

C# 存储过程返回的是行数而不是列值,c#,asp.net,sql-server,entity-framework,tsql,C#,Asp.net,Sql Server,Entity Framework,Tsql,我正在从ASP.NET调用一个存储过程来获取一些数据以存储在数组中。问题是,为了返回所需的值,首先必须调用另一个存储过程并将结果转储到临时表中。这会在SQL端生成正确的记录,但当我在ASP中调用它时,它会将最后一条记录的索引返回为int。因此,即使SQL生成正确的结果,ASP在调用存储过程时也无法访问它们 下面是我如何设置SQL的: IF OBJECT_ID('#temp') IS NOT NULL BEGIN DROP TABLE #temp END CREA

我正在从ASP.NET调用一个存储过程来获取一些数据以存储在数组中。问题是,为了返回所需的值,首先必须调用另一个存储过程并将结果转储到临时表中。这会在SQL端生成正确的记录,但当我在ASP中调用它时,它会将最后一条记录的索引返回为int。因此,即使SQL生成正确的结果,ASP在调用存储过程时也无法访问它们

下面是我如何设置SQL的:

IF OBJECT_ID('#temp') IS NOT NULL
    BEGIN
        DROP TABLE #temp
    END

CREATE TABLE #temp 
(
EventID nvarchar(50),
RunDate date,
SectionCode nvarchar(50),
SectionMapCode nvarchar(50),
DispSort int,
Capacity nvarchar(50),
Attendance int,
PctCap int,
HeatColor nvarchar(50)
)

DECLARE @runDate date = GETDATE()
--Insert results from killsheet sproc into temp table
INSERT #temp  Exec GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID, @runDate;

select Capacity from #temp;
SQL输出:

ASP调用:

string option = TempData["option"].ToString();
var secCapacity = db.uspGetSecCapacityNew(option);
ViewData["Capacity"] = secCapacity;
System.Diagnostics.Debug.WriteLine("capacity " + secCapacity);
和ASP输出:

容量261

请注意secCapacity如何等于261,这是SQL结果中的最后一个行号


那么,如何访问实际的查询结果,而不是数据的大小呢?

恕我直言,但这似乎增加了一层不需要存在的复杂性。本节:

DECLARE @runDate date = GETDATE()
--Insert results from killsheet sproc into temp table
INSERT #temp  Exec GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID, @runDate;

select Capacity from #temp;
您正在使用单个进程插入SQL Server中的临时对象。为什么不直接返回依赖进程呢?这是一个非常内存密集的内存操作还是需要临时存储的操作?如果不是,我只会得到结果集。将临时存储与返回的结果集混用可能会有问题。尤其是当您处理.NET层时,它处理的回报是:

动态结构化查询语言 tempdb或表中的临时存储 除非你有一些严格的规定,否则我只会处理你的退货数据

GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID, @runDate

如果您使用实体框架,请包装Poco对象列表;如果使用ADO.NET,请包装DataTable。

我可以通过从ASP中分离存储过程来解决此问题,而不是尝试从SQL中导入特定数据

    var uspCapacity = from d in db.uspGetEventKillSheetDetailedReport(option, date)
                      select new
                      {
                          d.Capacity
                      };
    var uspAttendance = from d in db.uspGetEventKillSheetDetailedReport(option, date)
                        select new
                        {
                            d.Attendance
                        };
    var uspSectionMapCode = from d in db.uspGetEventKillSheetDetailedReport(option, date)
                        select new
                        {
                            d.SectionMapCode
                        };

    var uspCapacityList = uspCapacity.ToArray();
    var uspAttendanceList = uspAttendance.ToArray();
    var uspSectionMapCodeList = uspSectionMapCode.ToArray();
我使用以下方法进行测试:

    for (var i = 0; i < 3; i++)
    {
        System.Diagnostics.Debug.WriteLine("Capacity " + uspCapacityList[i] + " Attendance " + uspAttendanceList[i] + " Section Map Code " + uspSectionMapCodeList[i]);
    }

存储过程返回的是行数,而不是结果集。这里是什么?这是实体框架吗?正确,如何获得结果集?如果使用Select From,则它应该可以正常工作。否?是否需要在存储过程的顶部设置nocount?需要将存储过程作为函数导入。看看这里@DaveShaw Good call那里…我们使用一个临时表,因为我们需要一次隔离一列。uspGetEventKillSheetDetailedReport中有5-6列我们不需要的列,因此我们的计划是查询uspGetEventKillSheetDetailedReport中我们需要的列,将其存储到临时表中,然后查询临时表,因为我们无法查询存储过程。您可以将数据保留在内存中以供以后查询,或者如果要在市场分析之后进行查询,可以使用永久表。我不会将数据存储在tempdb中,稍后您将回到tempdb中。它通常用于临时存储,因此得名。如果您确实想从临时对象返回,但又想稍后查询该对象本身,为什么不创建一个永久表并将其标记为类似于“stagingKillSheetDetailedReport”的形式?您将在分析tempdb对象时遇到麻烦。这是一个通常为SQL Server保留的级别,而不是.NET access。我想使用temp,因为如果我们使用一个永久数据库,每次有人运行该程序时,它都会向表中生成261个更多的条目,而我正在为3个查询执行此操作,因此内存会非常紧张。我们找到了一种方法,使用类似于。。。。。。选择新建{d.capacity}。我会简短地给出一个答案。好吧,每次运行此过程时,您都会放弃表格。所以它被删除的原因是,不管你调用它的次数是多少,你可以在z次得到y的结果。我只是说tempdb是临时的。如果您担心在以后获取数据时会重复插入某个区域,那么可以轻松地运行merge语句或其他条件逻辑。