C# 从存储过程收集多个结果集时出错
我有一个我编写的存储过程。我试图从中收集多个结果集。但不幸的是,我得到了一个错误 System.Data.dll中发生了类型为“System.Data.SqlClient.SqlException”的第一次意外异常 这是我一直看到的错误 我已经尽了我所能,但不知道错误是什么,我已经测试了我的存储过程,它工作正常 存储过程:C# 从存储过程收集多个结果集时出错,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我有一个我编写的存储过程。我试图从中收集多个结果集。但不幸的是,我得到了一个错误 System.Data.dll中发生了类型为“System.Data.SqlClient.SqlException”的第一次意外异常 这是我一直看到的错误 我已经尽了我所能,但不知道错误是什么,我已经测试了我的存储过程,它工作正常 存储过程: CREATE PROCEDURE [dbo].[Collectcompanyservicewithpackages] @CompanyID int A
CREATE PROCEDURE [dbo].[Collectcompanyservicewithpackages]
@CompanyID int
AS
select *
from Serviceduration
where Client_CompanyID = @CompanyID;
select Serviceitem.*
from Serviceduration, Serviceitem
where Client_CompanyID = @CompanyID
and Serviceduration.ServicedurationID = Serviceitem.ServicedurationID;
select ServiceitemPackage.*
from Serviceduration, Serviceitem, ServiceitemPackage
where Client_CompanyID = @CompanyID
and Serviceduration.ServicedurationID = Serviceitem.ServicedurationID
and Serviceitem.ServiceitemID = ServiceitemPackage.ServiceitemID
数据库模块:
片段
public List<Serviceview> GetFirmServiceswithpackages_sp(int CompanyID)
{
List<Serviceview> allservices = null;
IEnumerable<Serviceduration> servicedurations = null;
IEnumerable<Serviceitem> serviceitems = null;
IEnumerable<ServiceitemPackage> serviceitempackages = null;
using(context){
Debug.WriteLine("App got here for starters .........................");
// If using Code First we need to make sure the model is built before we open the connection
// This isn't required for models created with the EF Designer
//context.Database.Initialize(force: false);
// Create a SQL command to execute the sproc
var cmd = context.Database.Connection.CreateCommand();
cmd.CommandText = "Collectcompanyservicewithpackages @CompanyID";
cmd.CommandType = CommandType.StoredProcedure;
DbParameter inputparameter = new SqlParameter();
inputparameter.DbType = DbType.Int64;
inputparameter.ParameterName = "CompanyID";
inputparameter.Value = CompanyID;
inputparameter.Direction = ParameterDirection.Input;
cmd.Parameters.Add(inputparameter);
try
{
// Run the sproc
context.Database.Connection.Open();
var reader = cmd.ExecuteReader();
// Read Blogs from the first result set
var durations = ((IObjectContextAdapter)context)
.ObjectContext
.Translate<Serviceduration>(reader, "Servicedurations", MergeOption.AppendOnly);
servicedurations = this.Extractdurations(durations);
Debug.WriteLine("No of duration "+servicedurations.Count());
// Move to second result set and read Serviceitems in cart
reader.NextResult();
var services4sale = ((IObjectContextAdapter)context)
.ObjectContext
.Translate<Serviceitem>(reader, "Serviceitems", MergeOption.AppendOnly);
serviceitems = this.Extractservices(services4sale);
Debug.WriteLine("No of services "+serviceitems.Count() );
// Move to second result set and read Serviceitems in cart
reader.NextResult();
var packages = ((IObjectContextAdapter)context)
.ObjectContext
.Translate<ServiceitemPackage>(reader, "ServiceitemPackages", MergeOption.AppendOnly);
serviceitempackages = this.Extractpackages(packages);
Debug.WriteLine("No of packages ...."+ serviceitempackages.Count());
allservices = this.ReturnServiceincart(servicedurations, serviceitems, serviceitempackages);
}
catch(SqlException e){
Debug.WriteLine("Cause of the error "+e.InnerException.Message);
}
finally
{
context.Database.Connection.Close();
}
}
return allservices;
}
//下面的方法用于从对象结果集中提取枚举。我很乐意称之为助手方法
//This is the help method that would help us to do the final crafting of our stored procedure run around
private List<Serviceview> ReturnServiceincart(IEnumerable<Serviceduration> durations, IEnumerable<Serviceitem> services, IEnumerable<ServiceitemPackage> packages)
{
List<Serviceview> allservices = new List<Serviceview>();
if(services != null){
foreach(var service in services){
Serviceview view = new Serviceview()
{
Name = service.Name,
Cost = service.Cost,
Description = service.Description,
Durationname = durations.Where(item=>item.ServicedurationID == service.ServicedurationID).Select(item=>item.Duration).SingleOrDefault<string>(),
IsVisible = service.IsVisible,
Packages = Returnpackages(service.ServiceitemID, packages) //Note we are not passing service.ServiceitemPackage, cos we are avoiding a lazy loading cos it already been returned in stored procedure.
};
}
}
return allservices;
}
private IEnumerable<Serviceduration> Extractdurations(ObjectResult<Serviceduration> durations)
{
IEnumerable<Serviceduration> servicedurations = durations.AsEnumerable<Serviceduration>();
return servicedurations;
}
private IEnumerable<Serviceitem> Extractservices(ObjectResult<Serviceitem> services4sale)
{
IEnumerable<Serviceitem> serviceitems = services4sale.AsEnumerable<Serviceitem>();
return serviceitems;
}
private IEnumerable<ServiceitemPackage> Extractpackages(ObjectResult<ServiceitemPackage> packages)
{
IEnumerable<ServiceitemPackage> servicepackages = packages.AsEnumerable<ServiceitemPackage>();
return servicepackages;
}
//Because the packages here would contain all packages for all company services we need to filter with a service ID
private List<string> Returnpackages(int ServiceitemID, IEnumerable<ServiceitemPackage> packageitems)
{
List<string> packages = new List<string>();
foreach(var package in packageitems){
if(package.ServiceitemID == ServiceitemID)
packages.Add(package.PackageName);
}
return packages;
}
下文所作的修改
cmd.CommandText=Collectcompanyservicewithpackages
在对查询进行更改之后。我收到了错误信息
查询结果不能多次枚举
新的错误正在发生
allservices=this.ReturnServiceInjectServiceDurations、serviceitems、serviceitempackages cmd.CommandText=Collectcompanyservicewithpackages 这句话解决了这个问题 在此之后,我关闭了命令和reader对象
现在可以正常工作了。请您将代码的格式设置得更好一些,提供异常详细信息,并提供Ado.Net代码的其余部分,好吗?您是否尝试过cmd.CommandText=Collectcompanyservicewithpackages;或cmd.CommandText=Collectcompanyservicewithpackages@CompanyID=@CompanyID;-20多年前,在ANSI-92 SQL标准中,这种旧式的逗号分隔表列表样式被正确的ANSI连接语法所取代,因此不鼓励使用hanks@marc。我以后会改的。但任何可能导致错误的原因。尽管这种风格很古老,但我试过了,效果很好。所以问题在于代码,而不是sqlWoow@Anthony Horne。我尝试了第一种选择,现在正朝前走。Sql错误已消失,但新错误已消失。查询结果不能枚举多次。描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。异常详细信息:System.InvalidOperationException:查询结果不能枚举多次。错误是指