Asp.net mvc 实体框架3.1中的ExecuteSqlRawAsync返回-1
在我的ASP.NET Core 3.1 web应用程序中,我主要使用存储过程。在实体框架核心中使用Asp.net mvc 实体框架3.1中的ExecuteSqlRawAsync返回-1,asp.net-mvc,asp.net-core,entity-framework-core,Asp.net Mvc,Asp.net Core,Entity Framework Core,在我的ASP.NET Core 3.1 web应用程序中,我主要使用存储过程。在实体框架核心中使用ExecuteSqlRawAsync时,它总是返回-1。下面给出了我执行存储过程的通用方法 public async Task<int> ExecuteSqlNonQuery(string StoredProcName, params object[] parameters) { int iTotalRecordsAffected = 0; Li
ExecuteSqlRawAsync
时,它总是返回-1
。下面给出了我执行存储过程的通用方法
public async Task<int> ExecuteSqlNonQuery(string StoredProcName, params object[] parameters)
{
int iTotalRecordsAffected = 0;
List<TEntity> listOfObject = null;
try
{
if (!string.IsNullOrEmpty(StoredProcName))
{
StringBuilder sbStoredProc = new StringBuilder();
sbStoredProc.Append("Exec ");
sbStoredProc.Append(StoredProcName);
if (parameters != null)
{
foreach (SqlParameter item in parameters)
{
if (listOfObject == null)
{
sbStoredProc.Append(" @");
listOfObject = new List<TEntity>();
}
else
{
sbStoredProc.Append(", @");
}
sbStoredProc.Append(item.ParameterName.Replace("@", ""));
if (item.Direction == System.Data.ParameterDirection.Output)
{
sbStoredProc.Append(" OUT");
}
}
}
iTotalRecordsAffected = await _DBContext.Database.ExecuteSqlRawAsync(sbStoredProc.ToString(), parameters);
}
}
catch (Exception ex)
{
}
finally
{
if (_DBContext.Database.GetDbConnection().State == System.Data.ConnectionState.Open)
{
_DBContext.Database.GetDbConnection().Close();
}
}
return iTotalRecordsAffected;
}
public async Task ExecuteSqlNonQuery(string StoredProcName,params object[]parameters)
{
int-iTotalRecordsAffected=0;
List ListoObject=null;
尝试
{
如果(!string.IsNullOrEmpty(StoredProcName))
{
StringBuilder sbStoredProc=新StringBuilder();
sbStoredProc.追加(“执行”);
sbStoredProc.Append(StoredProcName);
if(参数!=null)
{
foreach(参数中的SqlParameter项)
{
if(listOfObject==null)
{
sbStoredProc.追加(“@”);
ListoObject=新列表();
}
其他的
{
sbStoredProc.追加(“,@”);
}
sbStoredProc.Append(item.ParameterName.Replace(“@”和“”);
if(item.Direction==System.Data.ParameterDirection.Output)
{
sbStoredProc.追加(“输出”);
}
}
}
iTotalRecordsAffected=await _DBContext.Database.ExecuteSqlRawAsync(sbStoredProc.ToString(),参数);
}
}
捕获(例外情况除外)
{
}
最后
{
if(_DBContext.Database.GetDbConnection().State==System.Data.ConnectionState.Open)
{
_DBContext.Database.GetDbConnection().Close();
}
}
返回受影响的iTotalRecords;
}
这是我的控制器方法,它调用SP来更新数据
public async Task<int> UpdateCustomerData(EditCustomerDetail editCustomerDetail)
{
int iTotalRecordsEffected = 0;
try
{
List<SqlParameter> sqlParamList = new List<SqlParameter>()
{
new SqlParameter("@CustomerID",editCustomerDetail.CorporateID),
new SqlParameter("@CustomerName",editCustomerDetail.CorporateName),
new SqlParameter("@CustomerAddress",editCustomerDetail.Address),
new SqlParameter("@City",editCustomerDetail.City),
new SqlParameter("@CountryID",editCustomerDetail.CountryID),
new SqlParameter("@StateID",editCustomerDetail.StateID),
new SqlParameter("@Description",editCustomerDetail.Description),
new SqlParameter("@Phone",editCustomerDetail.Phone),
new SqlParameter("@Fax",editCustomerDetail.Fax),
new SqlParameter("@ModifiedBy",editCustomerDetail.UserID)
};
iTotalRecordsEffected = await _unitOfWork.GetRepository<EditCustomerDetail>().ExecuteSqlNonQuery("UpdateCustomerDetails", sqlParamList.ToArray());
}
catch (Exception ex)
{
}
finally
{
}
return iTotalRecordsEffected;
}
public异步任务UpdateCustomerData(EditCustomerDetail EditCustomerDetail)
{
int iTotalRecordsEffected=0;
尝试
{
List sqlParamList=新列表()
{
新的SqlParameter(“@CustomerID”,editCustomerDetail.CorporateID),
新的SqlParameter(“@CustomerName”,editCustomerDetail.CorporateName),
新的SqlParameter(“@CustomerAddress”,editCustomerDetail.Address),
新的SqlParameter(“@City”,editCustomerDetail.City),
新的SqlParameter(“@CountryID”,editCustomerDetail.CountryID),
新的SqlParameter(“@StateID”,editCustomerDetail.StateID),
新的SqlParameter(“@Description”,editCustomerDetail.Description),
新的SqlParameter(“@Phone”,editCustomerDetail.Phone),
新的SqlParameter(“@Fax”,editCustomerDetail.Fax),
新的SqlParameter(“@ModifiedBy”,editCustomerDetail.UserID)
};
iTotalRecordsEffected=wait_unitOfWork.GetRepository().ExecuteSqlNonQuery(“UpdateCustomerDetails”,sqlParamList.ToArray());
}
捕获(例外情况除外)
{
}
最后
{
}
返回iTotalRecordsEffected;
}
有没有任何关于我做错了什么的建议?这似乎是ADO.NET的标准行为。EF Core表示这种情况只是一个中间变量。@IvanStoev我发现了问题:-在连接上设置SET NOCOUNT ON时,受单个语句影响的行停止参与此方法返回的受影响行的计数。这解决了我的问题。