Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > c# Несколько вопросов по LinqToSQL


Автор: WantToProg 10.6.2010, 20:32
Доброе время суток. Помогите пожалуйста перевести запросы SQL в язык Link.
 Запросы следующие:
Код

"UPDATE Units SET Cde = '" + variable1 + "', Name = '" + variable2 + "', Price = '" + variable3 + "', QTY = '" + variable4 + "' WHERE Cde = '" + variable1 + "' ";

"INSERT INTO Units (Cde, Name, Price, QTY) VALUES('" + variable1 + "','" + variable2 + "','" + variable3 + "','" + variable4 + "')"

"DELETE from Barcodes WHERE Barcode = '" + variable5 + "'"

"SELECT TOP 1 * FROM BARCODES inner join UNITS on Barcodes.[Cde]=Units.[Cde] WHERE Barcode LIKE '"  + textBox1.Text + "%'";


И что заменяет результат выполнения запроса:
Код

int result = comm.ExecuteNonQuery();


PS: Очень надеюсь на вашу помощь. Сам к сожалению не могу справиться, уже день потратил, не работают запросы :(

Автор: Любитель 10.6.2010, 21:29
1. Нельзя так "переводить".
2. В линке нету батч модификаций.
3. Если нужен "перевод" - то только хранимки.
4. Насчёт второй части. Смотрим пункт 2. С пунктом 3 - @@rowcount.
5. Про SQL-инъекции вы, конечн, не слышали?

Автор: Выхухоль 11.6.2010, 13:57
Цитата(Любитель @  10.6.2010,  21:29 Найти цитируемый пост)
1. Нельзя так "переводить".
2. В линке нету батч модификаций.
3. Если нужен "перевод" - то только хранимки.
4. Насчёт второй части. Смотрим пункт 2. С пунктом 3 - @@rowcount.
5. Про SQL-инъекции вы, конечн, не слышали? 


Вы щас своим ответом пытались помоч человеку или показать свою невъ**нность?


как понять в линке нет батч модификаций??? даже мне прогеру с 4-хлетним опытов в .NET нифига эта враза в данном контексте не понятна

Цитата(Любитель @  10.6.2010,  21:29 Найти цитируемый пост)
 3. Если нужен "перевод" - то только хранимки.

хрень, хранимки следует использовать только при изменении данных, а тут и выборочный  запрос имеется...

Цитата(Любитель @  10.6.2010,  21:29 Найти цитируемый пост)
 5. Про SQL-инъекции вы, конечн, не слышали? 

какие инъекции, в LINQ???? вы когда последний раз видели чтобы кто то инекцию в линке провел?


Для того чтобы получить анологию с вышеуказанными запросами следует в первую очередь создать Linq To SQL Classes.dbml слой данных, это спец Item который добавляеться в проект как и все остальные.

При создании этого объекта к нему вы укажете подключение к базе, и на этот слой будете закидывать данные в виде таблиц вьюшек и хранимых процедур.

после этого вы используете объект созданного вами  Linq To SQL Classes класса, который в себе будет содержать весь слой данных который вы на него поместили.

к примеру, все таблицы участвующие в описанном выми запросах уже есть в этом слое данных:

Код

using(LinqToSqlDbContext Mycon = new LinqToSqlDbContext ())
{
//выборка данных
var SelectReq = (from i in Mycon.BARCODES select i).Join(Mycon.Units, e=>e.Cde,o=>o.Cde, (m,j)=>new {Cde = m.Cde, UnitID = j.UnitID, Barcode = m.Barcode, Name =j.Name, Price =j.Price, QTY =j.QTY   }).Where(i=>i.Barcode.Conteins(textBox1.Text)).First();
//насчет изменения данных, счиатеся правленым делать это через создание хранимых процедур в БД и перекидывания их на наш слой данных, но если нет конкретных условий безопасности и объемы информации проходящей изменения не будут тормозить всю производительность приложения можно не париться и смело писать вот так:

//1. Deleting

var DeleteRow = (from i in Mycon.BARCODES  where i.Barcode == variable5 select i).FirstOrDefault();//это только при условии отной строки на удаление
Mycon.DeleteOnSubmit(DeleteRow ); //для удаления множетсва строк применяется другой метод

//2. Updating 

var UpdatedRow = (from in in Mycon.Units where i.Cde==variable1 select i).FirstOrDefault();
UpdatedRow .Name  = variable2 ;
UpdatedRow .Price = variable3 ;
UpdatedRow .QTY = variable4 ; //изменения произойдут при вызове метода SubmitChanges данного объекта контекста 

//3. inserting

var InsertedRow = new Unit();
InsertedRow .Cde= variable1 ;
InsertedRow .Name  = variable2 ;
InsertedRow .Price = variable3 ;
InsertedRow .QTY = variable4 ;

Mycon.InsertOnSubmit(InsertedRow);

// и последнее для выполнения все этих операций (изменения, выборка осуществляеться автоматически при получения данных из запроса) нужно засабмитить все это дело

Mycon. SubmitChanges();

// и вуо-ля...
}



канечно я не дал полную исчерпывающую информацию, но зато четко ответил на поставленный вами вопрос, пробуйте, докапывайте, советую читать все таки литературы, а уже потом выполнять какие либ действия на практике

Автор: Любитель 11.6.2010, 18:29
Во-первых, ещё раз. Я говорил о том, что нельзя переводить. Т. е. вот этому куску соответствует то, вот этому - то. Я не говорил о том, что нельзя решить аналогичные бизнес-задачи.

Цитата(Выхухоль @  11.6.2010,  13:57 Найти цитируемый пост)
как понять в линке нет батч модификаций??? даже мне прогеру с 4-хлетним опытов в .NET нифига эта враза в данном контексте не понятна

Ээ.. Набираем batch update linq, скажем, и смотрем кучу вопросов. Речь о том, чтобы одним запросом вставить, удалить или обновить много данных. В линке этого нельзя.

Цитата(Выхухоль @  11.6.2010,  13:57 Найти цитируемый пост)
хрень, хранимки следует использовать только при изменении данных, а тут и выборочный  запрос имеется...

Ещё раз - пункт 1. Я говорил о том, чтобы предложить "ниверсальный алгоритм перевода". А вообще, "только при изменении" - это даж не смешно. Как вы собрались всякие иерархические запросы, window-функции и сложные агрегации делать?!

Цитата(Выхухоль @  11.6.2010,  13:57 Найти цитируемый пост)

к примеру, все таблицы участвующие в описанном выми запросах уже есть в этом слое данных:

Ещё такой момент - очень неудачная идея миксить query и учеутышщт синтаксисы. Тем более так дико.

Автор: WantToProg 14.6.2010, 09:42
Любитель, к сожалению, я действительно не понял что вы имеете ввиду. Я не знаю, что такое батч-модификации и sql-инъекции. Обещаю, что поищу в интернете описание ;)
Выхухоль, Большое спасибо, вы меня направили в нужную сторону. Кроме того, нашел еще такую ссылку (прошу прощения, что раньше не внимательно искал) 
http://msdn.microsoft.com/ru-ru/library/bb882643(VS.90).aspx

За выборку отдельное спасибо. Если остальные процедуры я могу заменить прямыми командами SQL, то с выборкой была проблема

Остался вопрос с результатом выполнения запроса
Код

int result = comm.ExecuteNonQuery();

ExecuteNonQuery() возвращает 1 или 0, что позволяет понять произошел update, delete или insert. Чем заменяют это в LinqToSQL?


PS: А еще я походу вопрос поставил не корректно. Все запросы описанные в первом посте не надо было делать подряд. Мне в разных частях кода необходимо их делать smile Я хотел разобраться как делать update, insert, delete и select, и возвращать результат выполнения в языке LinqToSQL.

Автор: Ram1reS 14.6.2010, 23:05
Цитата

ExecuteNonQuery() возвращает 1 или 0, что позволяет понять произошел update, delete или insert. Чем заменяют это в LinqToSQL?

Ловлей Exceptiona'a при DataContext.SaveChanges()

Автор: WantToProg 15.6.2010, 07:32
Цитата(Ram1reS @  14.6.2010,  23:05 Найти цитируемый пост)
Ловлей Exceptiona'a при DataContext.SaveChanges() 

Вы имели ввиду SubmitChanges()? Так при Update исключения нет. Или я не внимательно смотрю?
Пока что, я решил сделать таким образом. Не уверен, что он правильный.
Создаю таблицу в базе с ключевым полем. Потом произвожу INSERT и в случае Exception, UPDATE.

Автор: Ram1reS 15.6.2010, 09:37
Да, SubmitChanges() конечно же =)

Смотрим http://msdn.microsoft.com/ru-ru/library/Bb399378(v=VS.100).aspx
Цитата

В данный момент любые ошибки, обнаруженные базой данных, приводят к остановке процесса отправки и вызову исключения.Выполняется откат всех изменений базы данных к состоянию до начала отправки. Класс DataContext по-прежнему содержит запись всех изменений.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)