Здравствуйте, rameel, Вы писали:
R>Здравствуйте, elcolex, Вы писали:
E>>И использую я переменные (значения приходят с формы ввода): в linq2db есть такой способ прикольный — db.Value().Value().Value().InsertWithIdentity(). Это чтобы не все поля таблицы инсертить.
R>Есть разница как использовать
R>R>db.Persons.Value(p => p.Name, () => name).Insert();
R>db.Persons.Value(p => p.Name, name).Insert();
R>
Спасибо за разъяснения. Не знал... Т.е. Вы хотите сказать, что в одном случае будут использоваться инлайн-константы, в другом бинд-переменные? Надо проверить будет. Тогда может и верну код, который использует InsertWithIdentity с триггерами.
E>>Но я не совсем понял, а для чего такие сложности? Константы это или не константы. Всегда использовать бинд-переменные да и не волноваться — а правильно ли мы заэскейпили?
R>Это зависит от многих факторов, в том числе и от используемой БД и от его версии. Где-то константы могут приводить к перекомпиляции запроса и переполнении планов, но в то же время план запроса будет построен под конкретные значения, в отличие от.
R>Соответственно, библиотека не навязывает свой способ работы с используемой БД и не сужает выбор до "единственно правильного", а дает возможность использовать разные стратегии для разных случаев с максимальной эффективностью. И я считаю, это правильно.
E>>Вот, реальный пример: в поле ввода введено значение (без ковычек) "---юЩУЯ----"
E>>И у меня при инсерте выдаёт оракловую ошибку "ORA-01008 not all variables bound". И я не понимаю что произошло. Т.е. это значение не вставилось в таблицу.
R>Не понимаешь, но виновата библиотека?
Библиотека не виновата, это у меня руки кривые как всегда. Может там скл-инъекций и нет, судя по тому что ошибка выдается. Но с другой стороны, если используются бинд-переменные, я точно знаю, что можно быть спокойным.
E>>И потом не объяснишь разработчику, что вот этот InsertWithIdentity не используй, потому что он не совсем безопасный, а вот этот используй.
R>Нет такого, Insert и InsertWithIdentity работают совершенно одинаково.
Они работают одинаково, но в рамках одной стратегии установки параметров. Как я понял, если указывать переменную, то будут использованы инлайн-параметры, а если через лямбду, то будут использованы бинд-переменные (могу ошибаться, возможно наоборот поведение). По-моему, это не очевидно. Это надо потом разработчикам объяснять, или комментарий в коде писать, чтоб не ошиблись. Ну да ладно, придираюсь уже.
E>>Эх, такая классная библиотека. Это ж надо...
R>Предлагаю разобраться, а не кидаться эээ беспочвенными обвинениями
Да я не обвиняю библиотеку. Был у меня сюрприз просто перед самым новым годом. Неожиданный, надо сказать.. Разработчикам библиотеки большой респект. Давно уже смотрю что делают (начиная с bltoolkit). Грамотные простые решения, без этих всяких новомодных приблуд.