Gagal mengaktifkan batasan. Satu atau lebih baris berisi nilai yang melanggar batasan non-null, unik, atau kunci asing


168

Saya membuat gabung luar dan dieksekusi dengan sukses di informixdatabase tetapi saya mendapatkan pengecualian berikut dalam kode saya:

DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat);

Gagal mengaktifkan batasan. Satu atau lebih baris berisi nilai yang melanggar batasan non-null, unik, atau kunci asing.

Saya tahu masalahnya, tetapi saya tidak tahu bagaimana cara memperbaikinya.

Tabel kedua saya membuat gabungan luar berisi kunci primer komposit yang nol dalam permintaan bergabung luar sebelumnya.

EDIT:

    SELECT UNIQUE a.crs_e,  a.crs_e  || '/ ' || a.crst crs_name, b.period,
           b.crscls, c.crsday, c.from_lect, c.to_lect,
           c.to_lect - c.from_lect + 1 Subtraction, c.lect_kind, e.eval, e.batch_no,
           e.crsnum, e.lect_code, e.prof_course
    FROM rlm1course a, rfc14crsgrp b, ckj1table c, mnltablelectev d,
         OUTER(cc1assiscrseval e)  
    WHERE a.crsnum = b.crsnum 
    AND b.crsnum = c.crsnum 
    AND b.crscls = c.crscls 
    AND b.batch_no = c.batch_no 
    AND c.serial_key = d.serial_key  
    AND c.crsnum = e.crsnum  
    AND c.batch_no = e.batch_no  
    AND d.lect_code= e.lect_code 
    AND d.lect_code = .... 
    AND b.batch_no = ....

Masalahnya terjadi dengan tabel cc1assiscrseval. Kunci utama adalah (batch_no, crsnum, lect_code).

Bagaimana cara mengatasi masalah ini?


EDIT:

Menurut @PaulStocksaran: Saya melakukan apa yang dia katakan, dan saya mendapatkan:

? dt.GetErrors () [0] {System.Data.DataRow} HasErrors: true ItemArray: {object [10]} RowError: "Kolom 'eval' tidak memungkinkan DBNull.Value."

Jadi saya memecahkan masalah saya dengan mengganti e.evalke, NVL (e.eval,'') evaldan ini memecahkan masalah saya. Terima kasih banyak.


Ketika saya menghapus ,e.eval,e.batch_no,e.crsnum,e.lect_code,e.prof_courseDari kueri semuanya berjalan dengan baik. apa masalahnya silakan
Anyname Donotcare

Ada juga bug di ADO.NET di mana "indeks cluster tidak unik" akan membuat data Data.UniqueConstraint yang salah pada DataTable.
Brain2000

Jawaban:


352

Masalah ini biasanya disebabkan oleh salah satu dari berikut ini

  • nilai null dikembalikan untuk kolom yang tidak disetel ke AllowDBNull
  • baris duplikat dikembalikan dengan kunci utama yang sama.
  • ketidakcocokan dalam definisi kolom (misalnya ukuran bidang char) antara database dan dataset

Coba jalankan kueri Anda secara asli dan lihat hasilnya, jika hasilnya tidak terlalu besar. Jika Anda telah menghilangkan nilai nol, maka tebakan saya adalah kolom kunci utama sedang digandakan.

Atau, untuk melihat kesalahan sebenarnya, Anda dapat secara manual menambahkan blok Coba / Tangkap ke kode yang dihasilkan seperti begitu dan kemudian memecah ketika pengecualian muncul:

masukkan deskripsi gambar di sini

Kemudian di dalam jendela perintah, panggil GetErrorsmetode di atas meja untuk mendapatkan kesalahan.
Untuk C #, perintahnya adalah ? dataTable.GetErrors()
Untuk VB, perintahnya adalah? dataTable.GetErrors

masukkan deskripsi gambar di sini

Ini akan menampilkan semua flatows yang memiliki kesalahan. Anda bisa mendapatkan kemudian RowErroruntuk masing-masing, yang akan memberi tahu Anda kolom yang tidak valid bersama dengan masalah. Jadi, untuk melihat kesalahan flatow pertama dalam kesalahan perintahnya adalah:
? dataTable.GetErrors(0).RowError
atau dalam C # itu akan menjadi? dataTable.GetErrors()[0].RowError

masukkan deskripsi gambar di sini


4
Terima kasih banyak . >? dt.GetErrors()[0] {System.Data.DataRow} HasErrors: true ItemArray: {object[10]} RowError: "Column 'eval' does not allow DBNull.Value."
Anyname Donotcare

4
Luar biasa. Itu tidak berhasil, tapi saya bisa menambahkan arloji untuk dataset dan ketik .GetErrors setelah itu dan perluas nilainya. Itu sangat berguna. Semoga saya tidak akan melupakannya sebelum waktu berikutnya saya membutuhkannya :)
dwidel

6
Ya ini benar-benar membantu - alasan kesalahan saya adalah panjang bidang lebih panjang dari maxLength kolom pada adaptor tabel. Satu hal yang saya perhatikan adalah bahwa untuk mencapai breakpoint dalam file desainer, Anda harus pergi ke Tools> Options> Debugging, dan pastikan "Enable Just My Code" tidak dicentang. Ini kemudian akan memungkinkan Anda untuk menelusuri kode file desainer.
e-on

1
Terima kasih @PaulStock untuk Anda menjawab, saya punya masalah yang sama saya pecahkan.
Uday

1
Ini sangat berguna, saya menemukan ketidakcocokan antara panjang kolom data - itu meningkat dalam database dan tidak dalam dataset.
Rob

38

Anda dapat menonaktifkan batasan pada dataset. Ini akan memungkinkan Anda untuk mengidentifikasi data yang buruk dan membantu menyelesaikan masalah.

misalnya

dataset.TableA.Clear();
dataset.EnforceConstraints = false;
dataAdapter1.daTableA.Fill(dataset, TableA");

Metode pengisian mungkin sedikit berbeda untuk Anda.


1
Ini membantu saya menemukan data yang menyebabkan masalah saya, yang bukan "data buruk" tetapi perilaku yang buruk dari Wisaya Konfigurasi Sumber Data. Tampaknya tidak mendapatkan kendala kolom direvisi (dan saya kehilangan tabel ditambahkan untuk boot), terlepas dari keluar dan berbicara dengan DB ... dan dengan cache tidak diaktifkan.
fortboise

Terima kasih atas jawaban ini. Saya punya masalah Case Sensitive dan hanya perlu mengaturnya dengan tepat di Dataset.
Dan

10

Ini akan menemukan semua baris dalam tabel yang memiliki kesalahan, mencetak kunci utama baris dan kesalahan yang terjadi pada baris itu ...

Ini dalam C #, tetapi mengubahnya menjadi VB seharusnya tidak sulit.

 foreach (DataRow dr in dataTable)
 {
   if (dr.HasErrors)
     {
        Debug.Write("Row ");
        foreach (DataColumn dc in dataTable.PKColumns)
          Debug.Write(dc.ColumnName + ": '" + dr.ItemArray[dc.Ordinal] + "', ");
        Debug.WriteLine(" has error: " + dr.RowError);
     }
  }

Ups - maaf PKColumns adalah sesuatu yang saya tambahkan ketika saya memperluas DataTable yang memberi tahu saya semua kolom yang membentuk kunci utama dari DataTable. Jika Anda tahu kolom Primary Key di dataat Anda, Anda bisa mengulanginya di sini. Dalam kasus saya, karena semua data saya tahu col PK mereka, saya dapat menulis debug untuk kesalahan ini secara otomatis untuk semua tabel.

Outputnya terlihat seperti ini:

Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J',  has error: Column 'HAIR_COLOR' does not allow DBNull.Value.

Jika Anda bingung tentang bagian Kolom PKC di atas - ini akan mencetak nama dan nilai kolom, dan tidak perlu, tetapi menambahkan info pemecahan masalah yang bermanfaat untuk mengidentifikasi nilai kolom mana yang mungkin menyebabkan masalah. Menghapus bagian ini dan menyimpan sisanya masih akan mencetak kesalahan SQLite yang dihasilkan, yang akan mencatat kolom yang memiliki masalah.


1
Cara cemerlang untuk mencari tahu di mana letak kesalahannya. Benar-benar membantu saya memahami masalah dalam solusi yang saya warisi di mana ada inkonsistensi dengan data. Meskipun itu pada DataSet dan saya hanya mengulangi setiap tabel, lalu setiap baris. +10 jika aku bisa.
Andez

Ini berhasil untuk saya. Itu adalah Column 'MyColumn' does not allow DBNull.Value, tapi itu tidak akan menunjukkan cara lain. Terima kasih :)
Alex

7
  • Pastikan bidang yang disebutkan dalam kueri adaptor tabel cocok dengan kueri yang telah Anda tetapkan. DAL tampaknya tidak menyukai ketidakcocokan. Ini biasanya akan terjadi pada sprocs dan kueri Anda setelah Anda menambahkan bidang baru ke tabel.

  • Jika Anda telah mengubah panjang bidang varchar dalam database dan XML yang terkandung dalam file XSS belum mengambilnya, cari nama bidang dan definisi atribut dalam XML dan ubah secara manual.

  • Hapus kunci utama dari daftar pilih dalam adapter tabel jika mereka tidak terkait dengan data yang dikembalikan.

  • Jalankan kueri Anda di SQL Management Studio dan pastikan tidak ada rekaman duplikat yang dikembalikan. Duplikat catatan dapat menghasilkan duplikat kunci utama yang akan menyebabkan kesalahan ini.

  • Serikat SQL dapat mengeja masalah. Saya memodifikasi satu adaptor tabel dengan menambahkan catatan 'silakan pilih karyawan' sebelum yang lain. Untuk bidang lain saya memberikan data dummy termasuk, misalnya, string satu panjang. DAL menyimpulkan skema dari catatan awal itu. Catatan berikut dengan string dengan panjang 12 gagal.


1
Selamat datang di SO, Bob. Saya telah mengedit jawaban Anda (masih dalam tinjauan, meskipun). Misalnya, kami memilih untuk tidak memiliki salam dan tanda tangan dalam jawaban (itu dianggap "noice", silakan lihat FAQ). Nama dan gravatar Anda akan selalu muncul di bawah jawabannya.
Christoffer Lette

5

Ini bekerja untuk saya, sumber: sini

Saya memiliki kesalahan ini dan tidak terkait dengan batasan DB (setidaknya dalam kasus saya). Saya memiliki file .xsd dengan kueri GetRecord yang mengembalikan sekelompok catatan. Salah satu kolom dari tabel itu adalah "nvarchar (512)" dan di tengah proyek saya perlu mengubahnya ke "nvarchar (MAX)".

Semuanya berfungsi dengan baik sampai pengguna memasukkan lebih dari 512 pada bidang itu dan kami mulai mendapatkan pesan kesalahan terkenal "Gagal mengaktifkan kendala. Satu atau lebih baris berisi nilai yang melanggar batasan non-null, unik, atau batasan kunci asing."

Solusi: Periksa semua properti MaxLength dari kolom di DataTable Anda.

Kolom yang saya ubah dari "nvarchar (512)" menjadi "nvarchar (MAX)" masih memiliki nilai 512 pada properti MaxLength jadi saya mengubah ke "-1" dan berfungsi !!


Masalah saya pasti MaxLength juga. Saya menggunakan desainer data VWD 2010. Tabel sumber diubah oleh orang lain. Saya memodifikasi SQL Query select *, berpikir itu akan menyegarkan semua kolom, tetapi ternyata tidak memperbarui panjang yang ada. Jadi saya memodifikasi kueri untuk memilih satu bidang, menyimpan .xsd, membuka .xsd di Notepad ++ untuk memeriksa bahwa semua kecuali satu dari kekurangan MaxLength telah hilang, kemudian memodifikasi kueri lagi menjadi select *. ITU menyegarkan MaxLengths dan membuat saya melewati kesalahan ini.
Mark Berry

Terima kasih banyak, saya telah menggaruk-garuk kepala saya satu hari ini karena semuanya melaporkan kembali baik-baik saja. Saya juga harus mengubah ke nvarchar (MAX), tetapi DataTable menjaga MaxLength pada 10! Saya berhutang minuman!
Jon D

4

Masalahnya adalah dengan desainer Akses Data. Di Visual Studio, Ketika kami menarik Tampilan dari "Server Explorer" ke jendela Designer, itu menambahkan kunci primer pada kolom secara acak atau menandai sesuatu ke NOT NULL meskipun sebenarnya diatur ke nol. Meskipun penciptaan Lihat aktual di server SQL db, tidak memiliki kunci primer yang ditentukan atau TIDAK NULL yang ditentukan, perancang VS menambahkan Kunci / batasan ini.

Anda dapat melihat ini di perancang - ini ditampilkan dengan ikon kunci di sebelah kiri nama kolom.

Solusi: Klik kanan pada ikon kunci dan pilih 'Hapus Kunci'. Ini harus menyelesaikan masalah. Anda juga dapat mengklik kanan pada kolom dan memilih "Properti" untuk melihat daftar properti kolom di perancang akses Data VS dan mengubah nilainya dengan tepat.


3

Kesalahan ini juga muncul di proyek saya. Saya mencoba semua solusi yang diusulkan diposting di sini, tetapi tidak berhasil sama sekali karena masalahnya tidak ada hubungannya dengan ukuran bidang, definisi bidang kunci tabel, kendala atau variabel dataset EnforceConstraints.

Dalam kasus saya, saya juga memiliki objek .xsd yang saya letakkan di sana selama waktu desain proyek (Lapisan Akses Data). Saat Anda menyeret objek tabel database Anda ke item visual Dataset, ia membaca setiap definisi tabel dari database yang mendasari dan menyalin kendala ke objek Dataset persis seperti yang Anda tetapkan saat Anda membuat tabel dalam database Anda (SQL Server 2008 R2 di saya kasus). Ini berarti bahwa setiap kolom tabel yang dibuat dengan batasan "bukan null" atau "kunci asing" juga harus ada dalam hasil pernyataan SQL atau prosedur tersimpan Anda.

Setelah saya memasukkan semua kolom kunci dan kolom yang didefinisikan sebagai "bukan nol" ke dalam pertanyaan saya, masalahnya hilang sepenuhnya.


3

Milik saya mulai bekerja ketika saya mengatur AllowDBNullke True pada bidang tanggal pada tabel data dalam file xsd.


2

Kedengarannya seperti satu atau lebih kolom yang dipilih dengan:

   e.eval, e.batch_no, e.crsnum, e.lect_code, e.prof_course

memiliki AllowDBNull yang disetel ke False dalam definisi Dataset Anda.


Saya menempatkan allow null = true untuk semua kolom dalam tabel ini tetapi sia-sia.
Anyname Donotcare

2

Tidak jelas mengapa menjalankan pernyataan SELECT harus melibatkan kendala yang memungkinkan. Saya tidak tahu C # atau teknologi terkait, tapi saya tahu basis data Informix. Ada sesuatu yang aneh terjadi dengan sistem jika kode kueri Anda mengaktifkan (dan mungkin juga menonaktifkan) kendala.

Anda juga harus menghindari notasi Informix OUTER kuno dan non-standar. Kecuali jika Anda menggunakan Informix versi lama, Anda harus menggunakan gaya gabungan SQL-92.

Pertanyaan Anda tampaknya menyebutkan dua gabungan luar, tetapi Anda hanya menampilkan satu di contoh permintaan. Itu juga agak membingungkan.

Kondisi gabungan antara ' e' dan seluruh tabel adalah:

AND c.crsnum = e.crsnum  
AND c.batch_no = e.batch_no  
AND d.lect_code= e.lect_code 

Ini adalah kombinasi yang tidak biasa. Karena kita tidak memiliki bagian yang relevan dari skema dengan batasan integritas referensial yang relevan, sulit untuk mengetahui apakah ini benar atau tidak, tetapi agak tidak biasa untuk bergabung di antara 3 tabel seperti itu.

Tidak satu pun dari ini adalah jawaban pasti untuk masalah Anda; Namun, ini dapat memberikan beberapa panduan.


2

Terima kasih atas semua masukan yang dibuat sejauh ini. Saya hanya ingin menambahkan bahwa sementara seseorang mungkin telah berhasil menormalkan DB, memperbarui setiap perubahan skema untuk aplikasi mereka (misalnya untuk dataset) atau lebih, ada juga penyebab lain: sql produk CARTESIAN (ketika bergabung dengan tabel dalam kueri).

Adanya hasil kueri kartesius akan menyebabkan rekaman duplikat di tabel utama (atau kunci pertama) dari dua tabel atau lebih yang bergabung. Bahkan jika Anda menentukan klausa "Di mana" dalam SQL, Cartesian masih dapat terjadi jika BERGABUNG dengan tabel sekunder misalnya berisi gabungan yang tidak sama (berguna saat mendapatkan data dari 2 atau lebih tabel yang tidak terkait):

DARI tbFirst INNER GABUNG tbSystem ON tbFirst.reference_str <> tbSystem.systemKey_str

Solusi untuk ini: tabel harus terkait.

Terima kasih. Chagbert


1

Saya memecahkan masalah yang sama dengan mengubah ini dari false menjadi true. pada akhirnya saya pergi ke database dan mengubah bidang bit saya untuk mengizinkan nol, dan kemudian me-refresh xsd saya, dan me-refresh wsdl dan reference.cs saya dan sekarang semuanya baik-baik saja.

this.columnAttachPDFToEmailFlag.AllowDBNull = true;

1

Soloution pendek dan mudah:

Pergi ke MSSQL Studio Sever;

Jalankan kueri penyebab kesalahan ini: dalam kasus saya, saya melihat bahwa nilai id adalah nol karena saya lupa menetapkan kenaikan spesifikasi Identitas sebesar 1.

masukkan deskripsi gambar di sini

Jadi masukkan 1 untuk bidang id karena autoincremane dan modifikasi jangan izinkan NULLS dalam tampilan desing

masukkan deskripsi gambar di sini

Itulah kesalahan yang menyebabkan kesalahan lempar bindingsource dan tabel adapter saya pada kode ini:

   this.exchangeCheckoutReportTableAdapter.Fill(this.sbmsDataSet.ExchangeCheckouReportTable);

0

DirectCast (dt.Rows (0), DataRow) .RowError

Ini secara langsung memberikan kesalahan


2
Saran yang bagus, tetapi itu hanya berfungsi jika itu adalah baris pertama di datatable yang memiliki kesalahan, bukan? Jika 100 baris baik dikembalikan dan kemudian 1 baris buruk, tidak akan ada seorang RowErrordi Rows(0), akan ada?
PaulStock

0

Jika Anda menggunakan perancang dataset visual studio untuk mendapatkan tabel data, dan itu melempar kesalahan 'Gagal Mengaktifkan kendala'. Saya telah menghadapi masalah yang sama, cobalah untuk melihat pratinjau data dari perancang dataset itu sendiri dan mencocokkannya dengan tabel di dalam basis data Anda.

Cara terbaik untuk mengatasi masalah ini adalah dengan menghapus adaptor tabel dan membuat yang baru.


0

* Cara sekunder: *


Jika Anda tidak perlu [id] sebagai kunci Utama,

Hapus atribut kunci utamanya:

pada DataSet Anda> TableAdapter> klik kanan pada kolom [id]> pilih tombol Hapus ...

Masalah akan diperbaiki.


0

Saya juga memiliki masalah ini dan diselesaikan setelah memodifikasi * .xsd untuk mencerminkan ukuran kolom yang direvisi yang diubah dalam server SQL yang mendasarinya.


0

Untuk memperbaiki kesalahan ini, saya melepas adaptor tabel yang bermasalah dari desainer Dataset, dan menyimpan dataset, dan kemudian menyeret salinan baru adaptor tabel dari server explorer dan memperbaikinya


0

Saya menyelesaikan masalah ini dengan membuka file .xsd dengan pembaca XML dan menghapus batasan yang ditempatkan pada salah satu pandangan saya. Untuk alasan apa pun ketika saya menambahkan tampilan ke data itu menambahkan batasan kunci primer ke salah satu kolom ketika seharusnya tidak ada satu.

Cara lain adalah dengan membuka file .xsd secara normal, lihat tabel / view yang menyebabkan masalah dan hapus semua kunci (kolom klik kanan, pilih delete key) yang seharusnya tidak ada.


0

Hanya ingin menambahkan kemungkinan alasan lain untuk pengecualian yang tercantum di atas (terutama bagi orang yang suka menentukan skema dataset secara manual):

ketika dalam dataset Anda, Anda memiliki dua tabel dan ada hubungan ( DataSet.Reletions.Add()) didefinisikan dari bidang tabel pertama ( chfield) ke bidang tabel kedua ( pfield), ada seperti kendala implisit yang ditambahkan ke bidang itu menjadi unik meskipun mungkin tidak ditentukan secara eksplisit dalam definisi Anda bukan sebagai unik atau sebagai kunci primer.

Sebagai konsekuensinya, jika Anda memiliki baris dengan nilai berulang di bidang induk tersebut ( pfield) Anda akan mendapatkan pengecualian ini juga.


0
            using (var tbl = new DataTable())
            using (var rdr = cmd.ExecuteReader())
            {
                tbl.BeginLoadData();

                try
                {
                    tbl.Load(rdr);
                }
                catch (ConstraintException ex)
                {
                    rdr.Close();
                    tbl.Clear();

                    // clear constraints, source of exceptions
                    // note: column schema already loaded!
                    tbl.Constraints.Clear();
                    tbl.Load(cmd.ExecuteReader());
                }
                finally
                {
                    tbl.EndLoadData();
                }
            }

0

Saya menerima jenis kesalahan yang sama dan dalam kasus saya menyelesaikannya dengan menghapus bidang pilih dan menggantinya dengan *. Tidak tahu mengapa itu terjadi. Permintaan tidak memiliki kesalahan ketik atau apapun yang mewah.

Bukan solusi terbaik tetapi tidak ada yang berhasil dan saya mulai kelelahan.

Dalam pencarian saya untuk jawaban yang jelas saya menemukan ini di ini: https://www.codeproject.com/questions/45516/failed-to-enable-constraints-one-or-more-rows-rows-cont

Solusi 8

Kesalahan ini juga muncul di proyek saya, menggunakan Visual Studio 2010. Saya mencoba solusi lain yang diposting di blog lain, tetapi tidak berhasil sama sekali karena masalahnya tidak ada hubungannya dengan ukuran bidang, definisi bidang tabel kunci, kendala atau EnforceConstraintsvariabel dataset.

Dalam kasus saya, saya memiliki objek .xsd yang saya letakkan di sana selama waktu desain proyek (di Layer Akses Data). Ketika Anda menyeret objek tabel database Anda ke item Dataset visual, ia membaca setiap definisi tabel dari database yang mendasari dan menyalin kendala ke Datasetobjek persis seperti yang Anda tetapkan saat Anda membuat tabel dalam database Anda (SQL Server 2008 R2 dalam kasus saya ). Ini berarti bahwa setiap kolom tabel yang dibuat dengan batasan "bukan null" atau "kunci asing" juga harus ada dalam hasil pernyataan SQL atau prosedur tersimpan Anda.

Setelah saya memasukkan semua kolom terbatas (bukan nol, kunci primer, kunci asing, dll) ke dalam pertanyaan saya, masalahnya hilang sepenuhnya.

Mungkin Anda tidak memerlukan semua kolom tabel untuk hadir dalam hasil / prosedur tersimpan, tetapi karena kendala masih diterapkan kesalahan ditampilkan jika beberapa kolom terbatas tidak muncul dalam hasil.

Semoga ini bisa membantu orang lain.


-1

Dalam kasus saya kesalahan ini dipicu oleh ukuran kolom string. Yang aneh adalah ketika saya menjalankan kueri yang sama persis di alat yang berbeda, nilai berulang atau nilai nol tidak ada.

Kemudian saya menemukan bahwa ukuran ukuran kolom string adalah 50 jadi ketika saya memanggil metode fill nilainya dipotong, membuang pengecualian ini.
Saya klik pada kolom dan mengatur di properti ukuran ke 200 dan kesalahan itu hilang.

Semoga bantuan ini


-1

Saya memecahkan masalah ini dengan melakukan "subselect" seperti itu:

string newQuery = "select * from (" + query + ") as temp";

Ketika melakukannya di mysql, semua properti collunms (unik, non-null ...) akan dihapus.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.