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

Сохранение в БД. (DataAdapter и параметры. Ошибка "Нарушение "IX_Countries" ограничения UNIQUE KEY.")

19.01.2014, 22:07. Просмотров 1294. Ответов 8
Метки нет (Все метки)

Всем привет! Пишу курсач и самостоятельно разбираюсь в ado.net.
Возникла проблема. В БД есть табличка Countries с полями:
CountryId - ключ
CountryName - уникальное поле
С помощью адаптера я перегоняю данные в datagridview там изменяю одну строчку (из названия Япония удалил один символ) и нажимаю сохранить, после этого вылезает ошибка:

"Нарушение "IX_Countries" ограничения UNIQUE KEY. Не удается вставить повторяющийся ключ в объект "dbo.Countries". Повторяющееся значение ключа: (пония ).
Выполнение данной инструкции было прервано."

Конечно страны с названием "пония" в табличке нету. В чём ошибка и как исправить? Заранее спасибо!!!

Вот код:
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
namespace test
{
    public partial class Form1 : Form
    {
        SqlConnection connection = new SqlConnection();
        SqlDataAdapter adapter;
        DataSet dataset;
        BindingSource bs;
        
        //заполняем dataGridView1
        private void dataAdapterToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SqlCommand command = connection.CreateCommand();
            command.CommandText = "SELECT * FROM Countries";
            adapter = new SqlDataAdapter(command);
            dataset = new DataSet();
            adapter.Fill(dataset);
            bs = new BindingSource();
            bs.DataSource = dataset.Tables[0];
            dataGridView1.AutoGenerateColumns = true;
            dataGridView1.DataSource = bs;
 
        }
 
        //сохраняем данные
        private void saveButton_Click(object sender, EventArgs e)
        {
            SqlCommand com = new SqlCommand("UPDATE Countries SET CountryName = @CountryName");
            com.Parameters.Add("@CountryName", SqlDbType.NChar, 25, "CountryName");
            adapter.UpdateCommand = com;
            adapter.UpdateCommand.Connection = connection;
            adapter.Update(dataset.Tables[0]);
        }
 
        public Form1()
        {
            InitializeComponent();
 
            if (connection.State == ConnectionState.Open)
                return;
 
            connection.ConnectionString = "Data Source=EAGLE-DESKTOP\\EAGLESQLEXPRESS;Initial Catalog=kp_database;Integrated Security=True;Pooling=False";
            try
            {
                connection.Open();
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            } 
        }
 
 
        ~Form1()
        {
            if (connection.State == ConnectionState.Open)
                connection.Close();
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2014, 22:07
Ответы с готовыми решениями:

Добавление данных в таблицу. Нарушение "PK_Adresss" ограничения PRIMARY KEY
Есть контроллер public ActionResult ADDObject(Name add) { ...

Ошибка "Не удалось привести тип объекта "System.Data.DataRowView" к типу "System.IConvertible""
Здравствуйте,столкнулся с некой ошибкой.Привязал данные к comboBox пытаюсь...

Обновление данных и ошибка "Является "тип", но используется как "переменная"
Код кнопки обновить ,базу данных (button1) пишет ошибку ...

Ошибка "Попытка чтения или записи в защищенную память" во время выполнения метода DataAdapter.Fill
Делаю так: using (OdbcConnection _conn = new OdbcConnection(_connectionStr) {...

Ребята, подскажите плз. - "WCF" + "plugin" (поддержка плагинов) + "3 Tier Architecture" (трехслойная архитектура)
Ребята, подскажите плз. можно ссылки на рабочий пример: C#: "WCF" +...

8
Grishaco
437 / 361 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
19.01.2014, 22:41 2
Я думаю у вас в таблице есть страна с названием "CountryName"? Или я не прав?
0
eaglecrazy
1 / 1 / 0
Регистрация: 06.02.2012
Сообщений: 31
19.01.2014, 22:59  [ТС] 3
Нет, такой страны там точно нету. Вот что выдаёт по коду метода dataAdapterToolStripMenuItem_Click
Там все страны, которые я вбивал вручную на сервере.
Сохранение в БД. (DataAdapter и параметры. Ошибка "Нарушение "IX_Countries" ограничения UNIQUE KEY.")
0
Grishaco
437 / 361 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
19.01.2014, 23:03 4
Ваш запрос пытается проапдейтить столбец одним значением "CountryName", так как там стоит уникальность, получаете ошибку, попробуйте убрать уникальность и запрос перетрет все названия стран.

C#
1
2
SqlCommand com = new SqlCommand("UPDATE Countries SET CountryName = @CountryName");
com.Parameters.Add("@CountryName", SqlDbType.NChar, 25, "CountryName");
0
eaglecrazy
1 / 1 / 0
Регистрация: 06.02.2012
Сообщений: 31
19.01.2014, 23:09  [ТС] 5
Цитата Сообщение от Grishaco Посмотреть сообщение
попробуйте убрать уникальность и запрос перетрет все названия стран.
Конечно можно так сделать, но это же неправильно. Я думаю в БД эта уникальность названия страны оправдана. Неужели в больших, рабочих БД так же делается? Думаю должен быть другой способ...
0
Grishaco
437 / 361 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
19.01.2014, 23:11 6
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Цитата Сообщение от eaglecrazy Посмотреть сообщение
Конечно можно так сделать, но это же неправильно.
Вы так и не уловили мою мысль, у вас не правильно составлен запрос обновления данных.

C#
1
SqlCommand com = new SqlCommand("UPDATE Countries SET CountryName = @CountryName WHERE CountryId = @CountryId");
0
eaglecrazy
1 / 1 / 0
Регистрация: 06.02.2012
Сообщений: 31
19.01.2014, 23:23  [ТС] 7
Цитата Сообщение от Grishaco Посмотреть сообщение
Вы так и не уловили мою мысль, у вас не правильно составлен запрос обновления данных.

C#
1
SqlCommand com = new SqlCommand("UPDATE Countries SET CountryName = @CountryName WHERE CountryId = @CountryId");
Спасибо! Помогло! Но теперь другая ошибка вылезла. Говорит, что параметра ему не хватает, а я передал.
Сохранение в БД. (DataAdapter и параметры. Ошибка "Нарушение "IX_Countries" ограничения UNIQUE KEY.")
0
Grishaco
437 / 361 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
19.01.2014, 23:26 8
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Посмотрите здесь
1
eaglecrazy
1 / 1 / 0
Регистрация: 06.02.2012
Сообщений: 31
19.01.2014, 23:36  [ТС] 9
Цитата Сообщение от Grishaco Посмотреть сообщение
Посмотрите здесь
Поменял параметр

C#
1
com.Parameters.Add("@CountryId", SqlDbType.Int);
на

C#
1
com.Parameters.Add("@CountryId", SqlDbType.NChar, 5, "CountryId");
И всё заработало, но как то странно, что параметр с типом SqlDbType.Int передаётся как SqlDbType.NChar с размером 5.

Всем спасибо!!!
0
19.01.2014, 23:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2014, 23:36

Как исправить ошибку ""Ссылки на тип "Component" требует его определения в "System", но его не удалось найти"?
using System; using System.Collections.Generic; using System.Data.OleDb;...

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

Ошибка "Violation of primary key constraint" при update
Написал программку. При нажатии на кнопку "обновить" должна происходить...


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

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

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