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

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

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

Author24 — интернет-сервис помощи студентам
Вот код добавления:

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2012, 13:32
Ответы с готовыми решениями:

При добавлении записи не обновляется форма
Добавляю запись через кнопку и отдельную форму, в таблице информация обновляется а в форме с...

[WPF] Не обновляется DataGrid при добавлении данных!
У меня есть Datagrid который берет строки из класса Patient Класс Patient хранит в себе...

Изменение записи в таблице при добавлении записи в другую таблицу
Есть две таблицы TProduct(товары) и TIncoming(приход) с полями "наименование" и "количество"....

Дублирование записи в определенном поле при добавлении новой записи
Добрый день. Подскажите пожалуйста, есть у меня запрос на создание таблицы где в созданной таблице...

27
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
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
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
19.03.2012, 14:28 4
Ошибку выдает? какую? в какой строке?
если не выдает, то выполните программу пошагово, внимательно смотрите что в каком порядке выполняется. возможно, у Вас ошибка не в коде а в логике вызова команды.
0
1 / 1 / 1
Регистрация: 20.02.2010
Сообщений: 65
19.03.2012, 14:47  [ТС] 5
лучше бы ошибку выдавало. а так все значения получает, кидает в грид, а в базе нету..
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
19.03.2012, 14:49 6
а в каком месте у Вас добавляются значения в DataGrid'e? я в этом коде такого не заметил!
0
1 / 1 / 1
Регистрация: 20.02.2010
Сообщений: 65
19.03.2012, 14:57  [ТС] 7
ввод новых данных я осуществляю на отдельной форме, в основной форме при просмотре записей формируются запросы, собственно посредством этих запросов можно обнаружить новую запись.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
19.03.2012, 15:06 8
1. попробуйте создать в вашей второй форме геттеры для доступа к полям формы.
2. Запускаем вторую форму как диалог
3. при DialogResault.OK в ОСНОВНОЙ форме добавляем строку в таблицу данных (а значения строки нам доступны через геттеры)
4. создаем adapter и adapter.InsertCommand указав SourceColumn вместо Value.
5. и выполняем adapter.Update(table)
Если это не сработает тогда уж не знаю.
0
124 / 106 / 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
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
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
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
19.03.2012, 15:29 13
выложите свой проэкт
0
1 / 1 / 1
Регистрация: 20.02.2010
Сообщений: 65
19.03.2012, 15:33  [ТС] 14
ой, только не пугайтесь. он и так печален.
Отдел кадров.rar
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
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
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
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
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
19.03.2012, 20:21 19
попробуй просто создать новую БД
интерфейс мне понравился, хотя запросы и методы лучше переписать как я подсказал
0
124 / 106 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2012, 21:26
Помогаю со студенческими работами здесь

MS Sql: при добавлении новой записи, информация из первой записи в таблице исчезает
Ошибка заключается в том, что при добавлении новой записи(через программу), информация из первой...

Нарушение прав доступа при записи по адресу 0х00000000 при добавлении элемента структуры
прошу помощи, выбивает эту ошибку при добавлении элемента структуры, также приму во внимание другие...

Ошибка при добавлении записи в БД
Подскажите, что означает эта ошибка при добавление записи в БД: Warning: mysql_query(): 2 is not a...

Ошибка при добавлении записи в БД
Здравствуйте, я добавляю запись в БД, первый раз запись добавляется, а вторая нет выходит ошибка...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru