Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/27: Рейтинг темы: голосов - 27, средняя оценка - 4.67
Rockedit
Автор FAQ
Автор FAQ
1772 / 583 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
1

Удаление записей(DataAdapter)

23.09.2010, 22:02. Просмотров 5151. Ответов 17
Метки нет (Все метки)

Здравствуйте! Пишу на C# , столкнулся с такой проблемой. Работаю с MS SQL Express, получаю данные из таблицы следующим образом(код процедуры Form1_Load)
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
44
45
46
47
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Common;
using System.Data.SqlClient;
 
namespace TestConnectionToVFODB
{
    public partial class Form1 : Form
    {
        DataTable dt;
        SqlDataAdapter da;
        public Form1()
        {
            InitializeComponent();
            SqlCommandBuilder b = new SqlCommandBuilder(da);
            
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            SqlConnectionStringBuilder connectionString =
                new SqlConnectionStringBuilder();
            connectionString.DataSource = @"(local)\SQLEXPRESS";
            connectionString.InitialCatalog = "FVO";
            connectionString.IntegratedSecurity = true;
            da = new SqlDataAdapter("Select * From Поступающие",
                connectionString.ConnectionString);
            dt = new DataTable("Поступающие");
            da.Fill(dt);
            DataSet ds = new DataSet();
            dataGridView1.DataSource= dt;
 
        }
 
        private void updateToolStripMenuItem_Click(object sender, EventArgs e)
        {
            da.Update(dt);
        }
 
    }
}
Все данные читаются и прекрасно выводятся. Вывожу в dataGridView. Далее, я удаляю строки из компонента dataGridView при помоши выделения и клавиши Delete(в общем то и програмно пробовал, все равно таже проблема). Все нормально, но стоит только выполнить da.Update(dt) для отправки обновления в БД выскакивает ошибка
Удаление записей(DataAdapter)

С БД в C# работаю совсем мало . Никак не могу понять в чем проблема, может кто объяснить как исправить эту ошибку?
Заранее спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2010, 22:02
Ответы с готовыми решениями:

Удаление записей используя dataAdapter в связанных таблицах
Здравствуйте. Удаление из одной таблицы реализую так try ...

C# удаление записей
скажите как можно по щелчку по кнопке удалить все записи с таблицы кроме тех у...

Удаление записей в таблице
Как правильно удалять записи из таблицы базы Добавление DataTable table =...

Редактирование, удаление записей из БД
Всем привет, вообщем есть форма, на форме...

Удаление дублирующих записей в БД
Добрый день! Подскажите пожалуйста как удалять одинаковые строчки а точнее...

17
Rockedit
Автор FAQ
Автор FAQ
1772 / 583 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.09.2010, 23:23  [ТС] 2
Вроде получилось удалить, только удаляется таким образом сразу с БД
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
private void deleteToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            string str = string.Empty ;
            if (dataGridView1.SelectedRows != null)
                for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
                {
                    str += dataGridView1.SelectedRows[i].Cells[0].Value.ToString();
                    if (i != dataGridView1.SelectedRows.Count - 1)
                        str += ",";
                }
            if (str == string.Empty)
            {
                MessageBox.Show("Выделите строки");
                return;
            }
            string query = String.Format("DELETE FROM Поступающие " +
                   "WHERE (ID IN ({0}));",str);
            MessageBox.Show(query);
            cn.Open();
              this.поступающиеTableAdapter.Adapter.DeleteCommand = new SqlCommand(query, cn);
              this.поступающиеTableAdapter.Adapter.DeleteCommand.ExecuteNonQuery();
              cn.Close();
              this.поступающиеTableAdapter.Fill(this.fVODataSet.Поступающие);
        }
а как можно сделать, что сначало удалялсь просто с таблицы..а потом результаты изменения таблицы посылались в БД?
Смысл такой, я работаю с таблицей изменяю ее, добавляю , удаляю столбцы, как сделать , что бы потом, либо все изменения отменить либо отправить в БД изменения?
0
nio
5965 / 3371 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
24.09.2010, 00:05 3
Цитата Сообщение от Rockedit Посмотреть сообщение
а как можно сделать, что сначало удалялсь просто с таблицы..а потом результаты изменения таблицы посылались в БД
не пиши эту часть кода в даном методе
Цитата Сообщение от Rockedit Посмотреть сообщение
this.поступающиеTableAdapter.Adapter.DeleteCommand = new SqlCommand(query, cn);
this.поступающиеTableAdapter.Adapter.DeleteCommand.ExecuteNonQuery();
cn.Close();
this.поступающиеTableAdapter.Fill(this.fVODataSet.Поступающие);


Цитата Сообщение от Rockedit Посмотреть сообщение
как сделать , что бы потом, либо все изменения отменить либо отправить в БД изменения?
что б изменения вступили в силу, необходимо для адаптера определить InsertCommand, UpdateCommand и DeleteCommand, а затем вызвать для этого адаптера Update. Это следует делать в отдельном методе (например нажатие кнопки "Сохранить")

чтоб откатить все изменения, достаточно не сохраняя данные повторно вызвать метод Fill, произойдет загрузка из БД неизмененных данных. Только не забудь для начала очистить источник данных.
1
kirill29
2069 / 1232 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
24.09.2010, 00:08 4
Цитата Сообщение от Rockedit Посмотреть сообщение
Смысл такой, я работаю с таблицей изменяю ее, добавляю , удаляю столбцы, как сделать , что бы потом, либо все изменения отменить либо отправить в БД изменения?
Работайте с таблицей автономно с помощью DataTable или DataSet. Если необходимо сохранить изменения в базе, то вызывайте для Adapter'a, с помощью которого получали данные, метод Update(). Хотя для быстродействия у DataSet есть метод GetChange(), который выгружает в базу только внесенные изменения, тем самым уменьшаем сетевой трафик и время работы.
1
Rockedit
Автор FAQ
Автор FAQ
1772 / 583 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
24.09.2010, 00:45  [ТС] 5
Буду пробовать, если что не получится, я отпишусь. Спасибо!

Добавлено через 29 минут
Не получается внести изменения обратно в БД, пробую так(private void updateToolStripMenuItem_Click(object sender, EventArgs e))
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Common;
using System.Data.SqlClient;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        SqlDataAdapter da;
        DataSet ds;
        DataTable dt;
        SqlConnection cn;
        SqlConnectionStringBuilder conn;
 
        public Form1()
        {
            InitializeComponent();
            /*Data Source=(local)\SQLEXPRESS;
             * Initial Catalog=FVO;Integrated 
             * Security=True;Pooling=False*/
            conn = new SqlConnectionStringBuilder();
            conn.DataSource = @"(local)\SQLEXPRESS";
            conn.InitialCatalog = "FVO";
            conn.IntegratedSecurity = true;
            da = new SqlDataAdapter("Select * From Поступающие", conn.ConnectionString);
            ds = new DataSet();
            dt = new DataTable("Поступающие");
                da.Fill(dt);
                ds.Tables.Add(dt);
                dataGridView1.DataSource = ds.Tables["Поступающие"];
                SqlCommandBuilder b = new SqlCommandBuilder(da);
 
        }
 
        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows != null)
            {
 
                foreach (DataGridViewRow i in dataGridView1.SelectedRows)
                    ds.Tables["Поступающие"].Rows[i.Index].Delete();
                  }
 
        }
 
        private void updateToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ds.AcceptChanges();
            da.Update(ds.Tables["Поступающие"]);
        }
 
        private void cancelUpdateToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ds.RejectChanges();
        }
    }
}
Ошибку не выдает, но после перезагрузки приложения выводит все в первоначальном виде.

C#
1
2
3
4
5
6
        private void updateToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ds.AcceptChanges();
            //da.Update(ds.Tables["Поступающие"]);
            ds.GetChanges();
        }
Аналогично.
0
nio
5965 / 3371 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
24.09.2010, 00:52 6
А где InsertCommand, UpdateCommand и DeleteCommand ?
0
Rockedit
Автор FAQ
Автор FAQ
1772 / 583 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
24.09.2010, 00:54  [ТС] 7
C#
1
  SqlCommandBuilder b = new SqlCommandBuilder(da);
Я думал эта строка это делает.
0
nio
5965 / 3371 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
24.09.2010, 01:02 8
Ага, только ты волшебное слово забыл написать
Эта строка только создает экземпляр SqlCommandBuilder, после этого необходимо вызвать Fill(), и уже потом вытаскивать из b готовые запросы и присваивать их командам адаптера. Все это прокатит только в том случае, если Fill тянет данные из одной таблицы.
1
Rockedit
Автор FAQ
Автор FAQ
1772 / 583 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
24.09.2010, 01:07  [ТС] 9
C#
1
2
b = new SqlCommandBuilder(da);
            da.Update(ds,"Поступающие");
Вот таким способом заработала. Но насколько я знаю SqlCommandBuilder снгижает производительность
Все это прокатит только в том случае, если Fill тянет данные из одной таблицы.
А если из нескольких таблиц? Можно пример.
0
nio
5965 / 3371 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
24.09.2010, 01:11 10
Цитата Сообщение от Rockedit Посмотреть сообщение
А если из нескольких таблиц?
В таком случае SqlCommandBuilder не работает и писать запросы нужно руками

Рекомендую полистать книжку Сеппа Д "ADO.NET", все доступно изложено и с примерами. Мозг, я смотрю, у тебя работает хорошо, разберешься быстро
1
Rockedit
Автор FAQ
Автор FAQ
1772 / 583 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
24.09.2010, 01:15  [ТС] 11
Получается запрос я должен буду создать, анализируя какие изменения произошли? используя RowState наверное)?
Кстати , еще такой вопрос, а в кода, который генерирует Visual studio при визуальном создании (Add project data Source)подключения к БД, описаны эти команды?
0
nio
5965 / 3371 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
24.09.2010, 01:20 12
Нет. Ты только опиши запросы для адаптера в InsertCommand, UpdateCommand и DeleteCommand. Потом просто вызываешь Update(). Дальше все сработает самостоятельно (на основании RowState прога сама выберет необходимый запрос для каждой строки в источнике данных)
0
Rockedit
Автор FAQ
Автор FAQ
1772 / 583 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
24.09.2010, 01:23  [ТС] 13
Сработает , даже ести я уже много изменений внес в таблицу? скажем удалил пару строк, пару отредактировал, и пару добавил, а потом только решил выполнить Update.
0
nio
5965 / 3371 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
24.09.2010, 01:30 14
Цитата Сообщение от Rockedit Посмотреть сообщение
скажем удалил пару строк, пару отредактировал, и пару добавил, а потом только решил выполнить Update.
Все сработает
1
Rockedit
Автор FAQ
Автор FAQ
1772 / 583 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
24.09.2010, 01:31  [ТС] 15
Спасибо!Буду пробовать, если будут еще глупые вопросы, я напишу))))
0
nio
5965 / 3371 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
24.09.2010, 01:35 16
Посмотри книгу, которую я тебе указал, и множество глупых вопросов пропадет
1
Rockedit
Автор FAQ
Автор FAQ
1772 / 583 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
24.09.2010, 10:19  [ТС] 17
Цитата Сообщение от nio Посмотреть сообщение
Посмотри книгу, которую я тебе указал, и множество глупых вопросов пропадет
Уже смотрю)

Добавлено через 8 часов 36 минут
Может кому пригодится, сделал так. Все работает. Спасибо всем кто помогал, особое спасибо nio!!!
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Common;
using System.Data.SqlClient;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        SqlDataAdapter da;
        DataSet ds;
        DataTable dt;
        SqlConnection cn;
        SqlConnectionStringBuilder conn;
 
        public Form1()
        {
            InitializeComponent();
            /*Data Source=(local)\SQLEXPRESS;
             * Initial Catalog=FVO;Integrated 
             * Security=True;Pooling=False*/
            conn = new SqlConnectionStringBuilder();
            conn.DataSource = @"(local)\SQLEXPRESS";
            conn.InitialCatalog = "FVO";
            conn.IntegratedSecurity = true;
            cn = new SqlConnection(conn.ConnectionString);
            da = new SqlDataAdapter("Select * From Поступающие", conn.ConnectionString);
            ds = new DataSet();
            dt = new DataTable("Поступающие");
                da.Fill(dt);
                ds.Tables.Add(dt);
                dataGridView1.DataSource = ds.Tables["Поступающие"];
            /*Delete*/
                string query = "Delete Поступающие WHERE ID = @ID";
                da.DeleteCommand = new SqlCommand(query,cn);
                SqlParameterCollection pc;
                SqlParameter p;
                pc = da.DeleteCommand.Parameters;
                p = pc.Add("@ID",SqlDbType.Int,0,"ID");
                p.SourceVersion = DataRowVersion.Original;
             /*Insert*/
                query = "Insert Into Поступающие (ФИО) VALUES (@FIO)";
                da.InsertCommand= new SqlCommand(query, cn);
                pc = da.InsertCommand.Parameters;
                pc.Add("@FIO", SqlDbType.Text, 0, "ФИО");
            /*Update*/
                query = "Update Поступающие " + 
                         "SET ФИО = @FIO WHERE ID = @ID";
                da.UpdateCommand = new SqlCommand(query, cn);
                pc = da.UpdateCommand.Parameters;
                pc.Add("@FIO", SqlDbType.Text, 0, "ФИО");
                p = pc.Add("@ID", SqlDbType.Int, 0, "ID");
                p.SourceVersion = DataRowVersion.Original;
 
        }
 
        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows != null)
            {
 
                foreach (DataGridViewRow i in dataGridView1.SelectedRows)
                    ds.Tables["Поступающие"].Rows[i.Index].Delete();
                  }
 
        }
 
        private void updateToolStripMenuItem_Click(object sender, EventArgs e)
        {
            da.Update(ds,"Поступающие");
 
        }
 
        private void cancelUpdateToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ds.RejectChanges();
        }
    }
}
1
ApeLcunChik
0 / 0 / 0
Регистрация: 13.08.2015
Сообщений: 11
01.04.2016, 11:33 18
Цитата Сообщение от Rockedit Посмотреть сообщение
Может кому пригодится, сделал так. Все работает. Спасибо всем кто помогал, особое спасибо nio!!!
Добрый день! Спасибо большое, очень помог Ваш код! Но столкнулась с проблемой: при добавлении записей в БД SQL заноситься значение "NULL". Не подскажите, как можно организовать вложенный запрос? Спасибо за ответ!
C#
1
2
3
4
5
string query = "INSERT INTO WorkHour (IdEmp) SELECT @IdEmp FROM Employees WHERE Employees.TabNum = @tabnum";
            adapter.InsertCommand = new SqlCommand(query, Module1.connection);
            pc = adapter.InsertCommand.Parameters;
            pc.Add("@IdEmp", SqlDbType.NVarChar, 50, "IdEmp");
            p = pc.Add("@tabnum", SqlDbType.Int, 4, "TabNum");
0
01.04.2016, 11:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2016, 11:33

Не работает удаление записей в БД
вопрос возник насчет удаления.при нажатии на кнопку раотает редактирование и...

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

Добавление, редактирование и удаление записей в БД
как добавить строку из listBox2 в базу данных (ListBOX1)? как редактировать...


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

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

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