Здравствуйте, rameel, Вы писали:
R>Здравствуйте, elcolex, Вы писали:
E>>Написал, все работает. Потом присмотрелся... И думаю: а какого фига не используются bind-переменные?!..
R>Потому что используешь константы. Используй переменные и будут тебе параметры.
R>Для информации, инлайнингом параметров при использовании переменных можно управлять через свойство InlineParameters у DataConnection и DataContext.
R>R>var name = "John";
R>// Какой именно запрос будет сгенерирован зависит от значения свойства InlineParameters
R>db.Persons.Insert(() => new Person {Name = name});
R>
E>> Это был для меня прям удар в спину. Тут же ведь значения из полей модели прямо вставляются в sql. Вот это косяк!
R>Тебе только кажется. Все безопасно, так как строковые параметры при необходимости эскейпятся.
E>>И что интересно, метод Insert генерит SQL с bind-переменными!
R>Вот эти методы, вызываемые напрямую у DataConnection и DataContext генерируют параметризованный sql.
R>R>db.Insert(new Person {Name = "John"});
R>db.InsertWithIdentity(new Person {Name = "John"});
R>
R>Остальные от того, что ты используещь: константы или переменные (в последнем еще зависит от свойства InlineParameters).
E>>Но он не очень удобный, потому что не возвращает ид записи.
R>Есть метод:
R>R>db.InsertWithIdentity(new Person {Name = "John"});
R>
Про свойство InlineParameters я знаю. Как раз в дебаггере смотрел, оно по-умолчанию false. И использую я переменные (значения приходят с формы ввода): в linq2db есть такой способ прикольный — db.Value().Value().Value().InsertWithIdentity(). Это чтобы не все поля таблицы инсертить.
Но я не совсем понял, а для чего такие сложности? Константы это или не константы. Всегда использовать бинд-переменные да и не волноваться — а правильно ли мы заэскейпили?
Вот, реальный пример: в поле ввода введено значение (без ковычек) "---юЩУЯ----"
И у меня при инсерте выдаёт оракловую ошибку "ORA-01008 not all variables bound". И я не понимаю что произошло. Т.е. это значение не вставилось в таблицу.
И потом не объяснишь разработчику, что вот этот InsertWithIdentity не используй, потому что он не совсем безопасный, а вот этот используй.
Эх, такая классная библиотека. Это ж надо...