- 001
 - 002
 - 003
 - 004
 - 005
 - 006
 - 007
 - 008
 - 009
 - 010
 - 011
 - 012
 - 013
 - 014
 - 015
 - 016
 - 017
 - 018
 - 019
 - 020
 - 021
 - 022
 - 023
 - 024
 - 025
 - 026
 - 027
 - 028
 - 029
 - 030
 - 031
 - 032
 - 033
 - 034
 - 035
 - 036
 - 037
 - 038
 - 039
 - 040
 - 041
 - 042
 - 043
 - 044
 - 045
 - 046
 - 047
 - 048
 - 049
 - 050
 - 051
 - 052
 - 053
 - 054
 - 055
 - 056
 - 057
 - 058
 - 059
 - 060
 - 061
 - 062
 - 063
 - 064
 - 065
 - 066
 - 067
 - 068
 - 069
 - 070
 - 071
 - 072
 - 073
 - 074
 - 075
 - 076
 - 077
 - 078
 - 079
 - 080
 - 081
 - 082
 - 083
 - 084
 - 085
 - 086
 - 087
 - 088
 - 089
 - 090
 - 091
 - 092
 - 093
 - 094
 - 095
 - 096
 - 097
 - 098
 - 099
 - 100
 
                        private Duplicate CheckForDuplicate(object name, object surname, object patronymic, object birthday, object oldSurname, out List<long> duplicateRowIDs)
        {
            duplicateRowIDs = new List<long>();
            DataTable _idDuplicateRowTable = new DataTable();
            //Проверка на полные дубликаты
            _idDuplicateRowTable = SqlWrapper.ExecuteQuery(
                @"
                    SELECT id
                    FROM [Физические лица]
                    WHERE [Физические лица].Фамилия=@param0
                        AND [Физические лица].Имя=@param1
                        AND [Физические лица].Отчество=@param2
                        AND [Физические лица].[Дата рождения]=@param3
                        AND (( @param4 IS NOT NULL AND [Физические лица].[Старая фамилия]=@param4 )
                            OR (@param4 IS NULL AND [Физические лица].[Старая фамилия] IS NULL ))                       
                 ",
                  surname, name, patronymic, birthday, oldSurname
                ).Tables[0];
            if (_idDuplicateRowTable.Rows.Count == 1)
            {
                duplicateRowIDs.Add((long)_idDuplicateRowTable.Rows[0]["id"]);
                return Duplicate.Fully;
            }
            //Несколько полных дубликатов
            if (_idDuplicateRowTable.Rows.Count > 1)
            {
                foreach (DataRow duplicate in _idDuplicateRowTable.Rows)
                {
                    duplicateRowIDs.Add((long)duplicate["id"]);
                }
                return Duplicate.SomeFullyDuplicates;
            }
            //Проверяем только ФИО+дата рождения
            _idDuplicateRowTable = SqlWrapper.ExecuteQuery(
                @"
                    SELECT id, [Старая фамилия]
                    FROM [Физические лица]
                    WHERE [Физические лица].Фамилия=@param0
                        AND [Физические лица].Имя=@param1
                        AND [Физические лица].Отчествo=@param2
                        AND [Физические лица].[Дата рождения]=@param3
                 ",
                  surname, name, patronymic, birthday
                ).Tables[0];
            if (_idDuplicateRowTable.Rows.Count == 1)
            {
                if (_idDuplicateRowTable.Rows[0]["Старая фамилия"].Equals(DBNull.Value) && oldSurname is String)//Если стар. фамилия в БД == null & в файле != null 
                {
                    duplicateRowIDs.Add((long)_idDuplicateRowTable.Rows[0]["id"]);
                    return Duplicate.OldSurnameDiff;
                }
                duplicateRowIDs.Add((long)_idDuplicateRowTable.Rows[0]["id"]);
                return Duplicate.ErrOldSurname;
            }
            else if (_idDuplicateRowTable.Rows.Count > 1)
            {
                foreach (DataRow row in _idDuplicateRowTable.Rows)
                {
                    duplicateRowIDs.Add((long)row["id"]);
                }
                return Duplicate.SomeBaseDuplicates;
            }
            return Duplicate.NonDuplicate;
        }
        private bool IsPotentilaDuplicate(object name, object surname, object patronymic, object birthday, object oldSurname)
        {
            bool _isPotentilaDuplicate = false;
            //Проверяем, не станет ли строка дубликатом, после изменения
            //Только по ФИО+дате рождения
            DataTable _ponentialDuplicates1 = SqlWrapper.ExecuteQuery(
                @"
                    SELECT id
                    FROM [Физические лица]
                    WHERE [Физические лица].Фамилия=@param0
                        AND [Физические лица].Имя=@param1
                        AND [Физические лица].Отчество=@param2
                        AND [Физические лица].[Дата рождения]=@param3
                 ",
                  oldSurname, name, patronymic, birthday
                ).Tables[0];
            //Полное совпадение
            DataTable _ponentialDuplicates2 = SqlWrapper.ExecuteQuery(
                @"
                    SELECT id
                    FROM [Физические лица]
                    WHERE [Физические лица].Фамилия=@param0
                        AND [Физические лица].Имя=@param1
                        AND [Физические лица].Отчество=@param2
                        AND [Физические лица].[Дата родения]=@param3
                        AND [Физические лица].[Старая фамилия]=@param4
                 ",
                  oldSurname, name, patronymic, birthday, surname
                ).Tables[0];
            if (_ponentialDuplicates1.Rows.Count > 0 || _ponentialDuplicates2.Rows.Count > 0)
            {
                _isPotentilaDuplicate = true;
            }
            return _isPotentilaDuplicate;}
                                     
        
            Ну.... Проверка на дубликаты перед вставкой в БД. Сляпал его я, по методологии "давай-давай-быстрее!!!!а-а-а не успеваем", для показа заказчикам будущей функциональности. Сейчас переделываю с помощью паттерна Декоратор (т.к. нужно опционально проверка по ФИО+Дата рождения или СНИЛС или и то, и другое)+ввел табличку История изменений фамилий вместо столбца Старая фамилия