调用 dbcontext.Database.ExecuteSqlCommand 时发生了什么?

What is happening when dbcontext.Database.ExecuteSqlCommand is called?

我正在使用数据库中的 Entity Framework Code First。我正在尝试 运行 现有的未映射存储过程,使用 dbcontext.Database.ExecuteSqlCommand,根据从 JSON 传入的值动态创建查询和参数数组(有许​​多可选参数)。我不期望 return 值。

当我从我的服务进行测试时,我从存储过程中抛出 SqlExceptions:

Cannot insert the value NULL into column 'yyyyww', table 'dbname.dbo.table'; column does not allow nulls.

但是当我 运行 使用 SSMS '12 中的相同值进行相同的查询时,没有错误。 table 实际上允许该列为空值。

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


编辑:
我最初是从 Long Le 的 this awesome project 那里得到这个代码的。我已经使用该框架一段时间了,它非常棒。