当dbcontext.Database.ExecuteSqlCommand被调用时会发生什么?

本文关键字:什么 调用 dbcontext Database ExecuteSqlCommand | 更新日期: 2023-09-27 18:09:50

我首先从数据库中使用实体框架代码。我试图运行一个现有的未映射的存储过程,使用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);

对正在发生的事情有什么想法-为什么值被不同地对待?有更好的方法吗?

当dbcontext.Database.ExecuteSqlCommand被调用时会发生什么?

下面是我使用的一些代码的工作示例:

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以查看究竟发生了什么。


编辑:


我最初从龙乐的这个很棒的项目中得到了这个代码。我已经使用这个框架有一段时间了,它非常棒。