- 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;}
Ну.... Проверка на дубликаты перед вставкой в БД. Сляпал его я, по методологии "давай-давай-быстрее!!!!а-а-а не успеваем", для показа заказчикам будущей функциональности. Сейчас переделываю с помощью паттерна Декоратор (т.к. нужно опционально проверка по ФИО+Дата рождения или СНИЛС или и то, и другое)+ввел табличку История изменений фамилий вместо столбца Старая фамилия