programing

EF 예외:문자열 또는 이진 데이터가 잘립니다.문이 종료되었습니다.?

closeapi 2023. 8. 19. 10:18
반응형

EF 예외:문자열 또는 이진 데이터가 잘립니다.문이 종료되었습니다.?

저는 이 문제와 관련된 게시물을 많이 읽었지만 답을 찾을 수 없었습니다.저는 엑셀에서 SQL Server로 많은 양의 데이터를 로드하려고 합니다.수천 개의 레코드.그리고 나는 이 예외를 받고 있습니다.

문자열 또는 이진 데이터가 잘립니다.문이 종료되었습니다.

분명히 일부 값이 데이터베이스의 필드 크기를 초과합니다.SQL Server AFIK에서 오류가 발생했습니다.


질문 - 어떤 기록과 어떤 필드 값이 이 문제의 원인인지 어떻게 알 수 있습니까?

EF 예외에 대해서는 제가 언급한 내용을 제외하고는 구체적인 내용이 없습니다.

어떤 도움이든 감사합니다.

일부는 코드 조각을 요청했지만 실제로 매우 간단합니다. 문제는 코드가 아닙니다.

// employees is a List<Employee> collection loaded from Excel
using (var context = new Entities())
{
    employees.ForEach(e => context.Employee.AddObject(e));
    context.SaveChanges();
}

또한 DbEntityValidation을 사용하기 위한 제안된 접근 방식예외(Entity Framework 5.0에서만 사용 가능)가 작동하지 않고, 캐치 블록이 예외를 감지하지 못했습니다.

try
{
    ImportData();
}
catch (DbEntityValidationException ex)
{
    foreach (var item in ex.EntityValidationErrors)
    {
        //...
    }
}

지금까지 찾은 유일한 솔루션은 SQL Server Profiler를 사용하여 모니터링할 다음 이벤트를 정의하는 것입니다.

enter image description here

enter image description here

이제 이메일이 너무 길다는 것을 알 수 있습니다.

그 수준에서는 안 됩니다.SQL Server에서 전체 쿼리를 거부합니다.

문자열 크기, 날짜 형식 등에 대한 데이터베이스 제약 조건에 대해 데이터에 몇 가지 사전 검사를 추가합니다.

대신에 당신은 할 수 있습니다.TRIM삽입을 시도하기 전에 원시 데이터의 각 문자열 필드를 해당 필드 크기로 변환합니다.

catch (DbEntityValidationException ex)
{
    foreach (var item in ex.EntityValidationErrors)
    {
        //... inspect here 
    }
}

각 루프에 대해 내부에서 필요한 정보를 찾을 수 있습니다.

도움이 되길 바랍니다.

저장하기 전에 데이터를 확인하고 EF 메타데이터를 사용하여 적절한 오류를 발생시킬 수 있습니다.

잘라내기에 대해서는 구체적으로 확실하지 않지만 Entity Validation Errors(엔티티 유효성 검사 오류)를 검사하라는 예외가 발생하는 경우에 대한 팁이 있습니다.일반적으로 디버깅할 때는 해당 속성을 볼 수 없습니다(이미 명시적으로 캡처하지 않은 경우).그러나 빠른 시계를 열고 입력할 수 있습니다.$exception이제 당신은 구멍을 뚫고 그 속성을 찾을 수 있을 것입니다.또한 다음을 입력할 수도 있습니다.

(System.Data.Entity.Validation.DbEntityValidationException)$exception
private static string FindLongStrings(object testObject)
    {
        foreach (PropertyInfo propInfo in testObject.GetType().GetProperties())
        {
            foreach (ColumnAttribute attribute in propInfo.GetCustomAttributes(typeof(ColumnAttribute), true))
            {
                if (attribute.DbType.ToLower().Contains("varchar"))
                {
                    string dbType = attribute.DbType.ToLower();
                    int numberStartIndex = dbType.IndexOf("varchar(") + 8;
                    int numberEndIndex = dbType.IndexOf(")", numberStartIndex);
                    string lengthString = dbType.Substring(numberStartIndex, (numberEndIndex - numberStartIndex));
                    int maxLength = 0;
                    int.TryParse(lengthString, out maxLength);

                    string currentValue = (string)propInfo.GetValue(testObject, null);

                    if (!string.IsNullOrEmpty(currentValue) && currentValue.Length > maxLength && lengthString!="max")
                        return testObject.GetType().Name + "." + propInfo.Name + " " + currentValue + " Max: " + maxLength;

                }
            }
        }
        return "";
    }


foreach (object insert in dtx.GetChangeSet().Inserts)
            {
                string result = FindLongStrings(insert);
                if (string.IsNullOrEmpty(result) == false)
                {
                    responseBuilder.Append(result);
                }
            }

responseBuilder가 비어 있지 않으면 필드 이름, 허용된 길이 및 오류 메시지가 포함됩니다.

저는 그 문제를 두 번 겪었고, 문제는 EF가 데이터베이스에 테이블을 만들 때, 그것이 설정된다는 것입니다.varchar(1)속성에 것이므로 수. . 따라서 길이 때문에 정보를 삽입할 수 없습니다. 표의 필드를 확인하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/13380972/ef-exception-string-or-binary-data-would-be-truncated-the-statement-has-been-t

반응형