ไม่สามารถเปิดใช้งานข้อ จำกัด อย่างน้อยหนึ่งแถวมีค่าที่ละเมิดข้อ จำกัด ที่ไม่เป็นโมฆะไม่ซ้ำใครหรือต่างประเทศ


168

ฉันทำการเชื่อมต่อภายนอกและดำเนินการสำเร็จแล้วในinformixฐานข้อมูล แต่ฉันได้รับข้อยกเว้นต่อไปนี้ในรหัสของฉัน:

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

ไม่สามารถเปิดใช้งานข้อ จำกัด อย่างน้อยหนึ่งแถวมีค่าที่ละเมิดข้อ จำกัด ที่ไม่เป็นโมฆะไม่ซ้ำใครหรือต่างประเทศ

ฉันรู้ปัญหา แต่ฉันไม่ทราบวิธีการแก้ไข

ตารางที่สองที่ฉันทำการรวม outer ด้านบนประกอบด้วยคีย์หลักแบบคอมโพสิตซึ่งเป็นโมฆะในแบบสอบถามการเข้าร่วม outer ด้านนอกก่อนหน้า

แก้ไข:

    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 = ....

cc1assiscrsevalปัญหาที่เกิดขึ้นกับตาราง คีย์หลักคือ (batch_no, crsnum, lect_code)

จะแก้ไขปัญหานี้ได้อย่างไร?


แก้ไข:

ตาม@PaulStockคำแนะนำ: ฉันทำในสิ่งที่เขาพูดและฉันจะได้รับ:

? dt.GetErrors () [0] {System.Data.DataRow} HasErrors: true ItemArray: {object [10]} RowError: "คอลัมน์ 'eval' ไม่อนุญาต DBNull.Value

ดังนั้นฉันจึงแก้ปัญหาของฉันโดยแทนที่ e.evalเป็น,. NVL (e.eval,'') evalและนี่แก้ปัญหาของฉันได้ ขอบคุณมาก.


เมื่อฉันลบออก,e.eval,e.batch_no,e.crsnum,e.lect_code,e.prof_courseจากแบบสอบถามทุกสิ่งเป็นไปไม่เป็นไร ปัญหาคืออะไรโปรด
Anyname Donotcare

นอกจากนี้ยังมีข้อผิดพลาดใน ADO.NET ที่ "ดัชนีคลัสเตอร์ที่ไม่ซ้ำกัน" จะสร้างรายการ Data.UniqueConstraint ที่ผิดพลาดบน DataTable
Brain2000

คำตอบ:


352

ปัญหานี้มักเกิดจากสาเหตุข้อใดข้อหนึ่งดังต่อไปนี้

  • ค่า Null ถูกส่งคืนสำหรับคอลัมน์ที่ไม่ได้ตั้งค่าเป็น AllowDBNull
  • แถวที่ซ้ำกันที่ถูกส่งคืนด้วยคีย์หลักเดียวกัน
  • ไม่ตรงกันในการกำหนดคอลัมน์ (เช่นขนาดของเขตข้อมูลถ่าน) ระหว่างฐานข้อมูลและชุดข้อมูล

ลองเรียกใช้คิวรีของคุณแบบดั้งเดิมและดูผลลัพธ์หากชุดผลลัพธ์ไม่ใหญ่เกินไป หากคุณตัดค่าว่างออกไปแล้วฉันเดาว่าคอลัมน์หลักหลักจะถูกทำซ้ำ

หรือเพื่อดูข้อผิดพลาดที่แน่นอนคุณสามารถเพิ่มบล็อกลอง / จับไปยังรหัสที่สร้างเช่นและจากนั้นเมื่อแบ่งข้อยกเว้น:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นภายในหน้าต่างคำสั่งเรียกGetErrorsใช้วิธีการบนตารางเพื่อรับข้อผิดพลาด
สำหรับ C # คำสั่งจะเป็น? dataTable.GetErrors()
สำหรับ VB คำสั่งคือ? dataTable.GetErrors

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งนี้จะแสดงให้คุณเห็นว่ามีข้อผิดพลาดเกิดขึ้น คุณสามารถดูRowErrorแต่ละรายการเหล่านี้ได้ซึ่งควรบอกคอลัมน์ที่ไม่ถูกต้องพร้อมกับปัญหา ดังนั้นเพื่อดูข้อผิดพลาดของ datarow แรกในข้อผิดพลาดคำสั่งคือ:
? dataTable.GetErrors(0).RowError
หรือใน C # มันจะเป็น? dataTable.GetErrors()[0].RowError

ป้อนคำอธิบายรูปภาพที่นี่


4
ขอบคุณมาก . >? dt.GetErrors()[0] {System.Data.DataRow} HasErrors: true ItemArray: {object[10]} RowError: "Column 'eval' does not allow DBNull.Value."
Anyname Donotcare

4
น่ากลัว ไม่ทำงาน แต่ฉันสามารถเพิ่มนาฬิกาสำหรับชุดข้อมูลและพิมพ์. GetErrors หลังจากนั้นและขยายค่า นั่นมีประโยชน์มาก หวังว่าฉันจะไม่ลืมมันก่อนที่ครั้งต่อไปที่ฉันต้องการมัน :)
dwidel

6
ใช่สิ่งนี้มีประโยชน์จริง ๆ - สาเหตุของข้อผิดพลาดของฉันคือความยาวของฟิลด์ยาวกว่าความยาวสูงสุดของคอลัมน์ในอะแดปเตอร์ตาราง สิ่งหนึ่งที่ฉันสังเกตเห็นคือในการที่จะไปถึงเบรกพอยต์ในไฟล์ผู้ออกแบบคุณต้องไปที่เครื่องมือ> ตัวเลือก> การดีบักและตรวจสอบให้แน่ใจว่า "เปิดใช้งานรหัสของฉัน" ไม่ได้ถูกเลือก จากนั้นจะช่วยให้คุณสามารถตรวจสอบรหัสไฟล์ของนักออกแบบได้
e-on

1
ขอบคุณ @ PaulStock สำหรับคุณตอบฉันได้รับปัญหาเดียวกันของฉันแก้
Uday

1
นี่เป็นประโยชน์อย่างมากฉันพบความไม่ตรงกันระหว่างความยาวคอลัมน์ข้อมูล - เพิ่มขึ้นในฐานข้อมูลไม่ใช่ในชุดข้อมูล
Rob

38

คุณสามารถปิดการใช้งานข้อ จำกัด ในชุดข้อมูล จะช่วยให้คุณสามารถระบุข้อมูลที่ไม่ถูกต้องและช่วยแก้ไขปัญหา

เช่น

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

วิธีการเติมอาจแตกต่างกันเล็กน้อยสำหรับคุณ


1
สิ่งนี้ช่วยฉันค้นหาข้อมูลที่ทำให้เกิดปัญหาซึ่งไม่ใช่ "ข้อมูลที่ไม่ดี" แต่เป็นพฤติกรรมที่ไม่ดีของตัวช่วยสร้างการกำหนดค่าแหล่งข้อมูล เห็นได้ชัดว่าไม่ได้รับการแก้ไขข้อ จำกัด ของคอลัมน์ (และฉันพลาดการเพิ่มตารางในการบูต) แม้จะออกไปข้างนอกและคุยกับ DB ... และไม่ได้เปิดใช้งานแคช
fortboise

ขอบคุณสำหรับคำตอบนี้ ฉันมีปัญหาเกี่ยวกับ Case Sensitive และต้องการตั้งค่าอย่างเหมาะสมในชุดข้อมูล
Dan

10

นี่จะหาแถวทั้งหมดในตารางที่มีข้อผิดพลาดพิมพ์คีย์หลักของแถวและข้อผิดพลาดที่เกิดขึ้นในแถวนั้น ...

นี่คือใน C # แต่การแปลงเป็น VB ไม่ควรยาก

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

อ๊ะ - ขออภัย PKColumns เป็นสิ่งที่ฉันเพิ่มเมื่อขยาย DataTable ที่บอกคอลัมน์ทั้งหมดที่ประกอบขึ้นเป็นคีย์หลักของ DataTable หากคุณรู้จักคอลัมน์คีย์หลักใน DataTable ของคุณคุณสามารถวนดูได้ที่นี่ ในกรณีของฉันเนื่องจาก datatables ทั้งหมดของฉันรู้ PK cols ของพวกเขาฉันสามารถเขียน debug สำหรับข้อผิดพลาดเหล่านี้โดยอัตโนมัติสำหรับตารางทั้งหมด

ผลลัพธ์มีลักษณะดังนี้:

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

หากคุณสับสนเกี่ยวกับส่วน PKColumns ด้านบนนี่จะพิมพ์ชื่อคอลัมน์และค่าต่างๆและไม่จำเป็น แต่จะเพิ่มข้อมูลการแก้ไขปัญหาที่เป็นประโยชน์สำหรับการระบุค่าคอลัมน์ที่อาจทำให้เกิดปัญหา การลบส่วนนี้และการรักษาส่วนที่เหลือจะยังคงพิมพ์ข้อผิดพลาด SQLite ที่ถูกสร้างขึ้นซึ่งจะบันทึกคอลัมน์ที่มีปัญหา


1
วิธีที่ยอดเยี่ยมในการค้นหาว่ามันผิดตรงไหน ทั้งหมดช่วยฉันแก้ปัญหาที่ไม่ได้คาดคิดในโซลูชันที่ฉันสืบทอดมาซึ่งมีความไม่สอดคล้องกับข้อมูล แม้ว่ามันจะอยู่ในชุดข้อมูลและฉันเพิ่งทำซ้ำผ่านแต่ละตารางแล้วแต่ละแถว +10 ถ้าทำได้
Andez

สิ่งนี้ใช้ได้สำหรับฉัน มันเป็นColumn 'MyColumn' does not allow DBNull.Valueแต่มันจะไม่แสดงวิธีอื่นใด ขอบคุณ :)
อเล็กซ์

7
  • ตรวจสอบให้แน่ใจว่าฟิลด์ที่มีชื่อในคิวรีของการ์ดเชื่อมต่อตารางตรงกับที่อยู่ในแบบสอบถามที่คุณกำหนดไว้ ดูเหมือนว่า DAL จะไม่ชอบที่ไม่ตรงกัน โดยทั่วไปจะเกิดขึ้นกับ sprocs และคิวรีของคุณหลังจากที่คุณเพิ่มเขตข้อมูลใหม่ลงในตาราง

  • หากคุณเปลี่ยนความยาวของฟิลด์ varchar ในฐานข้อมูลและ XML ที่มีอยู่ในไฟล์ XSS ยังไม่ได้เลือกขึ้นมาให้ค้นหาชื่อฟิลด์และนิยามคุณสมบัติใน XML และเปลี่ยนด้วยตนเอง

  • ลบคีย์หลักออกจากรายการที่เลือกในอะแดปเตอร์ของตารางหากไม่เกี่ยวข้องกับข้อมูลที่ส่งคืน

  • เรียกใช้แบบสอบถามของคุณใน SQL Management Studio และตรวจสอบให้แน่ใจว่าไม่มีการส่งคืนระเบียนที่ซ้ำกัน ระเบียนที่ซ้ำกันสามารถสร้างคีย์หลักที่ซ้ำกันซึ่งจะทำให้เกิดข้อผิดพลาดนี้

  • สหภาพ SQL สามารถสะกดปัญหาได้ ฉันปรับเปลี่ยนอะแดปเตอร์หนึ่งตารางโดยเพิ่มระเบียน 'โปรดเลือกพนักงาน' ที่อยู่ก่อนหน้าตัวอื่น ๆ สำหรับฟิลด์อื่นฉันให้ข้อมูลดัมมีเช่นสตริงที่มีความยาวหนึ่งตัว DAL อนุมานสคีมาจากบันทึกเริ่มต้นนั้น ระเบียนที่ตามด้วยสายอักขระความยาว 12 ล้มเหลว


1
ยินดีต้อนรับสู่ SO, Bob ฉันได้แก้ไขคำตอบของคุณแล้ว (ยังอยู่ระหว่างการตรวจสอบ) ตัวอย่างเช่นเราไม่ต้องการมีคำทักทายและลายเซ็นในคำตอบ (ถือว่าเป็น "noice" โปรดดูคำถามที่พบบ่อย) ชื่อและ gravatar ของคุณจะแสดงอยู่ด้านล่างคำตอบเสมอ
Christoffer Lette

5

สิ่งนี้ใช้ได้กับฉันแหล่งที่มา: ที่นี่

ฉันมีข้อผิดพลาดนี้และไม่เกี่ยวข้องกับข้อ จำกัด ของฐานข้อมูล (อย่างน้อยก็ในกรณีของฉัน) ฉันมีไฟล์. xsd พร้อมกับเคียวรี GetRecord ที่ส่งคืนกลุ่มของเร็กคอร์ด หนึ่งในคอลัมน์ของตารางนั้นคือ "nvarchar (512)" และในระหว่างโครงการฉันต้องเปลี่ยนเป็น "nvarchar (MAX)"

ทุกอย่างทำงานได้ดีจนกระทั่งผู้ใช้ป้อนมากกว่า 512 ในฟิลด์นั้นและเราเริ่มได้รับข้อความแสดงข้อผิดพลาดที่มีชื่อเสียง "ไม่สามารถเปิดใช้งานข้อ จำกัด หนึ่งแถวหรือมากกว่านั้นมีค่าที่ละเมิดข้อ จำกัด ที่ไม่ใช่โมฆะเฉพาะหรือต่างประเทศ"

วิธีแก้ไข: ตรวจสอบคุณสมบัติ MaxLength ทั้งหมดของคอลัมน์ใน DataTable ของคุณ

คอลัมน์ที่ฉันเปลี่ยนจาก "nvarchar (512)" เป็น "nvarchar (MAX)" ยังคงมีค่า 512 ในคุณสมบัติ MaxLength ดังนั้นฉันจึงเปลี่ยนเป็น "-1" และใช้งานได้ !!


ปัญหาของฉันต้องเป็น MaxLength เช่นกัน ฉันใช้ตัวออกแบบชุดข้อมูล VWD 2010 บุคคลอื่นเปลี่ยนตารางต้นฉบับ ฉันปรับเปลี่ยน SQL Query เป็นselect *คิดว่าจะรีเฟรชคอลัมน์ทั้งหมด แต่เห็นได้ชัดว่าไม่ได้อัปเดตความยาวที่มีอยู่ ดังนั้นผมจึงมีการปรับเปลี่ยนแบบสอบถามเพื่อเลือกฟิลด์หนึ่งบันทึกไว้ .xsd เปิด .xsd ใน Notepad ++ เพื่อตรวจสอบว่าหนึ่ง แต่ของ defs MaxLength select *ก็หายไปแก้ไขแล้วแบบสอบถามอีกครั้งเพื่อ นั่นทำให้รีเฟรช MaxLengths และทำให้ฉันผ่านข้อผิดพลาดนี้ได้
Mark Berry

ขอบคุณมากฉันเกาหัวของฉันตลอดทั้งวันเพราะทุกอย่างกลับมาดี ฉันต้องเปลี่ยนเป็น nvarchar (MAX) แต่ DataTable รักษา MaxLength ไว้ที่ 10! ฉันเป็นหนี้คุณ!
Jon D

4

ปัญหาเกิดขึ้นกับตัวออกแบบ Data Access ใน Visual Studio เมื่อเราดึงมุมมองจาก "Server Explorer" ไปยังหน้าต่าง Designer มันจะเพิ่มคีย์หลักในคอลัมน์แบบสุ่มหรือทำเครื่องหมายบางสิ่งบางอย่างให้เป็น NULL ไม่ได้แม้ว่ามันจะถูกตั้งค่าเป็น null จริง ๆ แม้ว่าการสร้างมุมมองจริงในเซิร์ฟเวอร์ SQL db จะไม่มีการกำหนดคีย์หลักใด ๆ หรือไม่ได้กำหนดเป็น NULL ตัวออกแบบ VS กำลังเพิ่มคีย์ / ข้อ จำกัด นี้

คุณสามารถเห็นสิ่งนี้ได้ในผู้ออกแบบ - มันจะแสดงพร้อมกับไอคอนรูปกุญแจด้านซ้ายของชื่อคอลัมน์

การแก้ไข: คลิกขวาที่ไอคอนกุญแจและเลือก 'ลบคีย์' สิ่งนี้ควรแก้ปัญหา คุณสามารถคลิกขวาที่คอลัมน์และเลือก "Properties" เพื่อดูรายการคุณสมบัติของคอลัมน์ในตัวออกแบบการเข้าถึงข้อมูล VS และเปลี่ยนค่าอย่างเหมาะสม


3

ข้อผิดพลาดนี้ก็ปรากฏในโครงการของฉัน ฉันลองวิธีแก้ปัญหาที่เสนอทั้งหมดที่โพสต์ไว้ที่นี่ แต่ไม่มีโชคเลยเพราะปัญหาไม่เกี่ยวข้องกับขนาดของฟิลด์คำจำกัดความฟิลด์คีย์ตารางตารางข้อ จำกัด หรือชุดข้อมูลตัวแปร EnforceConstraints

ในกรณีของฉันฉันยังมี. xsd วัตถุที่ฉันใส่ไว้ในช่วงเวลาการออกแบบโครงการ (Data Access Layer) ในขณะที่คุณลากวัตถุตารางฐานข้อมูลของคุณลงในรายการภาพชุดข้อมูลมันจะอ่านคำจำกัดความของตารางแต่ละรายการจากฐานข้อมูลพื้นฐานและคัดลอกข้อ จำกัด ลงในวัตถุชุดข้อมูลตรงตามที่คุณกำหนดไว้เมื่อคุณสร้างตารางในฐานข้อมูลของคุณ (SQL Server 2008 R2 ใน กรณี). ซึ่งหมายความว่าทุกคอลัมน์ของตารางที่สร้างด้วยข้อ จำกัด ของ "ไม่เป็นโมฆะ" หรือ "foreign key" จะต้องปรากฏในผลลัพธ์ของคำสั่ง SQL หรือขั้นตอนการจัดเก็บของคุณ

หลังจากฉันรวมคอลัมน์สำคัญทั้งหมดและคอลัมน์ที่กำหนดเป็น "ไม่เป็นโมฆะ" ในแบบสอบถามของฉันปัญหาก็หายไปอย่างสมบูรณ์


3

ฉันเริ่มทำงานเมื่อฉันตั้งค่าAllowDBNullเป็น True ในเขตข้อมูลวันที่ในตารางข้อมูลในไฟล์ xsd


2

ดูเหมือนว่าอาจมีคอลัมน์อย่างน้อยหนึ่งคอลัมน์ที่ถูกเลือกด้วย:

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

มีAllowDBNullตั้งค่าเป็นFalseในการกำหนดชุดข้อมูลของคุณ


ฉันใส่อนุญาตเป็น null = จริงสำหรับคอลัมน์ทั้งหมดในตารางนี้ แต่ในไร้สาระ
Anyname Donotcare

2

ยังไม่ชัดเจนว่าทำไมการรันคำสั่ง SELECT ควรเกี่ยวข้องกับการเปิดใช้ข้อ จำกัด ฉันไม่รู้จัก C # หรือเทคโนโลยีที่เกี่ยวข้อง แต่ฉันรู้จักฐานข้อมูล Informix มีบางสิ่งที่เกิดขึ้นกับระบบหากรหัสการสืบค้นของคุณเปิดใช้งานข้อ จำกัด (และอาจปิดใช้งาน) ข้อ จำกัด

นอกจากนี้คุณควรหลีกเลี่ยงการใช้เอกสารประกอบ Informix ล้าสมัยและไม่ได้มาตรฐาน หากคุณไม่ได้ใช้ Informix เวอร์ชันเก่าที่เป็นไปไม่ได้คุณควรใช้การรวมสไตล์ SQL-92

คำถามของคุณดูเหมือนจะพูดถึงการรวมภายนอกสองครั้ง แต่คุณแสดงเพียงหนึ่งครั้งในแบบสอบถามตัวอย่าง นั่นก็ทำให้งงเหมือนกัน

เงื่อนไขการเข้าร่วมระหว่าง ' e' และส่วนที่เหลือของตารางคือ:

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

นี่คือการรวมกันที่ผิดปกติ เนื่องจากเราไม่มีชุดย่อยที่เกี่ยวข้องของสคีมาที่มีข้อ จำกัด ด้านความสมบูรณ์ของการอ้างอิงที่เกี่ยวข้องจึงยากที่จะทราบว่าสิ่งนี้ถูกต้องหรือไม่ แต่เป็นการผิดปกติเล็กน้อยที่จะเข้าร่วมระหว่าง 3 ตารางเช่นนั้น

สิ่งนี้ไม่ได้เป็นคำตอบที่ชัดเจนสำหรับคุณ อย่างไรก็ตามอาจมีแนวทางบางอย่าง


2

ขอบคุณสำหรับการป้อนข้อมูลทั้งหมดที่ทำจนถึง ฉันแค่อยากจะเพิ่มในขณะที่หนึ่งอาจประสบความสำเร็จในการปรับมาตรฐานฐานข้อมูลปรับปรุงการเปลี่ยนแปลงสคีมาประยุกต์ใช้ของพวกเขา (เช่นชุดข้อมูล) หรือดังนั้นยังมีอีกสาเหตุ: sql CARTESIAN ผลิตภัณฑ์ (เมื่อเข้าร่วมตารางในแบบสอบถาม)

การมีอยู่ของผลลัพธ์คิวรีคาร์ทีเซียนจะทำให้เกิดระเบียนที่ซ้ำกันในตารางหลัก (หรือคีย์แรก) ของตารางสองตารางขึ้นไปที่เข้าร่วม แม้ว่าคุณจะระบุคำสั่ง "ที่ไหน" ใน SQL, Cartesian อาจยังคงเกิดขึ้นหากเข้าร่วมกับตารางที่สองเช่นมีการเข้าร่วมที่ไม่เท่ากัน (มีประโยชน์เมื่อรับข้อมูลจากตารางที่ไม่เกี่ยวข้อง 2 ตารางขึ้นไป):

จาก tbFirst INNER เข้าร่วม tbSystem บน tbFirst.reference_str <> tbSystem.systemKey_str

ทางออกสำหรับสิ่งนี้: ตารางควรเกี่ยวข้องกัน

ขอบคุณ chagbert


1

ฉันแก้ไขปัญหาเดียวกันโดยเปลี่ยนจากเท็จเป็นจริง ในที่สุดฉันก็เข้าไปในฐานข้อมูลและเปลี่ยนเขตบิตของฉันเพื่อให้เป็นโมฆะจากนั้นรีเฟรช xsd ของฉันและรีเฟรช wsdl และ reference.cs ของฉันและตอนนี้ทุกอย่างเรียบร้อย

this.columnAttachPDFToEmailFlag.AllowDBNull = true;

1

Soloution สั้นและง่าย:

ไปที่ MSSQL Studio Sever;

เรียกใช้คิวรีของสาเหตุของข้อผิดพลาดนี้: ในกรณีของฉันฉันเห็นว่าค่า id เป็นโมฆะเพราะฉันลืมตั้งค่าข้อมูลจำเพาะของผู้ใช้เพิ่มขึ้น 1

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นป้อน 1 สำหรับฟิลด์ id เนื่องจาก autoincremane และแก้ไขไม่อนุญาตให้ NULLS ในมุมมองดีไซน์

ป้อนคำอธิบายรูปภาพที่นี่

นั่นเป็นข้อผิดพลาดที่ทำให้ bindingsource และ tabel adapter โยนข้อผิดพลาดในรหัสนี้:

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

0

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

สิ่งนี้ทำให้เกิดข้อผิดพลาดโดยตรง


2
คำแนะนำที่ดี แต่ใช้งานได้หากเป็นแถวแรกใน DataTable ซึ่งมีข้อผิดพลาดใช่ไหม หากมีการส่งคืน 100 แถวที่ดีและจากนั้นแถวที่ไม่ดี 1 แถวจะไม่เปิดอีกRowErrorต่อRows(0)ไปหรือไม่
PaulStock

0

หากคุณใช้นักออกแบบชุดข้อมูล Visual Studio เพื่อรับตารางข้อมูลและมันกำลังโยนข้อผิดพลาด 'ล้มเหลวในการเปิดใช้งานข้อ จำกัด ' ฉันประสบปัญหาเดียวกันลองดูตัวอย่างข้อมูลจากตัวออกแบบชุดข้อมูลและจับคู่กับตารางภายในฐานข้อมูลของคุณ

วิธีที่ดีที่สุดในการแก้ปัญหานี้คือการลบอะแดปเตอร์ตารางและสร้างใหม่แทน


0

* วิธีรอง: *


หากคุณไม่ต้องการให้ [id] เป็นคีย์หลัก

ลบแอตทริบิวต์คีย์หลัก:

ในชุดข้อมูลของคุณ> TableAdapter> คลิกขวาที่คอลัมน์ [id]> เลือกปุ่มลบ ...

ปัญหาจะได้รับการแก้ไข


0

ฉันยังมีปัญหานี้และได้รับการแก้ไขหลังจากแก้ไข * .xsd เพื่อสะท้อนขนาดที่แก้ไขแล้วของคอลัมน์ที่เปลี่ยนแปลงในเซิร์ฟเวอร์ SQL ต้นแบบ


0

เพื่อแก้ไขข้อผิดพลาดนี้ฉันถอดตัวแปลงตารางที่มีปัญหาออกจากตัวออกแบบชุดข้อมูลและบันทึกชุดข้อมูลแล้วลากสำเนาใหม่ของตัวแปลงตารางจากตัวสำรวจเซิร์ฟเวอร์และทำการแก้ไข


0

ฉันแก้ไขปัญหานี้ได้ด้วยการเปิดไฟล์. xsd ด้วยเครื่องอ่าน XML และลบข้อ จำกัด ที่อยู่ในมุมมองของฉัน ไม่ว่าจะด้วยเหตุผลใดก็ตามเมื่อฉันเพิ่มมุมมองลงในข้อมูลจะเพิ่มข้อ จำกัด คีย์หลักให้กับคอลัมน์ใดคอลัมน์หนึ่งเมื่อไม่ควรมี

วิธีอื่นคือการเปิดไฟล์. xsd ตามปกติดูที่ตาราง / มุมมองที่ทำให้เกิดปัญหาและลบคีย์ใด ๆ (คอลัมน์คลิกขวาเลือกdelete key) ที่ไม่ควรอยู่ที่นั่น


0

เพียงต้องการเพิ่มอีกเหตุผลที่เป็นไปได้สำหรับข้อยกเว้นที่ระบุไว้ข้างต้น (โดยเฉพาะอย่างยิ่งสำหรับผู้ที่ต้องการกำหนด schema ของชุดข้อมูลด้วยตนเอง):

เมื่ออยู่ในชุดข้อมูลของคุณคุณมีสองตารางและมีความสัมพันธ์ (DataSet.Reletions.Add() ) กำหนดจากเขตข้อมูลของตารางแรก ( chfield) ไปยังเขตข้อมูลของตารางที่สอง ( pfield) มีเหมือนข้อ จำกัด โดยนัยจะถูกเพิ่มไปยังเขตข้อมูลที่จะไม่ซ้ำกันแม้ว่ามันอาจจะไม่ ระบุไว้อย่างชัดเจนในคำจำกัดความของคุณไม่ว่าจะเป็นเอกลักษณ์หรือเป็นคีย์หลัก

ดังนั้นหากคุณมีแถวที่มีค่าซ้ำ ๆ ในเขตข้อมูลหลักนั้น ( pfield) คุณจะได้รับข้อยกเว้นนี้เช่นกัน


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

ฉันได้รับประเภทข้อผิดพลาดเดียวกันและในกรณีของฉันแก้ไขได้โดยลบฟิลด์เลือกและแทนที่ด้วย * ไม่รู้เลยว่าทำไมมันถึงเกิดขึ้น แบบสอบถามไม่มีการพิมพ์ผิดหรือมีอะไรแฟนซี

ไม่ใช่ทางออกที่ดีที่สุด แต่ไม่มีอะไรทำงานและฉันก็หมดแรง

ในการค้นหาคำตอบที่ชัดเจนฉันพบสิ่งนี้ใน: https://www.codeproject.com/questions/45516/failed-to-enable-constraints-one-or-more-rows-cont

โซลูชัน 8

ข้อผิดพลาดนี้ก็ปรากฏในโครงการของฉันโดยใช้ Visual Studio 2010 ฉันลองใช้วิธีแก้ไขปัญหาอื่น ๆ ที่โพสต์ในบล็อกอื่น ๆ แต่ไม่มีโชคเลยเพราะปัญหาไม่มีอะไรเกี่ยวข้องกับขนาดเขตข้อมูลการกำหนดเขตข้อมูลคีย์ตารางข้อ จำกัด หรือ EnforceConstraintsตัวแปรชุดข้อมูล

ในกรณีของฉันฉันมี. xsd วัตถุที่ฉันใส่ไว้ในช่วงเวลาการออกแบบโครงการ (ใน Data Access Layer) ในขณะที่คุณลากวัตถุตารางฐานข้อมูลของคุณลงในรายการภาพชุดข้อมูลมันจะอ่านคำจำกัดความของแต่ละตารางจากฐานข้อมูลพื้นฐานและคัดลอกข้อ จำกัด ลงในDatasetวัตถุตรงตามที่คุณกำหนดไว้เมื่อคุณสร้างตารางในฐานข้อมูลของคุณ (SQL Server 2008 R2 ในกรณีของฉัน ) ซึ่งหมายความว่าทุกคอลัมน์ของตารางที่สร้างด้วยข้อ จำกัด ของ "ไม่เป็นโมฆะ" หรือ "foreign key" จะต้องปรากฏในผลลัพธ์ของคำสั่ง SQL หรือขั้นตอนการจัดเก็บของคุณ

หลังจากฉันรวมคอลัมน์ที่ถูก จำกัด ทั้งหมด (ไม่ใช่ null, คีย์หลัก, foreign key ฯลฯ ) ลงในคิวรีของฉันปัญหาจะหายไปอย่างสมบูรณ์

บางทีคุณอาจไม่ต้องการให้คอลัมน์คอลัมน์ทั้งหมดปรากฏในผลลัพธ์ของขั้นตอนการสืบค้น / จัดเก็บ แต่เนื่องจากข้อ จำกัด ยังคงถูกนำไปใช้ข้อผิดพลาดจะปรากฏขึ้นหากคอลัมน์ข้อ จำกัด บางอย่างไม่ปรากฏในผลลัพธ์

หวังว่านี่จะช่วยคนอื่นได้


-1

ในกรณีของฉันข้อผิดพลาดนี้ถูกกระตุ้นด้วยขนาดของคอลัมน์สตริง สิ่งที่แปลกคือเมื่อฉันดำเนินการแบบสอบถามเดียวกันที่แน่นอนในเครื่องมือที่แตกต่างกันค่าซ้ำหรือค่า null ไม่ได้มี

จากนั้นฉันก็ค้นพบว่าขนาดของคอลัมน์ขนาดสตริงเท่ากับ 50 ดังนั้นเมื่อฉันเรียกวิธีการเติมค่าที่ถูกสับแล้วให้โยนข้อยกเว้นนี้
ฉันคลิกที่คอลัมน์และตั้งค่าในคุณสมบัติขนาดเป็น 200 และข้อผิดพลาดได้หายไป

หวังว่าความช่วยเหลือนี้


-1

ฉันแก้ไขปัญหานี้โดยทำ "การเลือกย่อย" เช่น:

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

เมื่อทำบน mysql คุณสมบัติทั้งหมดของ collunms (ไม่ซ้ำกันไม่ใช่ค่าว่าง ... ) จะถูกล้าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.