Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/30: Рейтинг темы: голосов - 30, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 25.09.2021
Сообщений: 21

Проблема вставки/удаления/редактирования данных в подчиненную таблицу

26.09.2021, 00:34. Показов 6609. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу тестовую программу на C# (VisualStudio 2019 Enterprise) для работы с базой Access. Связи с двумя таблицами сделаны на уровне МАСТЕРА при работе с компонентами, то есть без личного написания кода. А вот вставку, редактирование, удаление пишу самостоятельно. Прошу обратить внимание на комментарий в исходнике - "// Работает НЕПРАВИЛЬНО!!!!!!!!!!!!!! Надо исправить. " Если можно и несложно, помогите мне исправить ошибки, не переделывая глобально весь проект. Я по шагам потом себе усложняю все задачи и переделаю код в лучший вариант для серьезных проектов. Что сейчас это для самостоятельного разбора и изучения в программирования баз данных на C#. Другие недостатки такие как повторение строк подключения в разных местах - это можно позже исправить и сократить код. Буду благодарен, если реализуете удаление и обновление(редактирование). Я понял, что в случае в связанных с несколькими таблицами мне не реализовать. Нашел в инете гору примеров, но там имена таблиц, полей, и прочее очень схожие, например, имя таблицы и имя поля совпадают или похожи... В результате я не смог воспользоваться их примерами. Очень неудачные примеры. В моем примере все имена отличаются.... Хотя бы даст толчок, чтобы прояснить что и с чем соединять....

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
using System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
 
namespace ExampleDB4
{
    public partial class Form1 : Form
    {
        private OleDbConnection con;
        private OleDbCommand cmd;
        private OleDbDataAdapter da;
        private DataSet ds;
 
        public Form1()
        {
            InitializeComponent();
        }
        //---------------------------------------------------------------------
        private void UpdateDataObject() // Работает ПРАВИЛЬНО.
        {
            con = new OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source =C:\Users\LEGION\source\repos\ExampleDB4\ExampleDB4\Example100.accdb");
            da = new OleDbDataAdapter("SELECT * FROM MyTable1", con);
            ds = new DataSet();
            con.Open();
            da.Fill(ds, "MyTable1");
            dataGridView1.DataSource = ds.Tables["MyTable1"];
            con.Close();
 
        }
        //---------------------------------------------------------------------
        private void UpdateDataClass() // Работает НЕПРАВИЛЬНО!!!!!!!!!!!!!! Надо исправить.
        {                               // Это обновление данных подчиненной таблицы 2
            con = new OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source =C:\Users\LEGION\source\repos\ExampleDB4\ExampleDB4\Example100.accdb");
            //da = new OleDbDataAdapter("SELECT * FROM MyTable2", con); // Не работает
            da = new OleDbDataAdapter("SELECT * FROM MyTable2 where MyObject=(Select MyObject From MyTable1)", con); // тоже не работает, из за нее ниже ошибка появляется
            ds = new DataSet();
            con.Open();
            da.Fill(ds, "MyTable2");
            dataGridView1.DataSource = ds.Tables["MyTable2"];
            con.Close();
        }
        //---------------------------------------------------------------------
        private void Form1_Load(object sender, EventArgs e) // Работает ПРАВИЛЬНО. Сформировано автоматически, кроме 2 последних строк.
        {
            // TODO: данная строка кода позволяет загрузить данные в таблицу "example100DataSet.MyTable2". При необходимости она может быть перемещена или удалена.
            this.myTable2TableAdapter.Fill(this.example100DataSet.MyTable2);
            // TODO: данная строка кода позволяет загрузить данные в таблицу "example100DataSet.MyTable1". При необходимости она может быть перемещена или удалена.
            this.myTable1TableAdapter.Fill(this.example100DataSet.MyTable1);
 
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        }
        //---------------------------------------------------------------------
        private void Button1_Click(object sender, EventArgs e)  // Работает ПРАВИЛЬНО.
        {
            string query = "Insert into MyTable1(MyObject) values (@mObj)";
            try
            {
                con = new OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source =C:\Users\LEGION\source\repos\ExampleDB4\ExampleDB4\Example100.accdb");
                cmd = new OleDbCommand(query, con);
                cmd.Parameters.AddWithValue("@mObj", textBox1.Text);
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (Exception Err)
            {
                MessageBox.Show(Err.Message);
            }
 
            UpdateDataObject();
        }
        //---------------------------------------------------------------------
        private void Button2_Click(object sender, EventArgs e)  // Работает НЕПРАВИЛЬНО!!!!!!!!!!!!!! Надо исправить.
        {
            string query = "Insert into MyTable2(MyClass) SELECT @mObj FROM MyTable1(MyObject) values (@mObj, mClass)"; // Основная ОШИБКА!!!!!!!!!!!
            try
            {
                con = new OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source =C:\Users\LEGION\source\repos\ExampleDB4\ExampleDB4\Example100.accdb");
                cmd = new OleDbCommand(query, con);
                cmd.Parameters.AddWithValue("@mObj", dataGridView1.CurrentCell.Value.ToString()); //???????
                cmd.Parameters.AddWithValue("@mClass", textBox2.Text);                            //???????
 
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (Exception Err)
            {
                MessageBox.Show(Err.Message);
            }
 
            //UpdateDataClass();    // Эту функцию надо тоже исправить!!!!!!
        }
 
        private void DataGridView1_Click(object sender, EventArgs e)  // Работает ПРАВИЛЬНО.
        {
            //---------------
            try
            {
                textBox1.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
            }
            catch (Exception Err)
            {
                textBox1.Text = "Error READY!!!!";
                MessageBox.Show(Err.Message);
            }
            //---------------
            try
            {
                textBox2.Text = dataGridView2.CurrentRow.Cells[0].Value.ToString();
            }
            catch (Exception Err)
            {
                textBox2.Text = "Error READY!!!!";
                MessageBox.Show(Err.Message);
            }
            //---------------
            try
            {
                textBox3.Text = dataGridView2.CurrentRow.Cells[1].Value.ToString();
            }
            catch (Exception Err)
            {
                textBox3.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString(); //"Error READY!!!!" - было, изменил на автовставку из 1 таблицы;
                MessageBox.Show(Err.Message);
            }
            //---------------
        }
        //---------------------------------------------------------------------
 
    }
}
Миниатюры
Проблема вставки/удаления/редактирования данных в подчиненную таблицу   Проблема вставки/удаления/редактирования данных в подчиненную таблицу   Проблема вставки/удаления/редактирования данных в подчиненную таблицу  

Вложения
Тип файла: rar ExampleDB4.rar (82.3 Кб, 8 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.09.2021, 00:34
Ответы с готовыми решениями:

Программа с типизированным файлом с режимами создания, сортировки, поиска по ключу, редактирования, вставки, удаления
нужна программа с типизированным файлом с режимами создание,сортировка,поиск по ключу, редактирование, вставка, удаление Я не предлагаю...

Добавление данных в подчиненную таблицу
Есть БД в Acces там созданно 3 таблицы. 1 главная. и 2 подчиненные к ней. связанные по полю Id и связью один-ко-многим. При...

Сортировка данных в подчиненную таблицу
Уважаемые пользователи форума Прошу вашей помощи в разрешении проблемы возникшей при создании БД: Имеются две связанные таблицы,...

40
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
28.09.2021, 21:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Kotik2021 Посмотреть сообщение
ХП как расшифровывается ? Извини за вопрос. Второе - до триггера я еще не дошел. И триггеры как понимаю, они реализовываются на серьезных БД, такие как Oracle, SQL Server, InterBase.... В ACCESS сильно ограничены в возможностях и о сети вообще речи и не должно быть.....))))))))
Хранимые процедуры. Насчет того, что есть в Access из этого... может что и добавили в последнем.
Цитата Сообщение от Kotik2021 Посмотреть сообщение
Здесь, извините, я не понял о чем речь... Правильно ли я понимаю, Вы имели в виду тот мой пример базы с логином и паролем ???? Этот пример совсем несерьезный, если говорить всерьез о защите, а тем более пароли в открытом тексте.... Нужны средства шифрования.... Но тем не менее, объясните Ваш вариант, реализации....
Пример не важно какой. Смысл в том, где сравнивать строки на ту же уникальность.
Можно средствами БД: дополнительный столбец , где приведено к одному регистру и ограничение UNIQUE
и использованием ХП, которые будут при вставке приводить к тому же регистру наш параметр, и потом INSERTить его, а так как значение в столбце должно быть уникально, то вставки не произойдет. Ниже псевдокод (смесь всего подряд))), главное мысль
Code
1
2
3
4
5
6
7
procedure ХранимаяПроцедура(@name)
{
   INSERT INTO Products (Name, NormalizedName) VALUES (@name, @name.ToUpper())
}
//Вызываем нашу процедуру
ХранимаяПроцедура(Samsung) // успешно выполниться
ХранимаяПроцедура(SAmsUng) // ошибка, данные не добавятся, т.к. уже добавлен Samsung
Либо сравнивать непосредственно в коде на C#, как в примере выше. При условии, что у нас "на руках" то, что собрались сравнивать.
0
1 / 1 / 0
Регистрация: 25.09.2021
Сообщений: 21
28.09.2021, 21:51  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Нормальные программы не дадут "дураку" внести в базу белиберду, т.к. они используют валидацию. Например, названия должны быть строки на кириллице и каждое слово названия должно иметь только одну заглавную букву. Для маркировок (наборы литер и цифр) используются отдельные поля.
Почитайте про регулярные выражения.
Спасибо. В курсе. Просто реализуется цепочка функций проверок разных случаев ввода пользователями....)))))
0
1 / 1 / 0
Регистрация: 25.09.2021
Сообщений: 21
03.10.2021, 22:17  [ТС]
Взял за основу Вашу библиотеку.... Имя DbWork изменил на MyAccess. Проект реализовал с нуля (новая форма и так далее)... В данный момент не получилось.... На форму бросил 2 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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace ExampleDB5
{
    public partial class Form1 : Form
    {
        private DataSet dataSet;
        private MyAccess dbA;
 
        class Filter
        {
            public object MyObject;
            public Filter(object MyObject)
            {
                MyObject = MyObject;
            }
            public override string ToString()
            {
                return (string)MyObject;
            }
        }
        public Form1()
        {
            InitializeComponent();
            dataSet = new DataSet();
            dbA = new MyAccess(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\Users\LEGION\source\repos\ExampleDB5\ExampleDB5\Example100.accdb");
            FillTables();
        }
 
        private void FillTables()
        {
            dataSet.Tables["MyTable1"]?.Clear();
            dbA.SelectCommandText = "SELECT * FROM 'MyTable1'";
            dbA.Fill(dataSet, "MyTable1");      // Здесь возникла ошибка......
 
            dataGridView1.DataSource = dataSet.Tables["MyTable1"]; // Это еще под вопросом.... 
                               // сперва одну таблицу, потом вторую со связями и так далее
                               // по частям
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            
 
        }
    }
}
Если можно, Вас попросить (фрагмент кода из Вашего проекта) раскрыть в виде реализации на уровне кода, а не на уровне манипуляций с компонентами....

C#
1
2
3
dataGridViewProducts.DataSource = dataSet.Tables["Products"];      // как реализовать "dataGridViewProducts"
dataGridViewGroups.DataSource = dataSet.Tables["Groups"];          // как реализовать "dataGridViewGroups"
                                                                   // на уровне кода
Миниатюры
Проблема вставки/удаления/редактирования данных в подчиненную таблицу   Проблема вставки/удаления/редактирования данных в подчиненную таблицу  
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
03.10.2021, 22:24
Цитата Сообщение от Kotik2021 Посмотреть сообщение
раскрыть в виде реализации на уровне кода, а не на уровне манипуляций с компонентами....
Я не понимаю что это значит.

Тут просто устанавливается источник данных для гридов, а именно конкретные таблицы из dataset
C#
1
2
dataGridViewProducts.DataSource = dataSet.Tables["Products"];
dataGridViewGroups.DataSource = dataSet.Tables["Groups"];
Цитата Сообщение от Kotik2021 Посмотреть сообщение
Самое смешное и противное, что я не знаю куда смотреть, где ошибка или почему возникла....
Как минимум читать название ошибки, и искать, что она значит.
0
1 / 1 / 0
Регистрация: 25.09.2021
Сообщений: 21
03.10.2021, 22:24  [ТС]
Цитата Сообщение от Kotik2021 Посмотреть сообщение
Если можно, Вас попросить (фрагмент кода из Вашего проекта) раскрыть в виде реализации на уровне кода, а не на уровне манипуляций с компонентами....
Зачем я попросил об этом.... Дело в том, что реально серьезный проект у меня состоит более 6 таблиц и все со связями.... Когда я переделываю, то на пользовательском уровне (манипуляции с компонентами) не всегда удается создать правильную связь.... У меня тяжело это дается... И думаю, что если разобраться с кодом, то может быть это проще????
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
03.10.2021, 22:33
Kotik2021, связь чего с чем? Типо при выборе в комбобоксе группы "Принтеры" показываются в таблице только принтеры, хотя в продуктах кроме id группы нет ничего?
0
1 / 1 / 0
Регистрация: 25.09.2021
Сообщений: 21
03.10.2021, 22:36  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Я не понимаю что это значит.
Ниже скриншот прикладываю.... Что обведено в рамочку красную.... Многое из того появилось в результате программирования событий на компонентах не на уровне кода, а автоматом как шаблоны дописываются.... Я может быть не совсем грамотно выразился.... Куда более понятнее, если совсем не пользоваться "мастером" создания чего-то, то можно это же все руками реализовать на уровне кода....

Добавлено через 2 минуты
Цитата Сообщение от ipsorokin Посмотреть сообщение
Kotik2021, связь чего с чем? Типо при выборе в комбобоксе группы "Принтеры" показываются в таблице только принтеры, хотя в продуктах кроме id группы нет ничего?
Вы делаете выводы на основе своего проекта, а я делаю свой пропект.... И "Продукты" в моем проекте НЕТ. Увы, мы говорим на разных языках....
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
03.10.2021, 22:37
Цитата Сообщение от Kotik2021 Посмотреть сообщение
"SELECT * FROM 'MyTable1'"
По поводу ошибки. Не обратил внимание на скриншоты.Там написано же, что синтаксическая ошибка - значит .. смотрим на свой запрос и видим название таблицы '. Вот и ответ
0
1 / 1 / 0
Регистрация: 25.09.2021
Сообщений: 21
03.10.2021, 22:38  [ТС]
и ID вообще нет.

Добавлено через 1 минуту
Моя таблица так и называется "MyTable1"... Это было нарочно задано, чтобы потом не путаться с именами полей....
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
03.10.2021, 22:39
Цитата Сообщение от Kotik2021 Посмотреть сообщение
Вы делаете выводы на основе своего проекта, а я делаю свой пропект
Конкретно ваш проект из этой темы ничем не отличается от моего, абсолютно, только более понятными названиями таблиц и очевидной связью между ними. Поэтому будь то принтеры или объект сути это не меняет
0
1 / 1 / 0
Регистрация: 25.09.2021
Сообщений: 21
03.10.2021, 22:40  [ТС]
В MyTable1 есть одно поле ключевое myObject.
0
1 / 1 / 0
Регистрация: 25.09.2021
Сообщений: 21
03.10.2021, 22:41  [ТС]
Цитата Сообщение от Kotik2021 Посмотреть сообщение
Ниже скриншот прикладываю.... Что обведено в рамочку красную.... Многое из того появилось в результате программирования событий на компонентах не на уровне кода, а автоматом как шаблоны дописываются.... Я может быть не совсем грамотно выразился.... Куда более понятнее, если совсем не пользоваться "мастером" создания чего-то, то можно это же все руками реализовать на уровне кода....
Забыл положить вложение...
Миниатюры
Проблема вставки/удаления/редактирования данных в подчиненную таблицу  
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
03.10.2021, 22:45
Цитата Сообщение от Kotik2021 Посмотреть сообщение
В MyTable1 есть одно поле ключевое myObject.
Ну если уперлись делать так и сделали его ключевым, что мешает удалить/не использовать id? Значит этот myObject и есть Id, и должен быть уникальным в рамках этой таблицы.

Добавлено через 1 минуту
Я правда не понимаю, что я должен пояснить еще
0
1 / 1 / 0
Регистрация: 25.09.2021
Сообщений: 21
03.10.2021, 23:09  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
По поводу ошибки. Не обратил внимание на скриншоты.Там написано же, что синтаксическая ошибка - значит .. смотрим на свой запрос и видим название таблицы '. Вот и ответ
Спасибо большое. Это была моя ошибка, что дал в одинарные кавычки название таблицы.... Иду дальше.... Спасибо большое. Вначале я не врубился из-за чего ошибка и не понял Вашего комментария.... Все ясно теперь.

Добавлено через 15 минут
Цитата Сообщение от ipsorokin Посмотреть сообщение
Тут просто устанавливается источник данных для гридов, а именно конкретные таблицы из dataset
C#Выделить код
dataGridViewProducts.DataSource = dataSet.Tables["Products"];
dataGridViewGroups.DataSource = dataSet.Tables["Groups"];
Как я понимаю тогда можно написать:

C#
1
2
dataGridView1.DataSource = dataSet.Tables["Tables1"];
dataGridView2.DataSource = dataSet.Tables["Tables2"];
Но это НЕ работает!!!!!
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
03.10.2021, 23:23
Цитата Сообщение от Kotik2021 Посмотреть сообщение
Как я понимаю тогда можно написать:
Сначала заполняем датасет. .Fill(DataSet ds, string tableName)
C#
1
2
3
4
// Тут у адаптера SelectCommand из Tables1    select * from tables1
adapter.Fill(dataset, "Tables1")
// Тут у адаптера SelectCommand из Tables2    select * from tables2
adapter.Fill(dataSet, "Tables2")
А потом уже через индексатор можно присвоить
C#
1
2
dataGridView1.DataSource = dataSet.Tables["Tables1"];
dataGridView2.DataSource = dataSet.Tables["Tables2"];
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,752
05.10.2021, 05:27
Уже вторая страница заканчивается... Может стоит уже прекратить сношаться с устаревшим двадцать лет назад механизмом DataSet'ов, создать нужные классы, описывающие результаты выборок, и руками их прочитать из DataReader'а в коллекцию нужного типа? Тот же DataGridView прекрасно умеет строить гриды по List<T>.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
05.10.2021, 08:59
Ok
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
        public List<MyTable1> GetTable1()
        {
            var tmp = new List<MyTable1>();
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                OleDbCommand command = new OleDbCommand("SELECT * FROM MyTable1", connection);
                connection.Open();
                var reader = command.ExecuteReader();
                if (reader.HasRows)
                    while (reader.Read())
                        tmp.Add(new MyTable1()
                        {
                            MyObject = Convert.ToString(reader["MyObject"])
                        });
                connection.Close();
            }
            return tmp;
        }
 
        public List<MyTable2> GetTable2()
        {
            var tmp = new List<MyTable2>();
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                OleDbCommand command = new OleDbCommand("SELECT * FROM MyTable2", connection);
                connection.Open();
                var reader = command.ExecuteReader();
                if (reader.HasRows)
                    while (reader.Read())
                        tmp.Add(new MyTable2()
                        {
                            MyObject = Convert.ToString(reader["MyObject"]),
                            MyClass = Convert.ToString(reader["MyClass"])
                        });
                connection.Close();
            }
            return tmp;
        }
0
 Аватар для Andrey-MSK
3381 / 2267 / 388
Регистрация: 14.08.2018
Сообщений: 7,683
Записей в блоге: 4
11.10.2021, 11:02
ipsorokin, кто вас так научил ридером пользоваться? Или если пишете для примера кратко, то уж делайте это правильно...

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
public static List<LaborHBWork> GetWorksByTypeID(int typeID)
{
    List<LaborHBWork> laborHBWorks = new List<LaborHBWork>();
    string sqlText =
        "SELECT ID_LaborHB_02, ID_LaborHB_01, PosNum, NameOfWork, WorkCode, Labor, LaborAssembly, ErectCoeff " +
        "FROM dbo.tblLaborHB_02 " +
        "WHERE ID_LaborHB_01 = @id";
 
    using (SqlConnection connection = new SqlConnection(_connectionString))
    {
        try
        {
            connection.Open();
 
            SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
            {
                CommandType = CommandType.Text
            };
            SqlParameter pID = new SqlParameter
            {
                ParameterName = "@id",
                Value = typeID,
                SqlDbType = SqlDbType.Int,
                Direction = ParameterDirection.Input
            };
            sqlCommand.Parameters.Add(pID);
 
            using (SqlDataReader dataReader = sqlCommand.ExecuteReader())
            {
                while (dataReader.Read())
                {
                    laborHBWorks.Add(new LaborHBWork
                    {
                        IDLaborHBWork = (int)dataReader["ID_LaborHB_02"],
                        IDLaborHBType = (int)dataReader["ID_LaborHB_01"],
                        PosNum = (int)dataReader["PosNum"],
                        NameOfWork = dataReader["NameOfWork"] as string ?? "", // проверка на NULL
                        WorkCode = dataReader["WorkCode"] as string ?? "", // проверка на NULL
                        Labor = (decimal)dataReader["Labor"],
                        LaborAssembly = dataReader["LaborAssembly"]
                            == DBNull.Value ? null : (decimal?)dataReader["LaborAssembly"], // проверка на NULL
                        ErectCoeff = (decimal)dataReader["ErectCoeff"]
                    });
                }
            }
 
            return laborHBWorks;
        }
        catch (Exception ex)
        {
            throw new ApplicationException("Ошибка выборки данных", ex);
        }
    }
}
1
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
11.10.2021, 11:10
Andrey-MSK, я им не пользуюсь))
Отличия заметил только в использовании using.
Как приводить к типу - не столь принципиально.
А вот тут dataReader["WorkCode"] as string ?? "", я даже не знаю... Вроде бы значение NULL не будет выводиться как "NULL", а будет "", смысл проверки?
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,752
11.10.2021, 11:12
C#
1
dataReader["NameOfWork"] as string ?? "",
Странная проверка) Нужно проверять на DbNull.Value.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.10.2021, 11:12

Автоматическое добавление данных в подчиненную таблицу
Приветствую Есть такая проблема Есть две формы, главная и подчиненная В главной форме в поле Данные1 вносятся некие данные,...

Внесение данных из списка в подчиненную таблицу
Доброго дня профессионалам ! Подскажите как внести данные с формы на которой находится список, в подчиненную форму - таблицу...

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

Создание базы данных с функциями ввода, вывода, редактирования, удаления или добавления данных
Задание заключается в создании базы данных с функциями ввода, вывода, редактирования, удаления или добавления данных. Написал программу и...

Пример добавления, удаления и редактирования данных в БД *.mbd
нужен пример добавления, удаления и редактирования данных в БД *.mbd через классы OleDbDataAdapter, OleDbConnection, DataSet. ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru