仅当我在代码中放置断点时,使用 C# 获取存储过程的参数才有效
Getting out parameter of stored procedure with C# only works when I put a breakpoint in my code
我使用 Entity Framework 设置了数据库连接。我已经创建了多个存储过程,其中之一有一个我在我的应用程序中需要的输出参数。
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 调用方法。
有谁知道这是为什么以及我该如何解决这个问题?
编辑:
以下 link 正是我正在做的事情:Executing SQL Stored Procedure with Output Parameter from Entity Framework。但我的问题是我需要逐步完成它才能工作
使用基础 SqlParameter
需要 .Direction = ParameterDirection.Output
。 ObjectParameter
没有等效设置。相反,我相信参数方向是在您的模型中配置的。
在 return 结果被完全读取或底层 DbDataReader 关闭之前,输出参数不可用。
参见 ObjectContext.ExecuteFunction, and the second sentence of this section on DataReaders
的 Parameters
部分
您可以通过使用 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()
或您喜欢的任何方法来读取基础结果。
我使用 Entity Framework 设置了数据库连接。我已经创建了多个存储过程,其中之一有一个我在我的应用程序中需要的输出参数。
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 调用方法。
有谁知道这是为什么以及我该如何解决这个问题?
编辑:
以下 link 正是我正在做的事情:Executing SQL Stored Procedure with Output Parameter from Entity Framework。但我的问题是我需要逐步完成它才能工作
使用基础 SqlParameter
需要 .Direction = ParameterDirection.Output
。 ObjectParameter
没有等效设置。相反,我相信参数方向是在您的模型中配置的。
在 return 结果被完全读取或底层 DbDataReader 关闭之前,输出参数不可用。
参见 ObjectContext.ExecuteFunction, and the second sentence of this section on DataReaders
的Parameters
部分
您可以通过使用 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()
或您喜欢的任何方法来读取基础结果。