【发布时间】: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 => Debug.WriteLine(msg)来可视化发送到服务器的SQL查询,这可能会为您提供有价值的信息。 -
您确定 EF 和您的“直接 SSMS 测试”在同一个数据库上进行吗?
-
你的连接字符串是否包含
|DataDirectory|? -
@Jeroen 我在服务器上没有调试权限,所以这很有用。谢谢!
标签: c# sql-server entity-framework stored-procedures ef-database-first