Нужно реализовать обновление данных с помощью класса 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.
Понравилась ли вам эта идея?
Владислав, а зачем делать блок с одним условием? Обычно блоки делают, чтобы внутри 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 отдельно.