1 / 1 / 2
Регистрация: 27.05.2022
Сообщений: 178

Как понять, какой столбец неверный

10.12.2025, 23:27. Показов 1066. Ответов 16

Студворк — интернет-сервис помощи студентам
У меня есть такой метод в слое "DataAccess":
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public async Task<Result<Guid, Error>> RegisterAsync(User user, CancellationToken cancellationToken)
 {
     await webGalleryContext.Users.AddAsync(user, cancellationToken);
     
     try
     {
         await webGalleryContext.SaveChangesAsync();
     }
     catch(DbUpdateException e)
     {
    
     }
 
     return user.Id;
 }

Он нужен для регистрации пользователя. В классе User 2 поля уникальны - Email и UserName.

Как понять, в какой из столбцов была введена неправильная информация?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.12.2025, 23:27
Ответы с готовыми решениями:

Поменять местами первый столбец и столбец и столбец, где находится максимальный элемент массива
Дан двумерный массив вещественных чисел из 4 столбцов и 3 строк. Поменять местами первый столбец и...

Математическое уравнение. Получается неверный результат, не могу понять в чем причина, ошибок не выдает
namespace Work2 { class Program { static void Main(string args) { ...

Изучаю C#. Пишу программу. Не могу понять ошибку. Входная строка имела неверный формат
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

16
Эксперт .NET
 Аватар для Usaga
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
17.12.2025, 17:36
Цитата Сообщение от Oleg Shamanikov Посмотреть сообщение
Как понять, в какой из столбцов была введена неправильная информация?
Просто поискать в базе запись с такими значениями полей...
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
19.12.2025, 13:26
Oleg Shamanikov, DbUpdateException это обертка над исключением уровня ниже. Попробуйте в блоке catch проверить InnerException на наличие информации о нарушении уникальности. Тип InnerException будет зависеть от СУБД.
0
Эксперт .NET
 Аватар для Usaga
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
19.12.2025, 15:24
NewOrdered, технически, совет верный) Но вредный)
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
22.12.2025, 17:26
Цитата Сообщение от Usaga Посмотреть сообщение
Но вредный
но ведь пустой блок catch еще вреднее?
0
Эксперт .NET
 Аватар для Usaga
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
23.12.2025, 02:38
NewOrdered, вреднее, да) Только почему нельзя сделать нормально и тут идёт выбор между вредно и ещё вреднее?)
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
23.12.2025, 10:24
Цитата Сообщение от Usaga Посмотреть сообщение
сделать нормально
перед вставкой выполнить поиск? а чем плохо если СУБД сама сообщит? (я не спорю, мне интересно)
0
HF
 Аватар для HF
1312 / 890 / 200
Регистрация: 09.09.2011
Сообщений: 2,653
Записей в блоге: 2
23.12.2025, 14:20
Цитата Сообщение от NewOrdered Посмотреть сообщение
перед вставкой выполнить поиск? а чем плохо если СУБД сама сообщит? (я не спорю, мне интересно)
Что сообщит СУБД если он просто вставит то что было введено? В исключение мне кажется можно упасть ну прям вообще в исключительных случаях, если валидация модели не соответствует описанию в БД, а в данных вообще чёртичтовведено (или нулл).

P.S. Если во вставляемой модели уникальные значения, то EF упадёт? Если там ключ/идентификатор заполнен, то вроде бы SaveChangesAsync просто обновит запись и всё. И даже если (другой вариант) если Id не введён, а (к примеру) ФИО и логин существуют, то опять же EF просто вставит такую же сущность с другим ID. Упасть вроде бы сложно.

Цитата Сообщение от Oleg Shamanikov Посмотреть сообщение
Он нужен для регистрации пользователя. В классе User 2 поля уникальны - Email и UserName.
Как понять, в какой из столбцов была введена неправильная информация?
Вот изначально уже другие вопросы напрашивались - что по его мнению "неправильная информация"?
0
Эксперт .NET
 Аватар для Usaga
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
23.12.2025, 16:31
Цитата Сообщение от NewOrdered Посмотреть сообщение
перед вставкой выполнить поиск? а чем плохо если СУБД сама сообщит? (я не спорю, мне интересно)
С EF'ом - да, проверка, потом - вставка. На голом SQL (или Linq2db) можно было бы свести к одной атомарной операции (UPSERT, MERGE, INSERT + WHERE NOT EXISTS), где результатом будет количество вставленных строк. Если "0", значит дубликат. Побуждать базу (и ADO.NET) возбуждать ошибки там, где можно действовать тоньше и штатными средствами - такое себе.

Цитата Сообщение от HF Посмотреть сообщение
Если во вставляемой модели уникальные значения, то EF упадёт?
Это не EF упадёт, это со стороны базы прилетит ошибка)
0
HF
 Аватар для HF
1312 / 890 / 200
Регистрация: 09.09.2011
Сообщений: 2,653
Записей в блоге: 2
23.12.2025, 23:13
Цитата Сообщение от Usaga Посмотреть сообщение
Это не EF упадёт, это со стороны базы прилетит ошибка)
Это я и имел ввиду. Непонятно написал.

Но для этого написал свои рассуждения и вопросы.
Упадёт если EF попытается выполнить вставку. Но раз метод используется SaveChangesAsync, значит всё будет зависеть от того, поймёт он что объект уже существует с данными ключами или нет. Как у него уникальность проверяется? это ключи или просто индекс?
0
Эксперт .NET
 Аватар для Usaga
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
24.12.2025, 02:18
Цитата Сообщение от HF Посмотреть сообщение
поймёт он что объект уже существует с данными ключами или нет. Как у него уникальность проверяется? это ключи или просто индекс?
Это не EF проверять будет уникальность, а база. От EF'а тут сгенерировать запрос INSERT (...) VALUES (...) ; SELECT SCOPE_IDENTITY() и скормить базе. Ну и если ошибка будет, то попробовать понять какая и в специфичное исключение завернуть.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
25.12.2025, 15:39
Цитата Сообщение от Usaga Посмотреть сообщение
С EF'ом - да, проверка, потом - вставка.
дилетантский вопрос: как в этом случае решать вопрос с race conditions (не случай ТС, а общий)?
0
Эксперт .NET
 Аватар для Usaga
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
25.12.2025, 17:02
NewOrdered, это не дилетантский вопрос. EF такое атомарно не даёт сделать (из-за его дизайна), хотя СУБД такое поддерживают.

Тут либо сначала сделать проверку на наличие записи, а потом произвести вставку с обработкой исключения (после проверки нет гарантии, что запись не появится в другой транзакции), либо опускаться до голого SQL. Либо поменять ORM)
1
HF
 Аватар для HF
1312 / 890 / 200
Регистрация: 09.09.2011
Сообщений: 2,653
Записей в блоге: 2
26.12.2025, 00:11
Цитата Сообщение от Usaga Посмотреть сообщение
либо опускаться до голого SQL. Либо поменять ORM)
И это решает проблему? Вроде бы никто ничего красивого не изобрёл ещё, а значит или просто упадут в исключение или уйдут в блокировку (и только надеяться что всё быстро закончится). Не так? Интересно было бы узнать вдруг что-то новое придумали (или чёткий сценарий, или удобное управление через ОРМ, или ещё что).
0
Эксперт .NET
 Аватар для Usaga
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
26.12.2025, 03:24
Цитата Сообщение от HF Посмотреть сообщение
И это решает проблему?
Ты про какую часть цитаты?) Про голый SQL или смену ORM? Вроде бы давно всё придумано.

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using LinqToDB;
using LinqToDB.Data;
using LinqToDB.DataProvider.SqlServer;
using Microsoft.Data.SqlClient;
 
const string ConnString = "...";
 
// INSERT ... WHEN NOT EXISTS
 
TearUp();
 
try
{
    using var conn = new SqlConnection(ConnString);
    conn.Open();
 
    var sql =
        """
        insert into UniqTest (email)
        select * from
        (
            values (N'test@test.com')
        ) as v(email)
        where not exists
        (
            select 1 from UniqTest where email = N'test@test.com'
        )
        """;
 
    using var cmd = new SqlCommand(sql, conn);
 
    System.Console.WriteLine("count: " + cmd.ExecuteNonQuery()); // 1
    System.Console.WriteLine("count: " + cmd.ExecuteNonQuery()); // 0
}
finally
{
    TearDown();
}
 
// MERGE INTO
 
TearUp();
 
try
{
    using var conn = new SqlConnection(ConnString);
    conn.Open();
 
    var sql =
        """
        merge UniqTest as t
        using 
        (
            values (N'test@test.com')
        ) as s(email)
        on t.email = s.email
        when not matched by target then
        insert (email) values(s.email);
        """;
 
    using var cmd = new SqlCommand(sql, conn);
 
    System.Console.WriteLine("count: " + cmd.ExecuteNonQuery()); // 1
    System.Console.WriteLine("count: " + cmd.ExecuteNonQuery()); // 0
}
finally
{
    TearDown();
}
 
// LINQ2DB: INSERT ... WHEN NOT EXISTS
 
TearUp();
 
try
{
    using var conn = new DataConnection(
        new DataOptions()
            .UseConnectionString(ConnString)
            .UseSqlServer(SqlServerVersion.v2022, SqlServerProvider.MicrosoftDataSqlClient)); 
 
    var uniqTest  = conn.GetTable<UniqTest>();
    var construct = new [] { new UniqTest{ Email = "test@test.com" }}.AsQueryable(conn);
 
    var query = construct
        .Where(x => !uniqTest.Any(y => y.Email == x.Email))
        .Into(uniqTest);
 
    System.Console.WriteLine("count: " + query.Insert()); // 1
    System.Console.WriteLine("count: " + query.Insert()); // 0
}
finally
{
    TearDown();
}
 
// LINQ2DB: MERGE INTO
 
TearUp();
 
try
{
    using var conn = new DataConnection(
        new DataOptions()
            .UseConnectionString(ConnString)
            .UseSqlServer(SqlServerVersion.v2022, SqlServerProvider.MicrosoftDataSqlClient)); 
 
    var construct = new [] { new UniqTest{ Email = "test@test.com" }};
 
    var query = conn.GetTable<UniqTest>()
        .Merge()
        .Using(construct)
        .On((s, t) => t.Email == s.Email)
        .InsertWhenNotMatched();
 
    System.Console.WriteLine("count: " + query.Merge()); // 1
    System.Console.WriteLine("count: " + query.Merge()); // 0
}
finally
{
    TearDown();
}
 
void TearUp()
{
    using var conn = new SqlConnection(ConnString);
    using var cmd = new SqlCommand("create table UniqTest(email nvarchar(100), constraint uc_UniqTest_email unique (email))", conn);
    conn.Open();
    cmd.ExecuteNonQuery();
}
 
void TearDown()
{
    using var conn = new SqlConnection(ConnString);
    using var cmd = new SqlCommand("drop table UniqTest", conn);
    conn.Open();
    cmd.ExecuteNonQuery();
}
 
// LINQ2DB
class UniqTest
{
    public string Email { get; set; }
}
1
HF
 Аватар для HF
1312 / 890 / 200
Регистрация: 09.09.2011
Сообщений: 2,653
Записей в блоге: 2
26.12.2025, 14:40
Цитата Сообщение от Usaga Посмотреть сообщение
Ты про какую часть цитаты?) Про голый SQL или смену ORM?
Вот как процитировал, про то и говорил. Про оба. Хотя нет, основная мысль моя была про "race conditions".

Цитата Сообщение от Usaga Посмотреть сообщение
Вроде бы давно всё придумано.
Спасибо. Красивые примеры (прям для документации ).
Ну грубо говоря, везде присутствует предварительная проверка на наличие какого-то идентификатора/ключа. Тогда здесь получается решение на вставку. А чтобы проапдейдить, видимо условий больше нужно будет добавлять.

Но я то всё про "race conditions". Если твоя вставка/обновление обёрнута в транзакцию с блокировкой и одновременно другой пытается вставить. Что произойдёт?
0
Эксперт .NET
 Аватар для Usaga
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
26.12.2025, 16:16
Цитата Сообщение от HF Посмотреть сообщение
А чтобы проапдейдить, видимо условий больше нужно будет добавлять.
Нет. Всё тоже самое.

Цитата Сообщение от HF Посмотреть сообщение
Но я то всё про "race conditions". Если твоя вставка/обновление обёрнута в транзакцию с блокировкой и одновременно другой пытается вставить. Что произойдёт?
Будет тоже самое, что обычно. Либо запрос отработает в холостую (Count == 0), либо отлетит (сразу или с задержкой; зависит от типа изоляции транзакции и СУБД) с жалобой на конфликт транзакций. Главное, что в такой подаче запрос является атомарным для базы. И его поведение будет точно предсказуемым.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.12.2025, 16:16
Помогаю со студенческими работами здесь

Как в datagridview заменить столбец из одной таблицы на столбец из второй?
Существуют 2 таблицы:&quot;Storage&quot; и &quot;Managers&quot;. В таблице &quot;Managers&quot; указано &quot;Managers_ID&quot; и &quot;FIO&quot;....

Найти столбец в котором сумма элементов максимальна. Вывести значение суммы и столбец на экран
Найти столбец в котором сумма элементов максимальна. Вывести значение суммы и столбец на экран

Переставить местами столбец с наибольшим количеством нулевых элементов и столбец последний по порядку следования
Написать процедуру для заданного массива B (4, 5), переставить местами столбец с наибольшим...

Поменять местами второй столбец и столбец, в котором находится последний элемент, больший 10
Поменять местами второй столбец и столбец, в котором находится последний элемент, больший 10....

Что-то я не понял - Входная строка имела неверный формат
Имеется необходимость конвертации значения из TextBox в переменную double. Но при попытке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru