kmllev Ответов: 3

Как предотвратить подобные [дубликаты] записей в базе данных SQL?


На данный момент у меня есть вот это:
//CHECK IF COMPLETE DUPLICATE
query = "SELECT * FROM TBL_FLAVORS WHERE flavor_name = @flavor_name AND flavor_supplierid = @supplier_id";
                    using (SqlConnection con = new SqlConnection(connstring))
                    {
                        con.Open();

                        using (SqlCommand cmd = new SqlCommand(query, con))
                        {

                            SqlDataReader read;
                            cmd.Parameters.AddWithValue("@flavor_name", txtFlavorName.Text.ToString());
                            cmd.Parameters.AddWithValue("@supplier_id", supplierid);
                            read = cmd.ExecuteReader();
                            if (read.Read())
                            {
                                MessageBox.Show("This flavor for this supplier already exists.");
                                return;
                            }
                            read.Close();
                        }
                    }


//CHECK IF ALMOST SIMILAR
//IF RECORD FOUND, RETURN
//OTHERWISE, PROCEED TO UPDATE/INSERT

                    query = "SELECT * FROM TBL_FLAVORS WHERE (flavor_name LIKE @flavor_name OR flavor_name LIKE @flavor_name2 OR FLAVOR_NAME LIKE @flavor_name3) AND flavor_supplierid = @supplier_id";
                    using (SqlConnection con = new SqlConnection(connstring))
                    {
                        con.Open();
                        
                            using (SqlCommand cmd = new SqlCommand(query, con))
                            {
                            string flavorname = "%" + txtFlavorName.Text.ToString()+ "%";
                            string flavorname2 = "" + txtFlavorName.Text.ToString() + "%";
                            string flavorname3 = "%" + txtFlavorName.Text.ToString() + "";
                            SqlDataReader read;
                                cmd.Parameters.AddWithValue("@flavor_name", flavorname);
                            cmd.Parameters.AddWithValue("@flavor_name2", flavorname2);
                            cmd.Parameters.AddWithValue("@flavor_name3", flavorname3);
                            cmd.Parameters.AddWithValue("@supplier_id", supplierid);
                                read = cmd.ExecuteReader();
                                if (read.Read())
                                {
                                DialogResult dialog = MessageBox.Show("It is possible that this flavor for this supplier already exists. Do you want to continue?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                                if (dialog == DialogResult.No)
                                {
                                    return;
                                }
                                }
                                read.Close();
                            }
                    }


Это для окончательного проекта. Участник дискуссии спросил, Что делать, если уже есть "дюйм", и пользователь ввел "innch". Или, скажем, в базе данных есть "шоколад", он должен запросить подтверждение, если пользователь вводит "шоколад".

Что я уже пробовал:

Операторы подстановочных знаков SQL, как указано выше.

3 Ответов

Рейтинг:
23

MayurDighe

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

Цитата:
Это для окончательного проекта. Участник дискуссии спросил что если там уже было 'дюйм' и пользователь ввел 'innch.' Следует признать, как дубликат. Или, скажем, в базе данных есть "шоколад", он должен запросить подтверждение, если пользователь вводит "шоколад".
И, конечно же, дорогой-никто не интересуется тем, о чем вас спрашивал участник дискуссии.


kmllev

Я подумаю о реализации функции автозаполнения, спасибо!
И о вопросе участника дискуссии... Мы должны были защитить систему, так как это требование для нашей дипломной работы в колледже. Они очень настаивали на этом. Как мы можем возражать против этого? "Дюйм" и "Инч" следует рассматривать как дублирующие значения?

MayurDighe

Это хорошо, что вы не хотите спорить с экспертом;)
Но, по крайней мере, вы можете найти альтернативные решения, которые участник дискуссии может подумать о вашей системе.

Рейтинг:
2

Suvendu Shekhar Giri

Трудно внутренне решить, что похоже, а что нет. Если вы хотите автоматизировать это, вам нужно дать немного ИИ вашей программе.
Ну, в SQL Server Есть несколько вариантов, которые могут приблизить вас к тому, чего вы хотели достичь, но точно, поскольку это требует решения ИИ, как я уже сказал.

В приложении у вас определенно есть много возможностей построить свою собственную логику и добиться более точного результата, но давайте посмотрим, как мы можем быстро использовать некоторые функции SQL Server, чтобы получить что-то smilar.

SOUNDEX (Transact-SQL)[^]
Разница (Transact-SQL)[^]
Я бы посоветовал внимательно прочитать эти две документации.
Пример (взят из приведенной выше ссылки на документацию):

-- Using SOUNDEX  
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe');  

Результат:
----- -----   
S530  S530

Мы получили одинаковое значение в результате для обоих. Теперь давайте использовать DIFFERENCE чтобы сравнить эти значения.
-- Using DIFFERENCE  
SELECT DIFFERENCE ('Smith','Smythe');  

Результат:
-----   
4


Итак, что же здесь означает "4"?
Цитата:
Возвращаемое целое число - это количество одинаковых символов в значениях SOUNDEX. Возвращаемое значение колеблется от 0 до 4: 0 указывает на слабое сходство или отсутствие сходства, а 4-на сильное сходство или те же значения.

-- Using DIFFERENCE  
SELECT DIFFERENCE ('Smith','Jones');  

Результат:
-----   
2

Использование ваших входных данных-
SELECT DIFFERENCE ('chocolate','chocolates'),DIFFERENCE ('inch','innch');

Результат:
----- -----  
4     4


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


kmllev

ВАУ.
Я никогда раньше не слышал об этой функции, я очень удивлен, лол
Но интересно, как я смогу реализовать это в C#? Как я получу возвращаемое значение, если нет имени столбца?

Suvendu Shekhar Giri

Вы можете фактически передать имя столбца в качестве параметров обоим SOUNDEX и DIFFERENCE функции.

Теперь предположим вы хотите проверить вводит ли пользователь значение аналогичное существующему значению в таблице тогда вы можете поставить проверку раньше INSERT.

kmllev

Я вижу. Но как я получу результат или возвращаемое значение SOUNDEX и DIFFERENCE? Я пробовал их в SQL Server, и когда они возвращают результат, нет имени столбца?

Рейтинг:
1

Ali Majed HA

Привет

если вы хотите читать из базы данных и извлекать данные, вы должны использовать:
Выберите DISTINCT (FieldName) FROM.... если вы хотите получить один "дюйм", ваше имя поля связано со значением" дюйм".

или если вы хотите, чтобы этот пользователь не вставлял "шоколад" дважды, вы должны установить имя поля в качестве ключа Primery.

надеюсь, ти работает на вас
с уважением