Я использую Entity Framework Code Сначала из базы данных. Я пытаюсь запустить существующую немаркированную хранимую процедуру, используя dbcontext.Database.ExecuteSqlCommand, динамически создавая массив запросов и параметров на основе значений, переданных из JSON (имеется много дополнительных параметров). Я не ожидаю возврата.Что происходит, когда вызывается dbcontext.Database.ExecuteSqlCommand?
Когда я испытываю от моей службы, я получаю SQLExceptions быть выброшен из внутри хранимая процедура:
Не удается вставить значение NULL в столбце «yyyyww», таблица «dbname.dbo.table»; столбец не допускает нулей.
Но когда я запускаю тот же запрос, используя те же значения из SSMS '12, ошибок нет. Фактически таблица допускает значения null для этого столбца.
exec [dbname].[dbo].[storedproc] @yyyymm = 201409, @s_id = 75
Передача необязательного строковый параметр вызывает исключение о преобразовании NVARCHAR в целое, что не происходит в хранимой процедуре. Я пробовал несколько разных способов настроить вызов, но все они бросают те же исключения.
версия 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);
Любые мысли о том, что происходит - почему значения обращаются по-разному? Есть лучший способ сделать это?
Показать хранимую процедуру – lad2025
Вы можете визуализировать SQL-запрос, отправленный на сервер, установив 'db.Database.Log = msg => Debug.WriteLine (msg)', который может предоставить вам ценную информацию. –
Вы уверены, что EF и ваш «прямой тест SSMS» происходят в одной базе данных? – sstan