我首先从数据库中使用实体框架代码。我试图运行一个现有的未映射的存储过程,使用dbcontext.Database。ExecuteSqlCommand,基于从JSON传入的值动态创建查询和参数数组(有许多可选参数)。我不期望返回值。
当我从我的服务中进行测试时,我得到了从存储过程中抛出的SqlExceptions:
不能在表'dbname.dbo.table'列'yyyyww'中插入NULL值;列不允许为空
但是当我使用SSMS '12中的相同值运行相同的查询时,没有错误。表实际上不允许该列为空。
exec [dbname].[dbo].[storedproc] @yyyymm = 201409, @s_id = 75
传递可选的字符串参数会导致将nvarchar转换为int的异常,这在存储过程中不会发生。我尝试了几种不同的方法来设置调用,但它们都抛出了相同的异常。
版本1:string query1 = "exec [dbname].[dbo].[storedproc] @yyyymm, @s_id";
List<SqlParameter> parms1 = new List<SqlParameter>();
parms1.Add(new SqlParameter("@yyyymm", obj.yyyymm));
parms1.Add(new SqlParameter("@s_id", obj.s_Id));
db.Database.ExecuteSqlCommand(query, parms1.ToArray());
版本2:string query2 = "exec [dbname].[dbo].[storedproc] @yyyymm, @s_id";
var month = new SqlParameter("yyyymm", SqlDbType.Int);
month.Value = obj.yyyymm;
var s_id = new SqlParameter("s_id", SqlDbType.Int);
s_id.Value = obj.s_Id;
List<SqlParameter> parms2 = new List<SqlParameter>();
parms2.Add(month);
parms2.Add(s_id);
db.Database.ExecuteSqlCommand(query, parms2.ToArray());
版本3:string query3 = "exec [dbname].[dbo].[storedproc] @yyyymm = {0}, @s_id = {1}";
db.Database.ExecuteSqlCommand(query3, obj.yyyymm, obj.s_Id);
对正在发生的事情有什么想法-为什么值被不同地对待?有更好的方法吗?
下面是我使用的一些代码的工作示例:
public int SalesByCategory(string categoryName, string ordYear)
{
var categoryNameParameter = categoryName != null ?
new SqlParameter("@CategoryName", categoryName) :
new SqlParameter("@CategoryName", typeof (string));
var ordYearParameter = ordYear != null ?
new SqlParameter("@OrdYear", ordYear) :
new SqlParameter("@OrdYear", typeof (string));
return Database.ExecuteSqlCommand("SalesByCategory @CategoryName, @OrdYear", categoryNameParameter, ordYearParameter);
}
如果该结构由于某种原因不起作用,请尝试打开SQL Profiler以查看究竟发生了什么。
编辑:
我最初从龙乐的这个很棒的项目中得到了这个代码。我已经使用这个框架有一段时间了,它非常棒。