使用Entity Framework使用动态参数执行SQL Server存储过程
我们想使用EF执行存储过程。
我们的方法是动态提供输入参数,如下所示:
PropertyInfo[] props = search.GetProperties(); foreach (var item in props) { object itemValue = item.GetValue(SearchCondition, null); if (itemValue == null) parameterList.Add(new SqlParameter(string.Format("@{0}", item.Name), DBNull.Value)); else parameterList.Add(new SqlParameter(string.Format("@{0}", item.Name), itemValue.ToString())); }
这是其他常见的输入:
parameterList.Add(new SqlParameter("@order", (object)"desc")); parameterList.Add(new SqlParameter("@Page", page)); parameterList.Add(new SqlParameter("@PageSize", rows));
还有输出参数:
parameterList.Add(new SqlParameter() { DbType = DbType.Int32, ParameterName = "@TotalCount out", SqlValue = DBNull.Value, Direction = ParameterDirection.Output });
这是执行代码(运行存储过程)
object[] para= parameterList.ToArray(); var records = context.Database.SqlQuery(string.Format(@"Exec RTI.RptCustomerInformation {0}", parameters), para).ToList();
当我们运行它时会有一个例外:
int附近的语法不正确
这是我们在SQL中执行的存储过程,它在SQL Server Management Studio中正确运行:
EXEC @return_value = [RTI].[RptCustomerInformation] @AccountNumber = NULL, @CardNumber = NULL, @CustomerNumber = NULL, @CustomerType = NULL, @NationalNumber = NULL, @Name = NULL, @FamilyName = NULL, @IdentityNumber = NULL, @IdSerial = NULL, @NationalityType = NULL, @InhabitancyType = NULL, @JobType = NULL, @c13 = NULL, @CustomerDefined = NULL, @OpenerBranch = NULL, @CodePosti = NULL, @RegisterNumber = NULL, @order = NULL, @Page = NULL, @PageSize = NULL, @TotalCount = @TotalCount OUTPUT SELECT @TotalCount as N'@TotalCount'