Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
lukan2
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 16
1
.NET 4.x

Удаление строки из базы данных MS SQL Server 2012

13.04.2014, 12:55. Просмотров 3416. Ответов 3
Метки нет (Все метки)

Доброго времени суток!
Только начинаю разбираться с тонкостями взаимодействия .NET и баз данных SQL (использую SQL server 2012). Так же использую Entity Framework. Возникла проблема с удалением выбранной строки из базы данных. Пишу приложение c использованием WinForm. Когда добавляю строку в базу данных проблем не возникает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int Id = 200;
            using (var context = new Database103SQLEntities())
            {
                foreach (var cw in context.Coworkers1)
                {
                    if (cw.Coworker_Id == '\0')
                        break;
                    else if (cw.Coworker_Id == Id)
                        Id++;
                }
 
                Coworkers cowork = new Coworkers//создаём строковое представление
                {
                    Coworker_Id = Id,
                    CoworkerSurname = textBox1.Text,
                    CoworkerName = textBox2.Text,
                    CoworkerFathername = textBox3.Text,
                    CoworkerPosition = textBox4.Text,
                    CoworkerStatus = textBox5.Text,
                    CoworkerLogin = textBox6.Text,
                    CoworkerPassword = textBox7.Text
                    
                };
                
                context.Coworkers1.Add(cowork);//добавляем строку в базу данных
                try
                {
                    context.SaveChanges();//сохраняем изменения
                    this.Close();
                }
                catch (Exception )
                {
                    MessageBox.Show("Ошибка добавления сотрудника", "Информация", MessageBoxButtons.OK);
                }
 
            }
А вот с удалением проблемы. Удаляю выбранную через листвью строку. Делаю аналогичным образом используя только метод .Remove:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 int value=0;
            string str;
            ListView.SelectedIndexCollection collection = listView1.SelectedIndices;
            if (collection.Count != 0)
            {
                using (var context = new Database103SQLEntities())
                {
                    foreach (var DelItem in context.Coworkers1)
                    {
                        str = listView1.SelectedItems[0].SubItems[6].Text;
                        value = Convert.ToInt32(str);
                        if (DelItem.Coworker_Id == value)
                        {
                            Coworkers cowork1 = new Coworkers() //создаём строковое представление
                            {
                                Coworker_Id = DelItem.Coworker_Id,
                                CoworkerSurname = DelItem.CoworkerSurname,
                                CoworkerName = DelItem.CoworkerName,
                                CoworkerFathername = DelItem.CoworkerFathername,
                                CoworkerPosition = DelItem.CoworkerPosition,
                                CoworkerStatus = DelItem.CoworkerStatus,
                                CoworkerLogin = DelItem.CoworkerLogin,
                                CoworkerPassword = DelItem.CoworkerPassword
 
                            };
                            context.Coworkers1.Remove(cowork1);  //удаляем строку - компилятор ругается
                            //не удалось удалить объект, поскольку он не найден в ObjectStateManager
                            try
                            {
                                context.SaveChanges(); //сохраняем изменения
                                this.Close();
                            }
                            catch (Exception)
                            {
                                MessageBox.Show("Ошибка удаления сотрудника", "Информация", MessageBoxButtons.OK);
                            }
                            break;
                        }
                    }
                    
                    
                }
                listView1.Items.RemoveAt(collection[0]);
Вероятно я чего-то не понимаю... Перечитал несколько тем на msdn, но там не совсем то, что в моём случае. Заранее благодарен за помощь!
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2014, 12:55
Ответы с готовыми решениями:

Подключение базы данных Microsoft SQL Server 2012
Всем доброго времени суток. Пишу проект в Visual studio 2013, база данных сделана в Microsoft SQL...

Удаление строки из базы данных sql
я хочу из моей базы данных comments удалить строчку по номеру айди так мне пишут "No database...

Удаление Sql server 2012 Express
Поставил Sql server 2012 Express. По умолчанию не задал имя экземпляру... Он поставлся, но через...

Перенос базы sql server 2012 с сервера на сервер
Есть два сервера на обоих установлен SQL Server 2012 (из 1-го образа), но почему то версия database...

3
Монфрид
1219 / 1029 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
13.04.2014, 13:34 2
Лучший ответ Сообщение было отмечено lukan2 как решение

Решение

у вас велосипед на велосипеде в коде.
Начнём с того, что вы зачем то задаёте вручную Id. Этого не надо делать.
А удаление у вас вообще шедеврально.

Цитата Сообщение от lukan2 Посмотреть сообщение
C#
1
2
3
4
5
6
foreach (var DelItem in context.Coworkers1)
{
str = listView1.SelectedItems[0].SubItems[6].Text;
value = Convert.ToInt32(str);
if (DelItem.Coworker_Id == value)
{
не нужно никакие циклы использовать чтобы найти элемент по его Id.
У context'a куча методов для поиска объектов как по Id, так и по любому свойству другому (Where, Find, FirstOrDefault..).

Цитата Сообщение от lukan2 Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
Coworkers cowork1 = new Coworkers() //создаём строковое представление//WTF??!!
 {
Coworker_Id = DelItem.Coworker_Id,
 CoworkerSurname = DelItem.CoworkerSurname,
CoworkerName = DelItem.CoworkerName,
 CoworkerFathername = DelItem.CoworkerFathername,
CoworkerPosition = DelItem.CoworkerPosition,
CoworkerStatus = DelItem.CoworkerStatus,
 CoworkerLogin = DelItem.CoworkerLogin,
 CoworkerPassword = DelItem.CoworkerPassword
};
Ну хорошо, нашли вы в своём цикле нужный объект в базе, а дальше зачем вы создаёте новый объект с такими же свойствами?
Потратьте пол часа на чтение какого нибудь туториала по EntityFramework, дабы не делать вот таких вот велосипедов.

В вашем случае, чтобы удалить объект, можно сделать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            ListView.SelectedIndexCollection collection = listView1.SelectedIndices;
            if (collection.Count != 0)
            {
            int idValue=Convert.ToInt32(listView1.SelectedItems[0].SubItems[6].Text);
             using (var context = new Database103SQLEntities())
                {
                        Coworkers coworker=context.Coworkers1.Find(idValue);
                        if(coworker!=null)
                        {
                                 context.Coworkers1.Remove(coworker);
                                 context.SaveChanges();
                                 listView1.Items.RemoveAt(collection[0]);
                        }   
                 }
             }
1
lukan2
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 16
13.04.2014, 13:48  [ТС] 3
Монфрид, спасибо! Всё очень чётко и рационально!
Выложил просто один из первых вариантов своего кода, т.к. не знал в чём именно причина ошибки. Был бы благодарен Вам, если бы ещё посоветовали хороший туториал по EF, т.к. в msdn отрывками читать очень неудобно.
0
Монфрид
1219 / 1029 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
13.04.2014, 14:05 4
lukan2, можно это почитать: http://professorweb.ru/my/LINQ/linq_entities/level14/14_1.php
вообще, всё в entityFramework вертится вокруг linq, так что не зная его, будет тяжело что-то делать.
Там вот в статье как раз делаются простые запросы к бд на linq (вставка, выборка, удаление)
1
13.04.2014, 14:05
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2014, 14:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как средствами джавы реализовать просмотр базы данных Access, SQL Server, SQL Server Compact и запись в нее?
---

Подсоединение базы SQL Server 2012 к C# приложению (Visual Studio 2015)
Делаю проект. Необходимо создать c# приложение, которое будет работать с базой данных. Подобным...

Сохранение данных из datagridview в базу данных под MS sql server 2012
Доброго времени суток. Делаю курсовую, и до этого момента думал, что самое сложное создать...

SQL Server 2012: выборка данных из БД в DataGridView
Добрый день. Помогите пожалуйста, в visual basic у меня есть datagrid делаю новое подключение,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.