【问题标题】:What is happening when dbcontext.Database.ExecuteSqlCommand is called?调用 dbcontext.Database.ExecuteSqlCommand 时发生了什么?
【发布时间】:2015-08-25 01:20:47
【问题描述】:

我首先使用数据库中的实体框架代码。我正在尝试使用 dbcontext.Database.ExecuteSqlCommand 运行现有的未映射存储过程,根据从 JSON 传入的值动态创建查询和参数数组(有许​​多可选参数)。我不期待返回值。

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

无法将值 NULL 插入列“yyyyww”,表“dbname.dbo.table”;列不允许空值。

但是当我使用 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);

对正在发生的事情有什么想法 - 为什么价值观会受到不同的对待?有没有更好的方法来做到这一点?

【问题讨论】:

  • 显示存储过程
  • 您可以通过设置db.Database.Log = msg =&gt; Debug.WriteLine(msg)来可视化发送到服务器的SQL查询,这可能会为您提供有价值的信息。
  • 您确定 EF 和您的“直接 SSMS 测试”在同一个数据库上进行吗?
  • 你的连接字符串是否包含|DataDirectory|
  • @Jeroen 我在服务器上没有调试权限,所以这很有用。谢谢!

标签: c# sql-server entity-framework stored-procedures ef-database-first


【解决方案1】:

这是我使用的一些代码的一个工作示例:

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 得到这个代码的。我已经使用该框架有一段时间了,它很棒。

【讨论】:

  • 成功了!谢谢你的例子。我使用它然后意识到问题是因为我在查询中有'exec'。除去这一点,上面的版本 1 和版本 2 可以工作,但版本 3 不行。
猜你喜欢
  • 2019-07-13
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多