2015-04-16 7 views
5

İşte durum: Bir Microsoft Access ön ucuna sahip bir SQL Server veritabanı var. SQL Server veritabanında bir tablo VARCHAR (6) NOT NULL (bu tablo için bir bileşik birincil anahtarın parçası olduğu için NULL olmamalıdır) olarak tanımlanan PackID adlı bir sütun var. Boş dizeler PackID sütununda meşrudur. Aslında oldukça sık görülürler. Kullanıcı bu tablo için kullanıcı arabirimindeki verileri girdiğinde ve PackID alanı boyunca sekmeler belirdiğinde bir hata iletisi görüntülenir: "NULL değeri 'PackID' sütununa eklenemiyor; sütun boş değerlere izin vermiyor. INSERT başarısız." işe yaramaz denendiSQL Server'a eklemek için VBA boş dizesi

şeyler:

  1. '' değerine sahip SQL Server veritabanında bu sütunda varsayılan kısıtlama ekleme - görünüşte varsayılan olarak sadece sütun atlanırsa kullanılır Access'te PackID alanın Varsayılan Değer belirlemek INSERT deyimi
  2. den "için - kullanıcı (Kayıp Odak olay arayüzünde satır üzerinden kalktıktan sonra aşağıdaki VBA kodunu çağıran bir BOŞ
  3. olan" "sanki davranır")

    If IsNull(PackID.Value) Then 
        PackID.Value = "" 
    End If 
    

Boş bir dizeyi Access'e nasıl zorlayacağını bilen biri var mı, bu yüzden SQL Server için boş bir dize olarak yorumlanmış ve NULL değil?

+0

'IsNull (ComponentPackID.Value)' dönüşü doğru mu? – Jens

+0

Muhtemelen eski bir VBA günlerinde NULL değerleri ile başa çıkmak için iyi bir yol olmadığı için, Hayatınızda boş bir dize için NULL'leri göndermek için "daha kolay" yapmak bir şeydir. Bu hacky ama ne kadar tek bir alan, sonra her şeyi yoluna geri döker? – Jeremy

+0

Evet, True döndürüyor. – knot22

cevap

1

bu

=" " 

Erişimde PackID için metin kutusu Özellikleri Standart değeri ayarlama çalıştı. Çift tırnak arasındaki boşluk çok önemlidir. Boşluğun dışarı çıkması, insertin başarısız olmasına neden olur. SQL Server LEN (PackID) olarak Mesela 0 döndürür: Her iki Hem bu kadar boş dizeleri SQL Server davranır sanki görünür 0 döndürür

SELECT LEN(''), LEN(' '); 

.

+0

Bu yüzden bana göre: asla Access'te SQL Server veritabanı ile uygulama oluşturmayın ... Ne yazık ki Access 2013'te ADP desteğini bıraktılar. –

0

Bu soruna alternatif bir çözüm (Metin Kutusu'nda Varsayılan Değer yok, PackID'nin Özellikleri).

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    If IsNull(PackID.Value) Or PackID.Value = "" Then 
     PackID.Value = " " 
    End If 
End Sub 

Bu hala alanın değeri olarak (tırnak uzay alıntı olarak bu okuyun) "" SQL Server geçen kavramını kullanır. UI tarafında, bu alan için bir varsayılan değer ayarlamaya bir alternatif.