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" должен дать вам необходимую информацию.
Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.
Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!
OriginalGriff
О боже. Это может занять некоторое время ... Я подозреваю, что здесь есть много такого, что вы ошиблись, и это может означать большие изменения в вашей БД и приложении. Но они, вероятно, нужны.
Давайте начнем с малого: Если вы обновляете три таблицы с соответствующей информацией, то вам абсолютно необходимо использовать транзакцию - если вы этого не делаете и одна из них терпит неудачу, транзакция позволяет вам отменить (или "откатить", как это известно) все изменения до сих пор, чтобы ваша БД не была набита "осиротевшими" записями, которые вы даже не знаете, являются неполными. Существует два способа выполнения транзакций: C# предоставляет для этого классы, а SQL-команды. Посмотрите и прочитайте их для начала и решите, какой маршрут вы хотите выбрать.
Сказав это, отбросьте свою идею "трех методов": это связанные данные, поэтому вам, вероятно, понадобится информация из одной вставки, чтобы быть частью другой - и это должно быть ясно и очевидно, поэтому разделение этого на несколько методов просто добавляет сложности и увеличивает изменения проблем. Есть два способа - опять же - сделать это: три операции вставки в C# или написать хранимую процедуру в вашей базе данных и передать ей всю необходимую информацию. Что лучше всего, зависит в значительной степени от данных и ваших таблиц, ни одна из которых нам не доступна, так что вам, вероятно, придется немного почитать и здесь.
Ваши методы "AutoNumber" и "AutoDate" беспокоят меня так же, как они подразумевают, что вы сами генерируете идентификаторы строк БД, и вообще говоря, это очень плохая идея - особенно если есть какой-то шанс, что несколько пользователей когда-либо получат доступ к одной и той же БД. Вы должны использовать идентификационные поля и позволить БД сортировать нумерацию для вас - это намного, намного лучше, чем вы!
Хорошенько почитайте об этих предметах, подумайте о своем дизайне БД, а затем вернитесь с некоторыми идеями.
не используйте три метода для выполнения обновлений teh.