Amar chand123 Ответов: 2

Проблема в дублировании кода данных на языке Си#


Я использую этот код для проверки дубликатов данных перед сохранением в базе данных но этот код Примечание работает


мой код кнопки сохранения

private void btnsaveCustomerEntry_Click(object sender, EventArgs e)
        {
            if (IsValidated())
            {
                try
                {
                    SaveRecord(); Calculat(); SaveRecord1(); SaveRecord2(); LoanDetails();
                    reset(); tabControl1.SelectTab(tabPage1); txtCustomerName.Focus(); Autonumber1(); AutoDate1();
                    label27.Text = ""; dataGridView1.Rows.Clear();
                }
                catch (ApplicationException ex)
                {
                    MessageBox.Show("Error:" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }



когда я нажимаю кнопку Сохранить ошибка Show

Необработанное исключение типа 'System.Data.OleDb.OleDbException' произошло в System.Data.dll
Дополнительная информация: изменения, которые вы запросили в таблице, не были успешными, поскольку они создавали бы повторяющиеся значения в индексе, первичном ключе или связи. Измените данные в поле или полях, содержащих повторяющиеся данные, удалите индекс или переопределите индекс, чтобы разрешить повторяющиеся записи, и повторите попытку.

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

private bool IsValidated()
        {
            OleDbConnection con = new OleDbConnection(ConfigurationManager.ConnectionStrings["FincorpData"].ConnectionString);
            string sql1 = "select count (LoanNumber) from customer Where LoanNumber = '" + textBoxLoanNumber + "' ";
            OleDbCommand cmd = new OleDbCommand(sql1, con);
            con.Open();
            int temp = Convert.ToInt32(cmd.ExecuteScalar());
            if (temp > 0)
            {
                MessageBox.Show("Loan Number Already Exists");
                return false;
            }

           if (txtCustomerName.Text.Trim() == string.Empty)
           {
               MessageBox.Show("Customer Name is Requied", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
               tabControl1.SelectTab(tabPage1); txtCustomerName.Focus();
               return false;
           }

           if (txtFatherName.Text.Trim() == string.Empty)
           {
               MessageBox.Show("Father's Name is Requied", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
               tabControl1.SelectTab(tabPage1); txtFatherName.Focus();
               return false;
           }
 
            return true;
        }

2 Ответов

Рейтинг:
9

RickZeeland

Я думаю, что проблема в том, что вы используете

textBoxLoanNumber

так и должно быть:
textBoxLoanNumber.Text

Если ваше приложение предназначено для публичного использования, вы не должны объединять значения таким образом, вместо этого используйте параметризацию, чтобы избежать атак SQL-инъекций.


Amar chand123

Спасибо

Рейтинг:
1

OriginalGriff

Прежде всего, измените свой стиль.
Такие вещи трудно читать:

SaveRecord(); Calculat(); SaveRecord1(); SaveRecord2(); LoanDetails();
                    reset(); tabControl1.SelectTab(tabPage1); txtCustomerName.Focus(); Autonumber1(); AutoDate1();
Отделите каждую инструкцию на своей собственной линии, и она станет гораздо более очевидной:
SaveRecord(); 
Calculat(); 
SaveRecord1(); 
SaveRecord2(); 
LoanDetails();
                    
reset(); 
tabControl1.SelectTab(tabPage1); 
txtCustomerName.Focus(); 
Autonumber1(); 
AutoDate1();
А затем измените имена своих методов на что - то более самодокументирующее, чем "SaveRecord", "SaveRecord1", "SaveRecord2" и т. д.-слишком легко ошибиться, когда вы просто добавляете число в конце!

Затем самое важное: никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Теперь мы начинаем подходить к проблеме, которую вы заметили - и мы не можем помочь. Код, который вы показываете, даже не вызывает метод "Is Validated", так что, возможно, причина, по которой ваш код fais с ошибкой дубликата ключа, - но у нас нет никакого доступа к вашим данным или пользовательскому вводу, поэтому мы вообще не можем сказать, что происходит.

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Amar chand123

Причина использования SaveRecord, SaveRecord1, потому что у меня есть три таблицы в базе данных, и я не знаю никакого кода для сохранения данных во всех трех таблицах одним кодом для сохранения данных, поэтому я использую три кода, потому что я начал изучать кодирование с последних 2 месяцев.
Сэр вы можете любым кодом сохранить данные в трех разных таблицах по одному коду

OriginalGriff

О боже. Это может занять некоторое время ... Я подозреваю, что здесь есть много такого, что вы ошиблись, и это может означать большие изменения в вашей БД и приложении. Но они, вероятно, нужны.

Давайте начнем с малого: Если вы обновляете три таблицы с соответствующей информацией, то вам абсолютно необходимо использовать транзакцию - если вы этого не делаете и одна из них терпит неудачу, транзакция позволяет вам отменить (или "откатить", как это известно) все изменения до сих пор, чтобы ваша БД не была набита "осиротевшими" записями, которые вы даже не знаете, являются неполными. Существует два способа выполнения транзакций: C# предоставляет для этого классы, а SQL-команды. Посмотрите и прочитайте их для начала и решите, какой маршрут вы хотите выбрать.

Сказав это, отбросьте свою идею "трех методов": это связанные данные, поэтому вам, вероятно, понадобится информация из одной вставки, чтобы быть частью другой - и это должно быть ясно и очевидно, поэтому разделение этого на несколько методов просто добавляет сложности и увеличивает изменения проблем. Есть два способа - опять же - сделать это: три операции вставки в C# или написать хранимую процедуру в вашей базе данных и передать ей всю необходимую информацию. Что лучше всего, зависит в значительной степени от данных и ваших таблиц, ни одна из которых нам не доступна, так что вам, вероятно, придется немного почитать и здесь.

Ваши методы "AutoNumber" и "AutoDate" беспокоят меня так же, как они подразумевают, что вы сами генерируете идентификаторы строк БД, и вообще говоря, это очень плохая идея - особенно если есть какой-то шанс, что несколько пользователей когда-либо получат доступ к одной и той же БД. Вы должны использовать идентификационные поля и позволить БД сортировать нумерацию для вас - это намного, намного лучше, чем вы!

Хорошенько почитайте об этих предметах, подумайте о своем дизайне БД, а затем вернитесь с некоторыми идеями.
не используйте три метода для выполнения обновлений teh.