Идея
Обсуждение

Ошибка при генерации запроса UpdateSelect

Нужно реализовать обновление данных с помощью класса UpdateSelect. Но не работает группировка условий.

UPDATE [dbo].[TestTbl]
SET [val2] = [source].[val2]
FROM [dbo].[TestTbl2] [source]
WHERE ([source].[id] = [TestTbl].[id] OR [source].[id2] = [TestTbl].[id2]) AND
	([source].[id3] = [TestTbl].[id3] OR [source].[id4] = [TestTbl].[id4])

При формировании аналогичного запроса для выборки (Select) - все работает корректно.

При исследовании ошибки было выявлено, что ошибка возникает во внутренней логике в dll Terrasoft.Core.MSSql, так как группа методов .Where().OpenBlock() в коллекции условий запроса создала пустой QueryCondition, а в dll нет проверки на возможность пустого условия.

Мое предположение: непредвиденный кейс в dll.

4 комментария

Владислав, а зачем делать блок с одним условием? Обычно блоки делают, чтобы внутри or и снаружи and или наоборот. Пример, но только Select, есть тут.

Если сделать полноценный блок, тоже Update будет с ошибкой?

И, если не затруднит, приложите код текстом, а не скриншотами.

Зверев Александр пишет:

Владислав, а зачем делать блок с одним условием? Обычно блоки делают, чтобы внутри or и снаружи and или наоборот. Пример, но только Select, есть тут.

Если сделать полноценный блок, тоже Update будет с ошибкой?

И, если не затруднит, приложите код текстом, а не скриншотами.

Одно условие для простоты понимания ошибки. Изначально было несколько условий, как в приложеном SQL. Но даже такая ситуация возможна. Вот я просто хочу обернуть одно условие в скобки. 

Здесь проблема именно в классе UpdateSelect, другие классы (Select, Update) работают нормально с такими условиями.

Предоставленный метод из базовой dll вызывается только для UpdateSelect и в методе нет проверки.

 

var select1 =
    new Select(_userConnection)
    .Column("source", "id")
    .Column("source", "val2")
    .From("TestTbl2", "source")
    .Where("source", "id").IsEqual("TestTbl", "id");
 
Console.WriteLine(select1.GetSqlText());
Console.WriteLine("----------------------------------------------------");
 
var select2 =
    new Select(_userConnection)
    .Column("source", "id")
    .Column("source", "val2")
    .From("TestTbl2", "source")
    .Where().OpenBlock("source", "id").IsEqual("TestTbl", "id").CloseBlock();
 
Console.WriteLine(select2.GetSqlText());
Console.WriteLine("----------------------------------------------------");
 
var update1 =
    new UpdateSelect(_userConnection, "TestTbl", "TestTbl")
    .Set("val2", Column.SourceColumn("source", "val2"))
    .From("TestTbl2", "source")
    .Where("source", "id").IsEqual("TestTbl", "id");
 
Console.WriteLine(update1.GetSqlText());
Console.WriteLine("----------------------------------------------------");
 
var update2 =
    new UpdateSelect(_userConnection, "TestTbl", "TestTbl")
    .Set("val2", Column.SourceColumn("source", "val2"))
    .From("TestTbl2", "source")
    .Where().OpenBlock("source", "id").IsEqual("TestTbl", "id").CloseBlock();
 
Console.WriteLine(update2.GetSqlText());

 

 

Стоит добавить простую проверку:

Ошибку обнаружили, разработчики занимаются ее решением. 

В качестве обходного решения необходимо использовать Select и Update отдельно.

Показать все комментарии