cgprakash Ответов: 1

Как выполнять 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

я сделал это уже в самом начале, но это не влияет.

1 Ответов

Рейтинг:
2

Gopal Rakhal

Try with below code, may be it help you

StudentContext.Database.SqlQuery<int>("insertProcedure param1 param2 param3");


cgprakash

Спасибо за ответ Гопал, я не получил свойство " SqlQuery< int>". Что же делать?

Gopal Rakhal

Это свойство эф.
https://msdn.microsoft.com/en-us/library/jj592907(v=против 113). aspx