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를 사용하여 모니터링할 다음 이벤트를 정의하는 것입니다.
이제 이메일이 너무 길다는 것을 알 수 있습니다.
그 수준에서는 안 됩니다.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
'programing' 카테고리의 다른 글
텍스트 영역의 문자 수 (0) | 2023.08.19 |
---|---|
c.의 EOF의 아스키 값은 얼마입니까? (0) | 2023.08.19 |
파워셸에서 지능을 얻을 수 있습니까? (0) | 2023.08.19 |
열 이름과 ncol이 일치하지 않을 때 MySQL 테이블에 데이터 프레임 열 매핑 (0) | 2023.08.19 |
그룹화 기준을 사용한 장고 SQL Windows 함수 (0) | 2023.08.14 |