2016-03-28 11 views
1

Java'nın eski bir Access veritabanıyla bağlantı kurması üzerine çalışıyorum, çünkü sorulan bu.UCanAccess: Bütünlük kısıtlaması ihlali oluşmasını önlemek için gerekli alanı açın ve kapatın: NOT NULL error

ben hata almaya devam:

integrity constraint violation: NOT NULL error 

Ama veritabanında gittiğinde, ben alanların bir sürü gerekli alanların birinde aslında boş. Sanırım gerekli alan daha sonra eklendi. Alanı zorunlu kılmadığımda kodum düzgün çalışıyor.

enter image description here

Bu veri girme insanlara unutturulmaya, ancak son zamanlarda eklenen bir şeydir aynı zamanda, ben, bu alanda olmadan 20000 kayıtları üzerinde bulunmaktadır kalmamak gerekli gerekmektedir

tahmin.

Bu tablo için gerekli alanı, UCanAccess ile java'dan açmak ve kapatmak için bir yol var mı? Sanırım bu muhtemelen ideal değil ve bunu kapatmak en iyisi olur ve alanın dolduğundan emin olmak için Access'teki veri giriş formlarından birinde bir kontrol oluşturur mu? Buna yaklaşmanın en iyi yolu ne olurdu? Java ve Access'in yanı sıra maalesef çalıştığım birçok araç yok. En iyi uygulamanın ne olacağından emin değilim. (BOŞ

TimeEntry t = new TimeEntry(); 
    ArrayList<TimeEntry> tList = new ArrayList<TimeEntry>(); 
try{ 
      Connection conn=DriverManager.getConnection("jdbc:ucanaccess://\\\\server\\folder1\\folder2\\folder3\\folder4\\folder5\\Database21.mdb"); 
      Statement st = conn.createStatement(); 
      ResultSet rs = st.executeQuery("SELECT [PLANT], [DEPARTMENT], [WONum] FROM [Query1] where [Entry-dt] >= #2/26/2016# "); 
     while (rs.next()) { 

      t.setPlant(rs.getString(1)); 
      t.setDept(rs.getString(2)); 
      t.setWo(rs.getString(3)); 
      System.out.println(t.toString()); 
      tList.add(t); 
      t = new TimeEntry(); 

      System.out.println(rs.getString(3)); 
      } 

     } catch(Exception e){ 

     } 

cevap

3

Microsoft Access "Gerekli = No" dönüştürülür bir alan (sütun) sonra NULL değerleri korumak için kayıtları mevcut sağlar:

Bu

gerçekten çalışıyor (kamu için düzenlenmiş) benim kod kısıtlaması) "Gerekli = Evet" (NULL kısıtlaması DEĞİL). Bu nedenle, Access veritabanının aslında NULL değerlerini içeren NOT NULL sütununa sahip olması mümkündür. UCanAccess'in bir destek veritabanı olarak kullandığı HSQLDB, buna izin vermez.

Bu nedenle, UCanAccess geliştirme ekibinin iki davranışı uzlaştırmak için bir yol bulması gerekiyordu. Tamamen NULL kısıtlamasının tamamen yok sayılmasını istemediler (aynı nedenden ötürü sorunuzda alıntı yaptınız), fakat aynı zamanda kullanıcıların yapmak istedikleri tek şey okundukları zaman bu tablodaki verileri değiştirmeye zorlamak istemediler. o.

Uyguladıkları uzlaşma, bir tablonun NOT NULL sütununda NULL değerlerine sahip olduğu tespit edildiğinde bir uyarı verileceği ve tablonun salt okunur hale getirileceğidir (bu nedenle UCanAccess NOT NULL kısıtlamasını güvenli bir şekilde göz ardı edebilir). :

WARNING:Detected Not Null constraint breach, table Table2, record ... : making the table Table2 readonly

Tek yapmanız gereken, o tablodan okunduğunda, uyarıyı göz ardı edebilirsiniz. Bu tabloya yazmanız gerekiyorsa, verileri NOT NULL sütununda düzeltmeniz gerekir.

(UCanAccess ALTER tablo açıklamaları desteklemek mümkün, bu nedenle varolan sütunun [DEĞİL] BOŞ durumunu değiştiremez.)

ekran görüntünüze göre söz konusu alan "Evet = Sıfır Uzunluk ver" oldu böylece sadece Access'te veritabanını açın ve bu değişim daha sonra UCanAccess tablosunu güncelleştirmek mümkün olacak uygulandıktan sonra

UPDATE TableName SET FieldName='' WHERE FieldName IS NULL 

kullanarak sütun güncelleyebilirsiniz.

+1

Masa güncellemesi sorunu çözdü, teşekkürler! – arsarc

İlgili konular