Pertanyaan Pengecualian EF: String atau data biner akan terpotong. Pernyataan itu telah dihentikan.


Saya telah membaca banyak posting yang terkait dengan masalah ini, tetapi tidak dapat menemukan jawaban. Saya mencoba memuat sejumlah besar data dari Excel ke dalam SQL Server. Ribuan catatan. Dan saya mendapatkan pengecualian ini:

Data string atau biner akan terpotong. Pernyataan itu telah   dihentikan.

Tentunya beberapa nilai melebihi ukuran lapangan dalam database. Kesalahan berasal dari SQL Server AFIK.


Pertanyaan saya - Bagaimana saya bisa tahu apa catatan dan apa nilai bidang yang menyebabkan ini?

Tidak ada detail spesifik dalam pengecualian EF, kecuali yang saya sebutkan.

Bantuan apa pun dihargai.

Beberapa meminta fragmen kode, tetapi sebenarnya sangat sederhana, masalahnya bukan dengan kode:

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

Juga pendekatan yang disarankan untuk digunakan DbEntityValidationException (yang hanya tersedia di Entity Framework 5.0) tidak berfungsi, menangkap blok tidak menangkap pengecualian.

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

Satu-satunya solusi yang saya temukan sejauh ini adalah menggunakan SQL Server Profiler, dan tentukan peristiwa berikut untuk memantau:

enter image description here

enter image description here

Sekarang saya dapat melihat Email terlalu panjang.


32
2017-11-14 14:41


asal


Jawaban:


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

Anda dapat menemukan informasi yang Anda butuhkan di dalam lingkaran foreach.

Semoga itu membantu.


5
2017-11-14 14:58



Anda tidak bisa di level itu. SQL Server menolak seluruh permintaan.

Saya akan menambahkan beberapa pra-cek ke data terhadap batasan basis data Anda untuk ukuran string, format tanggal, dll.

Atau Anda bisa TRIM setiap bidang string dalam data mentah ke ukuran bidang yang sesuai sebelum mencoba memasukkan.


4
2017-11-14 15:02



Anda dapat memeriksa data sebelum hemat, menggunakan metadata EF, dan naikkan kesalahan yang sesuai. Silakan periksa pendekatan berikut: http://www.entityframework.info/Home/MetadataValidation


1
2018-04-13 06:10



Tidak yakin tentang pemotongan khusus, tapi di sini adalah tip ketika Anda mendapatkan pengecualian yang memberitahu Anda untuk memeriksa EntityValidationErrors. Usuaully saat debugging tidak akan membiarkan Anda melihat properti itu (kecuali Anda sudah memiliki tangkapan eksplisit). Namun, Anda dapat membuka jam dan jenis cepat $exception. Sekarang Anda harus dapat meneliti dan menemukan properti itu. Anda juga bisa mengetikkan yang berikut:

(System.Data.Entity.Validation.DbEntityValidationException)$exception

0
2018-03-09 14:34



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);
                }
            }

Jika responseBuilder tidak kosong, maka itu berisi nama field, panjang yang diizinkan dan pesan kesalahan.


0
2017-08-12 04:20