Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 3 / 0
Регистрация: 15.11.2016
Сообщений: 20

Что не так с UpdateCommand?

09.10.2017, 18:30. Показов 932. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Прошу помочь разобраться с обновлением данных в БД. Вроде все делал как в учебниках и на форумах рекомендуют, однако обновления не происходит.

Это основная форма:
Кликните здесь для просмотра всего текста

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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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 TestBD
{
    public partial class MainForm : Form
    {
        ClassDAL dal = new ClassDAL();
        DataSet dsMain;
 
        public MainForm()
        {
            InitializeComponent();
            
        }
 
        private void FillDataSet()
        {
            dsMain = dal.GetFillDataSet();
            dsMain = dal.GetFillRelation(dsMain);
        }
 
        private void FillDataGridView()
        {
            BindingSource bsObject = new BindingSource(dsMain,"TObject");
            BindingSource bsFeeder = new BindingSource(bsObject, "ObjFeed");
            dgvObject.DataSource = bsObject;
            dgvFeeder.DataSource = bsFeeder;
 
        }
 
        private void butAdd_Click(object sender, EventArgs e)
        {
            AddForm addForm = new AddForm();
            if (addForm.ShowDialog() != DialogResult.OK)
                MessageBox.Show("Объект не создан");
            DataRow newDRObject = dsMain.Tables["TObject"].NewRow();
            try
            {
                newDRObject["idObject"] = addForm.newIdObject;
                newDRObject["NameObject"] = addForm.newNameObject;
                dsMain.Tables["TObject"].Rows.Add(newDRObject);
                
                DataRow newDRFeeder = dsMain.Tables["TFeeder"].NewRow();
                newDRFeeder["idFeeder"] = addForm.newIDFeeder;
                newDRFeeder["NameFeeder"] = addForm.newNameFeeder;
                newDRFeeder["idObject"]=-1;
                dsMain.Tables["TFeeder"].Rows.Add(newDRFeeder);
 
                dal.SaveObject(dsMain);
                //dgvObject.Rows[dgvObject.RowCount-1].Selected = true; // - это я хотел типа фокус на вставленную строку получить
                                
            }
            catch
            {
                MessageBox.Show("Что то тут не так!");
                return;
            }
        }
 
        private void MainForm_Load(object sender, EventArgs e)
        {
            FillDataSet();//заполняем датасет приложения данными из БД
            
            FillDataGridView();// заполняем таблицы на форме
        }
 
        private void butDelFeeder_Click(object sender, EventArgs e)
        {
            MessageBox.Show("номер строки присоединения "+dgvFeeder.SelectedRows.Count.ToString());
            
            if (dgvFeeder.Rows.Count==0)// проверяем есть ли строки в гриде Присоединения
            {
                MessageBox.Show("Присоединения и так нету!!!!");
                return;
            }
            try
            {
            
                MessageBox.Show("номер присоединения "+dgvFeeder.CurrentRow.Cells["idFeeder"].Value.ToString());
                string idf = dgvFeeder.CurrentRow.Cells["idFeeder"].Value.ToString();
            
                dgvFeeder.Rows.Remove(dgvFeeder.CurrentRow);//чтобы сработало, надо сперва строку удалить из грида
                dal.DelFeeder(dsMain, idf);
            }
            catch
            {
                MessageBox.Show("Удаление не удачно");
            }
        }
 
        private void butDelObject_Click(object sender, EventArgs e)
        {
            string ido = dgvObject.CurrentRow.Cells["idObject"].Value.ToString();
            try
            {
                dgvObject.Rows.Remove(dgvObject.CurrentRow);
                dal.DelObject(dsMain, ido);
            }
            catch
            {
                MessageBox.Show("Объект не удален!");
            }
        }
 
        public void butEditAll_Click(object sender, EventArgs e)
        {
            string ido = dgvObject.CurrentRow.Cells["idObject"].Value.ToString();
            string NameObject = dgvObject.CurrentRow.Cells["NameObject"].Value.ToString();
            string idf = dgvFeeder.CurrentRow.Cells["idFeeder"].Value.ToString();
            string NameFeeder = dgvFeeder.CurrentRow.Cells["NameFeeder"].Value.ToString();
 
            try
            {
                EditForm eForm = new EditForm(NameObject, NameFeeder);
                                
                if (eForm.ShowDialog() != DialogResult.OK)
                {
                    MessageBox.Show("не отредактировали");
                }
                string NewNameObject = eForm.EditNameObject;
                //dgvObject.CurrentRow.Cells["NameObject"].Value = NameObject;
                dal.EditObject(dsMain,ido,NewNameObject);
            }
            catch 
            {
                
                MessageBox.Show("Редактирование не получилось");
            }
        }
 
    }
}

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

это класс для работы с данными, в котором и прописаны команды добавления, удаления и изменения:
Кликните здесь для просмотра всего текста
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//подключаемые модули
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
 
namespace TestBD
{
    class ClassDAL
    {
        SqlConnection con;
        SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();
        DataSet dsDAL;
        SqlDataAdapter daObject, daFeeder;
        //SqlCommandBuilder scbObject, scbFeeder;
        string sqlSelectObject = "SELECT * FROM TabObject";
        string sqlSelectFeeder = "SELECT * FROM TabFeeder";
        string sqlInsertObject = "INSERT INTO TabObject (NameObject) VALUES (@NameObj); SELECT @idObject = SCOPE_IDENTITY()";
        string sqlInsertFeeder = "INSERT INTO TabFeeder (idObject, NameFeeder) VALUES (@idObject, @NameFeeder)";
        string sqlDeleteObject = "DELETE FROM TabFeeder WHERE idObject=@idObject; DELETE FROM TabObject WHERE idObject=@idObject";
        string sqlDeleteFeeder = "DELETE FROM TabFeeder WHERE idFeeder=@idFeeder";
        string sqlEditObject = "UPDATE TabObject SET NameObject=@NewNameObject WHERE idObject=@idObject";//idObject=@idNewObject, - это же не надо менять!!!
        string sqlEditFeeder = "UPDATE TabFeeder SET NameFeeder=@NewNameFeeder WHERE idFeeder=@idFeeder";//idFeeder=@idNewFeeder, idObject=@idNewObject, - и это не трогаем!
 
        string connectStr;
        SqlParameterCollection pc;
        SqlParameter p;
 
 
        public ClassDAL()
        {
            scsb.DataSource = @".\sqlexpress";
            scsb.InitialCatalog="TestBD";
            scsb.IntegratedSecurity=true;
            connectStr= scsb.ConnectionString;//создаем строку подключения
            con = new SqlConnection(connectStr);//создаем подключение
            
            dsDAL = new DataSet();//создаем датасет
            
            daObject = new SqlDataAdapter(sqlSelectObject,connectStr);//создаем адаптеры для таблиц
            daFeeder = new SqlDataAdapter(sqlSelectFeeder,connectStr);
 
            daObject.InsertCommand = new SqlCommand(sqlInsertObject,con);//создаем команду для вставки в таблицу Объекты
            pc = daObject.InsertCommand.Parameters;//задаем параметры для SQL запроса вставки
            pc.Add("@idObject", SqlDbType.Int, 0, "idObject").Direction = ParameterDirection.Output;
            pc.Add("@NameObj",SqlDbType.NVarChar,0,"NameObject");
                        
            daFeeder.InsertCommand = new SqlCommand(sqlInsertFeeder,con);//теперь создаем команду для вставки в таблицу Фидера
            //и задаем параметры для SQL запроса вставки в таблицу Фидер
            pc = daFeeder.InsertCommand.Parameters;
            pc.Add("@idObject", SqlDbType.Int, 0, "idObject");
            pc.Add("@NameFeeder", SqlDbType.NVarChar, 0, "NameFeeder");
                        
            daObject.DeleteCommand = new SqlCommand(sqlDeleteObject, con);
            pc = daObject.DeleteCommand.Parameters;
            p = pc.Add("@idObject", SqlDbType.Int, 0, "idObject");
            p.SourceVersion = DataRowVersion.Original;
 
            daFeeder.DeleteCommand = new SqlCommand(sqlDeleteFeeder, con);
            pc = daFeeder.DeleteCommand.Parameters;
            p = pc.Add("@idFeeder", SqlDbType.Int, 0, "idFeeder");
            p.SourceVersion = DataRowVersion.Original;
 
            daObject.UpdateCommand = new SqlCommand(sqlEditObject, con);
            //pc.Add("@idNewObject", SqlDbType.Int, 0, "idObject");
            pc = daObject.UpdateCommand.Parameters;
            pc.Add("@NewNameObject", SqlDbType.NVarChar, 0, "NameObject");
            p = pc.Add("@idObject", SqlDbType.Int, 0, "idObject");
            p.SourceVersion = DataRowVersion.Original;
            
 
            daFeeder.UpdateCommand = new SqlCommand(sqlEditFeeder, con);
            //pc.Add("@idNewFeeder", SqlDbType.Int, 0, "idFeeder");
            //pc.Add("@idNewObject", SqlDbType.Int, 0, "idObject");
            pc = daFeeder.UpdateCommand.Parameters;
            pc.Add("@NewNameFeeder", SqlDbType.NVarChar, 0, "NameFeeder");
            p = pc.Add("@idFeeder", SqlDbType.Int, 0, "idFeeder");
            p.SourceVersion = DataRowVersion.Original;
 
        }
 
        public DataSet GetFillDataSet()//заполняем и возвращаем датасет со всеми связями
        {
            daObject.Fill(dsDAL,"TObject");
            daFeeder.Fill(dsDAL,"TFeeder");
 
            
 
            return dsDAL;
        }
 
        public DataSet GetFillRelation(DataSet dsDAL)
        {
            DataRelation drObjFeed = new DataRelation("ObjFeed", dsDAL.Tables["TObject"].Columns["idObject"], dsDAL.Tables["TFeeder"].Columns["idObject"]);
            dsDAL.Relations.Add(drObjFeed);
            return dsDAL;
        }
 
        public DataSet SaveObject(DataSet newDS)
        {
            daObject.Update(newDS.Tables["TObject"]);
                        
            MessageBox.Show(daObject.InsertCommand.Parameters["@idObject"].Value.ToString());
            
            daFeeder.Update(newDS.Tables["TFeeder"]);
 
            newDS.Clear();
            GetFillDataSet();
 
            return newDS;
        }
 
        public DataSet DelFeeder(DataSet delDS, string delID)
        {
            daFeeder.DeleteCommand.Parameters["@idFeeder"].Value = Convert.ToInt32(delID);
            
            
            daFeeder.Update(delDS.Tables["TFeeder"]);
            delDS.Clear();
            GetFillDataSet();
            return delDS;
        }
 
        public DataSet DelObject(DataSet delDS, string delID)
        {
            daObject.DeleteCommand.Parameters["@idObject"].Value = Convert.ToInt32(delID);
            //daFeeder.Update(delDS.Tables["TFeeder"]);
            daObject.Update(delDS.Tables["TObject"]);
            
            delDS.Clear();
            GetFillDataSet();
            return delDS;
        }
 
        public DataSet EditObject(DataSet EditDS, string EditID, string NewNameObject)
        {
            daObject.UpdateCommand.Parameters["@idObject"].Value = Convert.ToInt32(EditID);
            daObject.UpdateCommand.Parameters["@NewNameObject"].Value = NewNameObject;
            
            daObject.Update(EditDS.Tables["TObject"]);
            EditDS.Clear();
            GetFillDataSet();
            return EditDS;
        }
 
    }
}
Вложения
Тип файла: rar TestBD(v1).rar (87.1 Кб, 5 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.10.2017, 18:30
Ответы с готовыми решениями:

Что не так с кодом? ( пытаюсь понять, что не так? )
Есть исходный код. Hook, работает хорошо, но есть минус огромный - перестаёт писать в лог, при открытии программы\игры Фуллскрином. т.е...

И так, что не так с моим запросом на добавление записи в таблицу?
$sql = 'INSERT INTO product ' . '(name, code, price, category_id, brand, availability,' . 'description,...

Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее?
Вот код: #include <iostream> #include <conio.h> using namespace std; int main(){ float a,c; char b; skip: ...

9
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
09.10.2017, 22:37
Попробуй поменять 72 и 81 строку.
Поставь Modified.
Чувство такое, что пытаешься проапдейтится строками, которые были до изменения, и получаешь нулевой результат.
0
0 / 3 / 0
Регистрация: 15.11.2016
Сообщений: 20
10.10.2017, 07:13  [ТС]
hoolygan, строки 72 и 81 описаны в учебниках и на форумах, т.е. по идее должны работать. И можно по подробней - куда поставить Modified?
В параметры запроса на обновления новые значения передаются, но до базы и обратно почему то не доходят
0
10.10.2017, 07:36

Не по теме:

MasterStraga, в учебниках встречаются ошибки, их же люди пишут. На форумах они гарантированное есть. Смотрите на эти примеры критически.

0
0 / 3 / 0
Регистрация: 15.11.2016
Сообщений: 20
10.10.2017, 07:50  [ТС]
Если бы такая запись мне попалась единожды, то я искал бы еще способы обработки данного события. Но даже на https://msdn.microsoft.com/ru-... .110).aspx прописано так же
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
10.10.2017, 09:47
Может быть, я просто никогда этим не пользовался, таким параметром, как версия строки для обновления, ну да ладно.
Тогда давайте смотреть на вот эту строку
C#
1
pc.Add("@NewNameFeeder", SqlDbType.NVarChar, 0, "NameFeeder");
Вы точно уверены в 3-ем параметре метода?
Если у Вас тип поля nVarChar([его длина]) - то что именно должно произойти при таком методе? - и какой текст запишется в этот параметр?
Я к чему - я не проверял работу конкретно Вашей программы - пытаюсь по тексту понять, что может быть не так.
0
0 / 3 / 0
Регистрация: 15.11.2016
Сообщений: 20
10.10.2017, 10:31  [ТС]
hoolygan, да, я уверен в 3-ем параметре. При значении "0" размер не имеет значения (по крайней мере я так понял). В других случаях использования данных параметров по крайней мере работает.

база данных у меня состоит из 2-х таблиц
1-TabObject (idObject, NameObject)
2-TabFeeder(idFeeder, idObject, NameFeeder)
связь идет по idObject.
свой проект я приложил в первом посте. Может попробуешь его запустить и проверить? (VS2008)

Добавлено через 7 минут
и еще вопрос - для удаления записи из БД, чтобы DeleteCommand срабатывала как надо мне сперва приходилось данные записи удалить из DataGrid. Хотя по логике вещей запись я удаляю в DataAdapterе и передаю его уже измененный в базу. Делаю обновление и заново делаю выборку. Однако удаления не происходило, пока запись физически было в DataGrid'e. Возможно у меня где то более глобальная ошибка или я не правильно использую DataAdapter и SqlCommand?
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
10.10.2017, 11:15
Ну расскажу как делал я.
Есть датасет.
Адаптером загружаю в этот датасет, со всеми там связями, внешними ключами, правилами при удалении внешних ключей.
т.е. простой командой
C#
1
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
После этого описывал простой набор команд для адаптера.
И работал только с таблицей. т.е. команды грида НЕ использовал, только методы у таблицы. Гриду вообще по-барабану, что там с ним делают - он отображает, ничего более, с грида я единственное, что получал - это номер строки для своих действий.
т.е. для CRUD я передавал таблицы, а не адаптер.
0
0 / 3 / 0
Регистрация: 15.11.2016
Сообщений: 20
10.10.2017, 11:22  [ТС]
так вроде и я так же делаю. Из грида только номер строки и значение соответствующего ключевого поля брал, а все остальные операции делал в адаптере. Возможно все таки где то не так делал. если не идет ничего
0
0 / 3 / 0
Регистрация: 15.11.2016
Сообщений: 20
12.10.2017, 09:30  [ТС]
Видимо никто не может решить эту задачу...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2017, 09:30
Помогаю со студенческими работами здесь

Что в коде ни так? while не работает так, как ожидаю
Написанный код, как я думаю, должен выдавать цифры от 0 до 1000, столбиком. Но выдает начиная от 702 до 1000. Что ни так понимаю, где...

сегодня так можно сказать праздник так что...
простите меня за все пожалуйста!!!

Что не так, почему так происходит?
Вот bat файл @echo off for /f %%A in ('wmic path Win32_NetworkAdapter where "PNPDeviceID like '%%VID_22C3&PID_55FF%%'" get Index...

UpdateCommand
Делал все по этому гайду. http://www.youtube.com/watch?v=1EpYqtSlOr8 Все получилось, кроме Апдейта. Автор вообще в коде ничего не...

UpdateCommand
что здесь не так? никакую ошибку не показывает и ничего не происходит (переменные не пустые - проверял) SqlCommand postname = new...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru