OUTPUT INSERTED Id / SCOPE_IDENTITY () возвращает ноль в SQL-запросе C # (ASP.NET Core Razor Pages), отлично работает в SQL Server Management Studio - PullRequest
4 голосов
/ 18 марта 2019

У меня есть следующий параметризованный SQL-запрос, который вставляет данные в таблицу, получает (автоматически увеличивается) значение Id новой строки, а затем вставляет это новое значение в другую таблицу:

DECLARE @engId_newtable TABLE(engId INT); 
DECLARE @engId_new INT; 

INSERT INTO eng (locationTypeId, engNumb, projectId, engTypeId, capacity, cylNo, employeeId, bore, stroke, crankOffset, rodLength, cr, crankThrow, pinOffset, engDesc) 
OUTPUT INSERTED.engId INTO @engId_newtable 
SELECT a.locationTypeId, @engNumb, b.projectId, c.engTypeId, @capacity, @cylNo, d.employeeId, @bore, @stroke, @crankOffset, @rodLength, @cr, @crankThrow, @pinOffset, @engDesc 
FROM dbo.locationType AS a,dbo.project AS b,dbo.engType AS c,dbo.employees AS d 
WHERE a.locationType = @locationType AND b.projectCode = @projectCode AND b.engineType = @engineType AND c.engType = @engType AND d.userName = @userName ;

SELECT @engId_new = engId FROM @engId_newtable; 

INSERT INTO oil (engId, oilQuantity, oilTypeId) 
SELECT @engId_new, @oilQuantity, a.oilTypeId 
FROM dbo.oilType AS a 
WHERE a.oilManufacturer = @oilManufacturer AND a.oilRange = @oilRange AND a.oilGrade = @oilGrade ;

Запрос отлично работает при выполнении в SQL Server Management Studio (SSMS), но когда я пытаюсь запустить его с помощью моего проекта ASP.NET Core C # (Razor Pages), он завершается неудачно со следующей ошибкой:

System.Data.SqlClient.SqlException: 'Невозможно вставить значение NULL в столбец 'engId', таблица 'TestEng.dbo.oil'; столбец не допускает пустых значений. Вставить не удается. Заявление было прекращено. '

Похоже, что команда OUTPUT INSERTED не работает. Я также пытался использовать SELECT @engId_new = SCOPE_IDENTITY() и даже @@IDENTITY, но они также возвращают ноль и выдают ту же ошибку.

У меня есть похожие запросы (с использованием OUTPUT INSERTED) в других областях моего проекта, которые работают нормально. Этот запрос также работал корректно до сегодняшнего дня, когда мы изменили сервер, на котором работает база данных SQL - может быть, мне нужно изменить некоторые параметры базы данных / таблицы?

Любая помощь очень ценится, я действительно в растерянности. Благодаря.


РЕДАКТИРОВАТЬ: показывает, как выполняется запрос

Запрос построен программно - я знаю, что функции построения запросов работают, так как все остальные мои запросы работают нормально - запрос, который я пытаюсь выполнить, точно такой, как показано здесь (он возвращается конструктором запросов в виде одной строки):

"DECLARE @engId_newtable TABLE(engId INT); DECLARE @engId_new INT; INSERT INTO eng (locationTypeId, engNumb, projectId, engTypeId, capacity, cylNo, employeeId, bore, stroke, crankOffset, rodLength, cr, crankThrow, pinOffset, engDesc) OUTPUT INSERTED.engId INTO @engId_newtable SELECT a.locationTypeId, @engNumb, b.projectId, c.engTypeId, @capacity, @cylNo, d.employeeId, @bore, @stroke, @crankOffset, @rodLength, @cr, @crankThrow, @pinOffset, @engDesc FROM dbo.locationType AS a,dbo.project AS b,dbo.engType AS c,dbo.employees AS d WHERE a.locationType = @locationType AND b.projectCode = @projectCode AND b.engineType = @engineType AND c.engType = @engType AND d.userName = @userName ;SELECT @engId_new = engId FROM @engId_newtable; INSERT INTO oil (engId, oilTypeId) SELECT @engId_new, a.oilTypeId FROM dbo.oilType AS a WHERE a.oilManufacturer = @oilManufacturer AND a.oilRange = @oilRange AND a.oilGrade = @oilGrade ;"

Функция выполнения запроса, вызываемая из модели бритвенной страницы, запрос и соединение передаются как параметры:

public void ExecuteVoid(SqlConnection con, string query, List<SqlColumn> columns, List<SqlFilter> filters)
    {
        SqlCommand cmd = new SqlCommand(query, con);
        Parameterize(cmd, columns, filters);
        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
    }

Функция Parameterize просто добавляет все соответствующие параметры в запрос. Опять же, как и функция построителя запросов, я знаю, что она работает, потому что все остальные мои запросы выполняются как положено.


РЕДАКТИРОВАТЬ 2: SQL Server Profiler

Ниже показано изображение, показывающее все события, относящиеся к этому запросу, которые я вижу в SQL Server Profiler:

SQL Server Profiler Events

Все части запроса записаны, как и ожидалось, все параметры присутствуют, но запрос все еще не выполнен.

1 Ответ

0 голосов
/ 20 марта 2019

Я нашел проблему! Я использовал HttpContext.Session.GetString, чтобы получить значение предложения WHERE в моем первом запросе (к таблице eng). Я изменил имя строки в другом месте моего кода и забыл изменить его в запросе. Таким образом, проблема вообще не имеет ничего общего с SQL. Я могу сказать, что профилировщик SQL-сервера сыграл решающую роль в поиске этой ошибки, поэтому, если у вас возникли проблемы с параметризованными SQL-запросами Visual C #, просмотрите ваши запросы и вы можете выделить некоторые невидимые проблемы.

...