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

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

13.04.2014, 12:55. Просмотров 1802. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2014, 12:55
Ответы с готовыми решениями:

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

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

Компонент для базы MS SQL Server 2012 для Windows 7
Какой компонент нужно установить на клиенте Windows 7 для соединения с базой данных MS SQL Server...

Базы данных SQL Server и C#
Всем добрый вечер. Интересует создание баз данных и работа с ними на c#.Я вообще не имею...

Создания базы данных и таблиц в базу данных в SQL Server Managment Studio
Здраствуйте. Нужно создать такую маленькую программу при помощи которой можно создать базу данных и...

3
Монфрид
1212 / 1022 / 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
Монфрид
1212 / 1022 / 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2014, 14:05

Создание базы данных SQL Server из C#
Подскажите. Как создать базу данных в sql server программно, с помощью с#. Нужно при нажатии на...

Вывод из базы данных SQL Server
Форма подключается в базу данных и после нажатия делает выборку по логину и паролю если есть такие...

Подключение базы данных MS SQL Server 2008
Здравствуйте! Имеется VS 2013 Pro и MS SQL Server 2008. База данных сама уже собрана, интерфейс...


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

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

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