1

Я использую 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); 

Любые мысли о том, что происходит - почему значения обращаются по-разному? Есть лучший способ сделать это?

+0

Показать хранимую процедуру – lad2025

+0

Вы можете визуализировать SQL-запрос, отправленный на сервер, установив 'db.Database.Log = msg => Debug.WriteLine (msg)', который может предоставить вам ценную информацию. –

+0

Вы уверены, что EF и ваш «прямой тест SSMS» происходят в одной базе данных? – sstan

ответ

0

Вот рабочий пример из некоторого кода я использовал:

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, чтобы увидеть, что именно происходит.


Edit:
Первоначально я получил этот код из this awesome project на Лонг-Ле. Я уже давно использую фреймворк, и это фантастика.

+0

Это сработало! Спасибо за пример. Я использовал его, а затем понял, что проблема связана с тем, что в запросах был «exec». Принимая это во внимание, выше версия 1 и версия 2 работают, но версия 3 - нет. – Anas

+0

Царапина, что - все они работают. – Anas

Смежные вопросы