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

Проверка на дублирование строк при добавлении новой строки

06.12.2009, 00:30. Просмотров 4304. Ответов 17
Метки нет (Все метки)

Здравствуйте! Возникла проблема. Когда добавляю новую строку в базу данных нужно проверить, чтобы не было дублирования уже существующей строки. Пробовал с помощью CompareTo() и Equals() ничего не вышло, а вышло вот так вот, по моему немного коряво, потому что пришлось делать постоянно пересортировку данных:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Сравнение новой строки с уже существующими для избежания дублирования строки
                    clientsDataView.Sort = "FirstName";
                    string findFirstNameData = newClientsRow.FirstName.ToString();                                                                              
                    if (clientsDataView.Find(findFirstNameData) == -1)
                    {
                        clientsDataView.Sort = "ConsoleNumber";
                        string findConsoleNumberData = newClientsRow.FirstName.ToString();
                        if (clientsDataView.Find(findConsoleNumberData) == -1)
                        {
                            
                            sequrityDatabaseDataSet1.Clients.Rows.Add(newClientsRow);
                            clientsDataView.Sort = "ClientID";
                        }
                    }
                    else
                        MessageBox.Show("Такой клиент уже существует!");
                    clientsDataView.Sort = "ClientID";
Подскажите пожалуйста как правильнее это сделать.
Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2009, 00:30
Ответы с готовыми решениями:

Автоматическая перенумерация строк при добавлении новой строки в середину таблицы
Доброго времени суток, друзья! Прошу помощи, поскольку мои силы иссякли. В примере я всё расписал...

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

VB Проверка на уникальность, при добавлении новой записи
Всех приветствую. Столкнулся с небольшой проблемой проверки на уникальность (поле "Номер" ) при...

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

17
70 / 67 / 12
Регистрация: 01.11.2009
Сообщений: 246
06.12.2009, 19:16 2
сделать запрос, если будет такая строка, то существует
0
1 / 1 / 0
Регистрация: 20.08.2009
Сообщений: 58
06.12.2009, 23:27  [ТС] 3
А можно поподробнее ?
0
70 / 67 / 12
Регистрация: 01.11.2009
Сообщений: 246
07.12.2009, 12:35 4
делаешь запрос по всем полям таблицы с условием AND. Если хоть одна запись будет, то в датагриде кол-во строк будет больше 1. Вот и условие проверки.
Или можно сделать ключ по всем столбцам
0
Комбайнёр
1584 / 682 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
07.12.2009, 12:41 5
1. Какая СУБД?
2. Что-нибудь слышали про хранимые процедуры?
0
1 / 1 / 0
Регистрация: 20.08.2009
Сообщений: 58
11.12.2009, 18:41  [ТС] 6
Спасибо за советы. Вот попробовал написать запрос и вот что получилось:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string fn = newClientsRow[1].ToString();                   
                    string cn = newClientsRow[5].ToString();
                    StringBuilder results = new StringBuilder();
                    SqlCommand ClientsCommand = new SqlCommand();
                    ClientsCommand.Connection = SequrityDatabaseConnaction;
                    ClientsCommand.CommandType = CommandType.Text;
                    ClientsCommand.CommandText =
                        "SELECT FirstName  FROM Clients WHERE  FirstName LIKE '" + fn+ "%'";// AND ConsoleNumber LIKE '" +cn+"%"; вот на это он ругается
                    SqlDataReader reader = ClientsCommand.ExecuteReader();
                    while(reader.Read())
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            results.Append(reader[i].ToString() + "/t");
                            results.Append(Environment.NewLine);
                        }
                    reader.Close();
                    ClientsCommand.Connection.Close();
                    string r = results.ToString();
Почему-то переменная r всегда null, даже когда в БД есть значения, которые я передаю. Что здесь не так?
Спасибо
0
MCSD: APP BUILDER
8784 / 1062 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
11.12.2009, 18:45 7
Alexey1,
сделай unique индекс на это поле и делай тупо insert. если что, ado.net тебя пошлёт. молча терпишь ругательства, отлавливаешь исключение в try/catch, и работаешь дальше. (Ж
0
1 / 1 / 0
Регистрация: 20.08.2009
Сообщений: 58
12.12.2009, 00:27  [ТС] 8
Попробовал сделать unique, ругается на то, что не может конвертировать из типа string в тип unique, а как же все таки сделать запрос?

Добавлено через 39 минут
Господа, и все же извините за настойчивость, но почему при повторном создании строки с таким же именем у меня переменная r все равно остается пустая.
Спасибо за проявленное внимание!!!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
string fn = newClientsRow[1].ToString();                   
                    string cn = newClientsRow[5].ToString();
                    StringBuilder results = new StringBuilder();
                    SqlCommand ClientsCommand = new SqlCommand();
                    ClientsCommand.Connection = SequrityDatabaseConnaction;
                    ClientsCommand.CommandType = CommandType.Text;
                    ClientsCommand.CommandText =
                        "SELECT FirstName  FROM Clients WHERE  FirstName = '"+fn+"'";// +"%'";// AND ConsoleNumber LIKE '" +cn+"%";                    
                    ClientsCommand.Connection.Open();
                    SqlDataReader reader = ClientsCommand.ExecuteReader();
                    while(reader.Read())
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            results.Append(reader[i].ToString() + "/t");
                            results.Append(Environment.NewLine);
                        }
                    reader.Close();
                    ClientsCommand.Connection.Close();
                    string r = results.ToString();
                    if (r!="")
                        MessageBox.Show("Yes!");
Добавлено через 1 час 23 минуты
У меня наверное БД не разрешает доступ через SQLCommand, т.к. была создана по умолчанию в дизайнере. Может ли такое быть или это мой "бред"? Если может,то как с этим бороться. Пробовал открыть файл MDF в SQL Server Management Studio но не получилось. Можно ли это все в студии сделать?
0
1 / 1 / 0
Регистрация: 20.08.2009
Сообщений: 58
22.12.2009, 22:41  [ТС] 9
Господа, еще вопрос по данной теме. Попробовал (один хороший товарищ посоветовал) создавать новую строку с использованием латиницы и все получилось. А я то тут роюсь совсем не в том направлении. Подскажите пожалуйста где и что сделать, чтобы программа воспринимала запрос на русском языке
Спасибо!
0
Комбайнёр
1584 / 682 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
23.12.2009, 09:13 10
Это как?
0
70 / 67 / 12
Регистрация: 01.11.2009
Сообщений: 246
23.12.2009, 11:29 11
где и что сделать, чтобы программа воспринимала запрос на русском языке
запросы с русским языком работают же нормально... или вам надо что-то вроде этого
SQL
1
2
3
СЕЛЕКТ поле1, поле2
ФРОМ моя_таблица
ВЭАР ид=@ид  //блин даже не знаю как написать на русском WHERE
0
50 / 31 / 1
Регистрация: 08.10.2009
Сообщений: 144
23.12.2009, 11:37 12
Тогда уж так:
SQL
1
2
3
ВЫБРАТЬ поле1, поле2
ИЗ моя_таблица
ГДЕ ид=@ид
Да здравствует Великий и Могучий!
0
1 / 1 / 0
Регистрация: 20.08.2009
Сообщений: 58
23.12.2009, 19:33  [ТС] 13
Я наверное неправильно сформулировал свой вопрос.
Вот код,который работает, когда ячейка строки, которую я создаю в БД состоит из латинских букв или из цифр. Но когда вводятся русские буквы, то запрос их не находит и создает строку с точно такой же ячейкой
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
StringBuilder results = new StringBuilder();
                    SqlCommand ClientsCommand = new SqlCommand();
                    ClientsCommand.Connection = SequrityDatabaseConnection;
                    ClientsCommand.CommandType = CommandType.Text;
                    ClientsCommand.CommandText =
                        "SELECT *  FROM Clients WHERE  FirstName = '" + newClientsRow.FirstName.ToString() + "'";                  
                    ClientsCommand.Connection.Open();
                    SqlDataReader reader = ClientsCommand.ExecuteReader();
                    while(reader.Read())
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            results.Append(reader[i].ToString() + "/t");
                            results.Append(Environment.NewLine);
                        }
                    reader.Close();
                    ClientsCommand.Connection.Close();
                    string r = results.ToString();
                    if (r != "")
                    {
                        MessageBox.Show("Строка  уже существует!");
                    }
0
Миниатюры
Проверка на дублирование строк при добавлении новой строки   Проверка на дублирование строк при добавлении новой строки  
107 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
23.12.2009, 20:03 14
Тип FirstName в Clients? Кодировка?

P.S. Тут мои посты тереть начали, по сему - повторюсь: используйте параметры в запросе.
0
70 / 67 / 12
Регистрация: 01.11.2009
Сообщений: 246
23.12.2009, 20:05 15
попробуйте сравнить с помощью LIKE, хотя у меня в базе был поиск и на русском и на английском - все работало
0
1 / 1 / 0
Регистрация: 20.08.2009
Сообщений: 58
23.12.2009, 23:25  [ТС] 16
Тип FirstName nvarchar , пробовал с LIKE и результат тот же. А где кодировку посмотреть?
Спасибо!
0
107 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
24.12.2009, 00:52 17
Цитата Сообщение от Alexey1 Посмотреть сообщение
Тип FirstName nvarchar
nvarchar
Цитата Сообщение от Alexey1 Посмотреть сообщение
А где кодировку посмотреть?
В M$ SQL - не копенгаген. Попробуйте сказать что-то а-ля:
T-SQL
1
2
sp_configure 'default character set id'
select * from syscharsets
Уточните сдесь...
0
1 / 1 / 0
Регистрация: 20.08.2009
Сообщений: 58
05.01.2010, 20:12  [ТС] 18
В общем сделал Sql command с параметрами и все прекрасно заработало.
Спасибо всем за помощь!!!
C#
1
2
3
ClientsCommand.CommandText =
"SELECT *  FROM Clients WHERE ConsoleNumber = @CN";
ClientsCommand.Parameters.Add("@CN", SqlDbType.NVarChar).Value = newClientsRow.ConsoleNumber;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2010, 20:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Перемещение строк в консоли вниз при добавлении новой
Здравствуйте. Существует проблема. В консоли выведен текст. Нужно до этого текста вывести строку....

Как при добавлении новой строки в ListView изменить высоту строки?
Всем привет! В одной теме я решил совместить несколько вопросов, но по общей теме. 1) Как в...

Неправильный id в dataGridView при добавлении новой строки
Есть таблица &quot; Accounts &quot; столбик &quot; id &quot; с автоинкрементом , в dataGridView , при добавлении новой...

Не обновляются данные в БД при добавлении новой строки
private void mnuAddCl_Click(object sender, EventArgs e) { using (SqlConnection cn = new...


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

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

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