使用 C# 提取存储过程的参数仅在我在代码中放置断点时才有效



我使用实体框架设置了数据库连接。我创建了多个存储过程,其中一个存储过程具有应用程序中需要的输出参数。

C# 中的过程:

public virtual ObjectResult<Nullable<System.Guid>> AjouterProfesseur(string prenom, string nom, ObjectParameter identity)
{
var prenomParameter = prenom != null ?
new ObjectParameter("prenom", prenom) :
new ObjectParameter("prenom", typeof(string));
var nomParameter = nom != null ?
new ObjectParameter("nom", nom) :
new ObjectParameter("nom", typeof(string));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable<System.Guid>>("AjouterProfesseur", prenomParameter, nomParameter, identity);
}

要检索我使用以下的输出参数(这也是我必须放置断点并单步执行它才能正常工作的地方(:

public static Guid AddProfesseur(string prenom, string nom)
{
using (ExamenProjetIntegrationEntities db = new ExamenProjetIntegrationEntities())
{
ObjectParameter objParam = new ObjectParameter("identity", typeof(Guid));
var resultToReturn = db.AjouterProfesseur(prenom, nom, objParam);
return  Guid.Parse(objParam.Value.ToString());
}
}

然后我有一个业务层再次调用该方法:

public static Guid addProfesseur(string prenom, string nom)
{
try
{
var data = Data.AddProfesseur(prenom, nom);
return data;
}
catch (Exception e)
{
var sqlex = e.InnerException as SqlException;
if (sqlex != null)
{
switch (sqlex.Number)
{
default:
throw new Exception(sqlex.Number + " - " + sqlex.Message);
}
}
throw e;
}
}

最后在我的 API 控制器中,我使用以下语句:

var idProfesseur = BL.addProfesseur(professeur.prenom, professeur.nom);

我在 ASP.NET MVC 视图中使用 ajax 调用该方法。

有没有人知道为什么会这样以及我如何解决这个问题?

编辑:

以下链接正是我正在做的:使用实体框架中的输出参数执行SQL存储过程。但我的问题是我需要逐步完成它才能工作

在完全读取返回结果或关闭基础 DbDataReader 之前,输出参数不可用。

请参阅ObjectContext.ExecuteFunction的Parameters部分,以及本节中关于DataReader的第二句话。

可以通过使用 LINQ 评估结果来强制执行此操作。

public static Guid AddProfesseur(string prenom, string nom)
{
using (ExamenProjetIntegrationEntities db = new ExamenProjetIntegrationEntities())
{
ObjectParameter objParam = new ObjectParameter("identity", typeof(Guid));
var resultToReturn = db.AjouterProfesseur(prenom, nom, objParam).Count();
return  Guid.Parse(objParam.Value.ToString());
}
}

你也可以使用.ToList().FirstOrDefault()或任何你喜欢的方法来读取基础结果。

使用底层SqlParameter需要.Direction = ParameterDirection.Output.ObjectParameter没有等效的设置。相反,我相信参数方向是在您的模型中配置的。

这可能不是所有解决方案,但我发现如果我处理从存储过程调用返回的 ObjectResult,输出参数值变得可用。如果仍然需要对象结果中的值,则需要额外的逻辑。

ObjectParameter outputParam= new ObjectParameter("outputparam",typeof(string)); 
ObjectResult spResult = db.sp_check_dup_hostname_or_ips(param1, param2, param3, param4, outputParam);
spResult.Dispose();

string myOutputString = Convert.ToString(outputparam.Value);

最新更新