Как выполнять SQL-запросы в LINQ?
Я пытаюсь выполнять операции dml в Linq с помощью ExecuteQuery () и ExecuteCommand (). Ошибка, которая произошла после выполнения, не влияет на запись в базе данных.
Например: чтобы вставить новую запись в таблицу базы данных, я использовал ExecuteCommand ().
После того как произошла ошибка, я закодировал ее с помощью Submitchanges (), но ожидаемого результата не было.
Пример кода для вставки данных в таблицу:
using(StudentsDbDataContext StudentContext = new StudentsDbDataContext()) { int r = StudentContext.ExecuteCommand("insert into tblStudents values ({0},{1},{2})", firstname, lastname, gender); if (r > 0) { Console.WriteLine("{0} row added.", r); Console.ReadKey(); } }
Что я уже пробовал:
using(StudentsDbDataContext StudentContext = new StudentsDbDataContext()) { int r = StudentContext.ExecuteCommand("insert into tblStudents values ({0},{1},{2})", firstname, lastname, gender); StudentContext.SubmitChanges();//<--- ADDED if (r > 0) { Console.WriteLine("{0} row added.", r); Console.ReadKey(); } }
Как это решить?
Andy Lanng
Это просто действительно урезанная версия вашего кода?
Если нет, то почему бы не использовать метод вставки объекта L2S?
cgprakash
спасибо за ответ, но мне нужно делать sql-запросы с использованием методов linq.
Andy Lanng
В таком случае, я думаю, должно быть какое-то расовое условие. Посмотрите на второй запрос: Вы устанавливаете r как результат ExecuteCommand, но он имеет значение только после отправки изменений. Нет никакого кода await или асинхронного стиля, который я вижу на вашем конце.
Попробуйте добавить нить.Sleep (100); вместо db.SubmitChanges (). Если это работает, то существует некоторое (нечетное) состояние гонки.
Попробуйте написать его так (псевдокод):
int r;
использование (db){
..r = ExecuteCommand ("текст");
}
если (r> 0)
.. занимайтесь всякой ерундой
Таким образом, вы знаете, что r вернется, потому что он должен завершить запрос, прежде чем избавиться от контекста.
cgprakash
я сделал это уже в самом начале, но это не влияет.