Вы можете изменить максимальную длину значения GROUP_CONCAT
, установив параметр group_concat_max_len
.
Подробнее см. в документации по MySQL .
// put this block in your loop
try
{
// do your insert
}
catch(SqlException ex)
{
// the exception alone won't tell you why it failed...
if(ex.Number == 2627) // <-- but this will
{
//Violation of primary key. Handle Exception
}
}
EDIT:
Вы также можете просто проверить компонент сообщения исключения. Что-то вроде этого:
if (ex.Message.Contains("UniqueConstraint")) // do stuff
try
{
// do your insert
}
catch(Exception ex)
{
if (ex.GetBaseException().GetType() == typeof(SqlException))
{
Int32 ErrorCode = ((SqlException)ex.InnerException).Number;
switch(ErrorCode)
{
case 2627: // Unique constraint error
break;
case 547: // Constraint check violation
break;
case 2601: // Duplicated key row error
break;
default:
break;
}
}
else
{
// handle normal exception
}
}
Если вы хотите поймать уникальное ограничение
try {
// code here
}
catch(Exception ex) {
//check for Exception type as sql Exception
if(ex.GetBaseException().GetType() == typeof(SqlException)) {
//Violation of primary key/Unique constraint can be handled here. Also you may //check if Exception Message contains the constraint Name
}
}
В моем случае я использую EF 6 и украсил одно из свойств моей модели:
[Index(IsUnique = true)]
Чтобы поймать нарушение, я делаю следующее, используя C # 7, это становится много проще:
protected async Task<IActionResult> PostItem(Item item)
{
_DbContext.Items.Add(item);
try
{
await _DbContext.SaveChangesAsync();
}
catch (DbUpdateException e)
when (e.InnerException?.InnerException is SqlException sqlEx &&
(sqlEx.Number == 2601 || sqlEx.Number == 2627))
{
return StatusCode(StatusCodes.Status409Conflict);
}
return Ok();
}
Обратите внимание, что это приведет к единственному нарушению ограничения индекса.