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

Не обновляется БД при добавлении записи

19.03.2012, 13:32. Просмотров 2024. Ответов 27
Метки нет (Все метки)

Вот код добавления:

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
            try
            {               
                string commandString = @"Insert into dbo.Должности 
                                        Values(@id, 
                                        @name,
                                        @kol_m,
                                        @kol_z_m,
                                        @kol_s_m,
                                        @okl
                                        )";
                conn.Open();
                SqlCommand sqlInsert = new SqlCommand(commandString, conn);
 
                SqlParameter param1 = new SqlParameter(); //объявляем объект класса SqlParameter
                param1.ParameterName = "@id";             //задаем имя параметра
                switch (comboBoxPod.SelectedIndex)       //задаем значение параметра
                {
                    case 0: param1.Value = 8;
                        break;
                    case 1: param1.Value = 5;
                        break;
                    case 2: param1.Value = 14;
                        break;
                    case 3: param1.Value = 6;
                        break;
                    case 4: param1.Value = 4;
                        break;
                    case 5: param1.Value = 1;
                        break;
                    case 6: param1.Value = 3;
                        break;
                    case 7: param1.Value = 10;
                        break;
                    case 8: param1.Value = 12;
                        break;
                    case 9: param1.Value = 13;
                        break;
                    case 10: param1.Value = 7;
                        break;
                    case 11: param1.Value = 9;
                        break;
                    case 12: param1.Value = 11;
                        break;
                    case 13: param1.Value = 2;
                        break;
                }
                param1.SqlDbType = SqlDbType.Int;                //задаем тип параметра
                sqlInsert.Parameters.Add(param1);                //передаем параметр объекту класса SqlCommand
 
                SqlParameter param2 = new SqlParameter();
                param2 = new SqlParameter();
                param2.ParameterName = "@name";
                param2.Value = TBname_dol.Text;
                param2.SqlDbType = SqlDbType.Text;
                sqlInsert.Parameters.Add(param2);
 
                SqlParameter param3 = new SqlParameter();
                param3 = new SqlParameter();
                param3.ParameterName = "@kol_m";
                param3.Value = Convert.ToInt32(TBkol_rm.Text);
                param3.SqlDbType = SqlDbType.Int;
                sqlInsert.Parameters.Add(param3);
 
                SqlParameter param4 = new SqlParameter();
                param4 = new SqlParameter();
                param4.ParameterName = "@kol_z_m";
                param4.Value = 0;
                param4.SqlDbType = SqlDbType.Int;
                sqlInsert.Parameters.Add(param4);
 
                SqlParameter param5 = new SqlParameter();
                param5 = new SqlParameter();
                param5.ParameterName = "@kol_s_m";
                param5.Value = Convert.ToInt32(TBkol_rm.Text);
                param5.SqlDbType = SqlDbType.Int;
                sqlInsert.Parameters.Add(param5);
 
                SqlParameter param6 = new SqlParameter();
                param6 = new SqlParameter();
                param6.ParameterName = "@okl";
                param6.Value = Convert.ToInt32(TB_okl.Text);
                param6.SqlDbType = SqlDbType.Int;
                sqlInsert.Parameters.Add(param6);
 
                sqlInsert.ExecuteNonQuery();                        
                
                adapter.InsertCommand = sqlInsert;
 
                adapter.Update(kadDataSet.Tables["Должности"]);
                kadDataSet.AcceptChanges();
                conn.Close();
                
                MessageBox.Show("Новая должность добавлена!");
                  }
            catch (SqlException ex)
            {
                kadDataSet.RejectChanges();
                MessageBox.Show(ex.Message);
                }
Возможно кривой... В dataGrid измнения есть, а вот в БД совсем никак... Помогите исправить ошибку, пожалуйста.

Добавлено через 12 часов 27 минут
Неужели никто не поможет?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2012, 13:32
Ответы с готовыми решениями:

Ошибка при добавлении записи
Метод, который должен был добавить запись в таблицу: string title =...

Ошибка при добавлении записи
Здравствуйте, нужна консультация! Подключил к проекту в C# базу данных, но при...

Ошибка при добавлении новой записи в БД
Программа для редактивания бд в Access на C# Visual Studio 2015. Ошибка при...

Ошибка при добавлении записи в таблицу
Ребят ситуация в следующем, необходимо создать клиент к базе. И вот почти сразу...

Ошибка при добавлении записи в БД MySQL
Здравствуйте, не знаете в чем причина? Ввожу значения в текстбоксы, и при...

27
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
19.03.2012, 13:46 2
ПЕРВОЕ: если Вы хотите добавить только одну строку с формы, то адаптер там совсем не нужен.
Делаете sqlInsert.ExecuteNonQuery(); и одновременно что-то вроде:
C#
1
2
3
4
5
DataRow row = kadDataSet.Tables["Должности"].NewRow;
row[0] = Id;
...
row[n] = ...;
kadDataSet.Tables["Должности"].Rows.Add(row);
ВТОРОЕ. Если хотите обновить данные с таблицы, то надо учитывать, что
adapter.Update Делает
1.Update ТОЛЬКО тех строк, которые были изменены, то есть получили статус RowState.Modified
2. Insert ТОЛЬКО тех строк, которые были изменены, то есть получили статус RowState.NewRow
ТО есть Вы должны напрямую работать с таблицей kadDataSet.Tables["Должности"] чтоб адаптер увидел изменения.
Если вышеуказанные условия выполнены, то в параметре к команде адаптеру надо указывать не Value, а SourceColumn - имя колонки-источника данных(таблицы Вышей)
0
Белая волчица
1 / 1 / 1
Регистрация: 20.02.2010
Сообщений: 65
19.03.2012, 14:15  [ТС] 3
готова признать себя блондинкой.. ничего не получается.
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
19.03.2012, 14:28 4
Ошибку выдает? какую? в какой строке?
если не выдает, то выполните программу пошагово, внимательно смотрите что в каком порядке выполняется. возможно, у Вас ошибка не в коде а в логике вызова команды.
0
Белая волчица
1 / 1 / 1
Регистрация: 20.02.2010
Сообщений: 65
19.03.2012, 14:47  [ТС] 5
лучше бы ошибку выдавало. а так все значения получает, кидает в грид, а в базе нету..
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
19.03.2012, 14:49 6
а в каком месте у Вас добавляются значения в DataGrid'e? я в этом коде такого не заметил!
0
Белая волчица
1 / 1 / 1
Регистрация: 20.02.2010
Сообщений: 65
19.03.2012, 14:57  [ТС] 7
ввод новых данных я осуществляю на отдельной форме, в основной форме при просмотре записей формируются запросы, собственно посредством этих запросов можно обнаружить новую запись.
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
19.03.2012, 15:06 8
1. попробуйте создать в вашей второй форме геттеры для доступа к полям формы.
2. Запускаем вторую форму как диалог
3. при DialogResault.OK в ОСНОВНОЙ форме добавляем строку в таблицу данных (а значения строки нам доступны через геттеры)
4. создаем adapter и adapter.InsertCommand указав SourceColumn вместо Value.
5. и выполняем adapter.Update(table)
Если это не сработает тогда уж не знаю.
0
serg42
118 / 100 / 7
Регистрация: 14.02.2010
Сообщений: 263
19.03.2012, 15:18 9
Цитата Сообщение от Белая волчица Посмотреть сообщение
@"Insert into dbo.Должности Values(@id, @name, @kol_m, @kol_z_m, @kol_s_m, @okl )";
А запрос-то вообще правильный генерится? Насколько я помню SQL, в INSERT указывают имена полей. Типа такого:

SQL
1
INSERT INTO dbo.Должности (id, name, kol_m, kol_z_m, kols_s_m, okl) VALUES(@id, @name, @kol_m, @kol_z_m, @kol_s_m, @okl )
C#
1
kadDataSet.AcceptChanges();
Это лишнее. После вызова DataAdapter.Update(), AcceptChanges() вызывает сам.
0
Белая волчица
1 / 1 / 1
Регистрация: 20.02.2010
Сообщений: 65
19.03.2012, 15:22  [ТС] 10
Цитата Сообщение от serg42 Посмотреть сообщение
А запрос-то вообще правильный генерится? Насколько я помню SQL, в INSERT указывают имена полей. Типа такого:

SQL
1
INSERT INTO dbo.Должности (id, name, kol_m, kol_z_m, kols_s_m, okl) VALUES(@id, @name, @kol_m, @kol_z_m, @kol_s_m, @okl )
C#
1
kadDataSet.AcceptChanges();
Это лишнее. После вызова DataAdapter.Update(), AcceptChanges() вызывает сам.

генерировать запросы можно двумы разными способами. Один использую я, а другой привели Вы. Да, насчет AcceptChanges я уже поняла и убрала его.
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
19.03.2012, 15:23 11
можно не указывать имена полей, но тогда для Values необходимо указать данные для ВСЕХ полей в БД в правильной последовательности
0
Белая волчица
1 / 1 / 1
Регистрация: 20.02.2010
Сообщений: 65
19.03.2012, 15:28  [ТС] 12
Цитата Сообщение от Learx Посмотреть сообщение
1. попробуйте создать в вашей второй форме геттеры для доступа к полям формы.
2. Запускаем вторую форму как диалог
3. при DialogResault.OK в ОСНОВНОЙ форме добавляем строку в таблицу данных (а значения строки нам доступны через геттеры)
4. создаем adapter и adapter.InsertCommand указав SourceColumn вместо Value.
5. и выполняем adapter.Update(table)
Если это не сработает тогда уж не знаю.

Я предполагаю, что что-то неправильно прописала...
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
19.03.2012, 15:29 13
выложите свой проэкт
0
Белая волчица
1 / 1 / 1
Регистрация: 20.02.2010
Сообщений: 65
19.03.2012, 15:33  [ТС] 14
ой, только не пугайтесь. он и так печален.
Отдел кадров.rar
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
19.03.2012, 16:46 15
убери вовсе адаптер из формы add_dol.
все добавляется и все видно. почему ты не видишь изменений - не понятно.
для справки: все твои запросы view можно заменить одним:
C#
1
view = string.Format( "бла-бла-бла ... WHERE dbo.Подразделения.Наименование_подр = {0}", e.Node.Text)
этот метод вставит вместо {0} значение e.Node.Text.
и тогда ты избавишься ото всех ужасных if - ов.

или же при помощи параметра, которыми ты умеешь пользоваться.

для комбоксов используй следующее(Form_Load):
C#
1
2
3
4
5
6
7
DataTable DataForComboBox = new DataTable();
SqlConnection conn = new SqlConnection(connectionString);
SqlDataAdapter adapter = new SqlDataAdapter("Select * from Подразделения", conn);
adapder.Fill(DataForComboBox);
comboboxPod.ValueMember = "ID_подразделения";
comboboxPod.DisplayMember = "Наименование_подр";
comboboxPod.DataSource = DataForComboBox;
тогда достаточно будет соотвественно
C#
1
2
SqlParameter par = new SqlParameter("@Id", SqlDbType.Int);
par.Value = (int)comboboxPod.SelectedValue;
ну и в конце добавь textBoxValidating чтоб можно было проверять вводимые данные
1
Белая волчица
1 / 1 / 1
Регистрация: 20.02.2010
Сообщений: 65
19.03.2012, 16:59  [ТС] 16
За полезности отдельное спасибо!
А вот по поводу "добавляется и все видно" тут сомнительно. После добаления вижу. Но когда захожу через Server Explorer и просмотриваю таблицу ничего нового не обнаруживаю.
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
19.03.2012, 18:08 17
я создал свою БД по вашим запросам и в ней все отобразилось.
проверьте в менеджере подключение, возможно, в менеджере Вы подключаетесь к другой БД

Добавлено через 25 минут
вот например, как я добавляю новый город:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
           AddCity f = new AddCity(RigionTable); //Создаю форму и передаю ей области
//взываю форму как диалоговое окно
            if (f.ShowDialog() == DialogResult.OK) //нажата кнопка "Добавить"
            {
                try
                {
//Создаю подключение, строку подключения получаю при помощи ConfigurationManager из файла конфигурации
                    using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyDb.MsSql"].ConnectionString))
                    {
//тут все понятно
                        conn.Open();
                        SqlCommand comm = new SqlCommand();
                        comm.Connection = conn;
                        comm.CommandText = string.Format("Insert into City Values({0}, '{1}', '')"
, f.RId, f.CityName); //Данные для запроса получаю через геттеры
                        comm.ExecuteNonQuery();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
//Код дизайнера формы
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
    partial class AddCity
    {
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Код, автоматически созданный конструктором форм Windows
 
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        private void InitializeComponent()
        {
            this.cbReg = new System.Windows.Forms.ComboBox();
            this.label1 = new System.Windows.Forms.Label();
            this.label2 = new System.Windows.Forms.Label();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.tbCity = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // cbReg
            // 
            this.cbReg.FormattingEnabled = true;
            this.cbReg.Location = new System.Drawing.Point(12, 30);
            this.cbReg.Name = "cbReg";
            this.cbReg.Size = new System.Drawing.Size(223, 21);
            this.cbReg.TabIndex = 0;
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(13, 13);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(50, 13);
            this.label1.TabIndex = 1;
            this.label1.Text = "Область";
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(13, 54);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(37, 13);
            this.label2.TabIndex = 2;
            this.label2.Text = "Город";
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(16, 96);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 3;
            this.button1.Text = "Добавить";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(160, 96);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(75, 23);
            this.button2.TabIndex = 4;
            this.button2.Text = "Отмена";
            this.button2.UseVisualStyleBackColor = true;
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // tbCity
            // 
            this.tbCity.Location = new System.Drawing.Point(16, 70);
            this.tbCity.Name = "tbCity";
            this.tbCity.Size = new System.Drawing.Size(219, 20);
            this.tbCity.TabIndex = 5;
            // 
            // AddCity
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(250, 131);
            this.Controls.Add(this.tbCity);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.cbReg);
            this.Name = "AddCity";
            this.Text = "AddCity";
            this.ResumeLayout(false);
            this.PerformLayout();
 
        }
 
        #endregion
 
        private System.Windows.Forms.ComboBox cbReg;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.TextBox tbCity;
    }
Класс самой формы
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
public partial class AddCity : Form
    {
        public AddCity()
        {
            InitializeComponent();
        }
//Геттеры,  о которых я говорил
        public int RId { get { return (int)cbReg.SelectedValue; } }
        public string CityName { get { return tbCity.Text; } }
//Названия областей получаю в виде таблицы и подключаю с своему комбобоксу
        public AddCity(DataTable reg)
        {
            InitializeComponent();
            cbReg.ValueMember = "RId";
            cbReg.DisplayMember = "RName";
            cbReg.DataSource = reg;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
//если данные введены и нажата кнопка "добавить" то завершаю диалог ОК
            this.DialogResult = DialogResult.OK;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
//отмена
            this.DialogResult = DialogResult.Cancel;
        }
    }
0
Белая волчица
1 / 1 / 1
Регистрация: 20.02.2010
Сообщений: 65
19.03.2012, 19:08  [ТС] 18
Странное дело.. Не понимаю почему в БД нет этой записи...
К базе подсоединяюсь именно этой. Наверно буду пробовать создать пустой проект и заново все это написать.
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
19.03.2012, 20:21 19
попробуй просто создать новую БД
интерфейс мне понравился, хотя запросы и методы лучше переписать как я подсказал
0
serg42
118 / 100 / 7
Регистрация: 14.02.2010
Сообщений: 263
19.03.2012, 21:26 20
Цитата Сообщение от Learx Посмотреть сообщение
проверьте в менеджере подключение, возможно, в менеджере Вы подключаетесь к другой БД
Так стоит настройка "копировать в выходной каталог"


Цитата Сообщение от Learx Посмотреть сообщение
try
{
using (SqlConnection conn = new SqlConnection()
{
}
} catch (Exception ex) { MessageBox.Show(ex.ToString()); }

Не по теме:


А using разве не перехватит исключение?

0
19.03.2012, 21:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2012, 21:26

UpdateException при добавлении записи в таблицу БД
Делаю форму на добавление с подключенной БД, на основе которой создана EDM...

Отрицательный счетчик при добавлении новой записи
в SQL server указан счетчик +1 для новых записей при этом на добавление в...

Ошибка синтаксиса Insert into при добавлении записи в БД Access
Я работаю на C#. Мне нужно создать в access таблицу Avtobuss. Она не создается...


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

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

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