2015-04-16 5 views
5

Ecco la situazione: Esiste un database SQL Server con un front-end Microsoft Access. Esiste una tabella nel database di SQL Server con una colonna denominata PackID definita VARCHAR (6) NOT NULL (deve essere NOT NULL perché fa parte di una chiave primaria composita per questa tabella). Le stringhe vuote sono legittime nella colonna PackID. In realtà, si verificano abbastanza spesso. Quando l'utente immette i dati nell'interfaccia utente per questa tabella e le schede attraverso il campo PackID, viene visualizzato un messaggio di errore: "Impossibile inserire il valore NULL nella colonna" PackID ", la colonna non consente i valori null. INSERT non riesce."Stringa VBA vuota per l'inserimento in SQL Server

cose che sono state provate che non funzionano:

  1. l'aggiunta di un vincolo predefinito su questa colonna nel database di SQL Server con un valore di '' - a quanto pare il default viene utilizzato solo se la colonna viene omessa dal INSERT
  2. impostando il valore di default del campo PackID in Access per "" - si comporta come se "" è un NULL
  3. chiamando il seguente codice VBA quando l'utente si allontana riga nella UI (evento fuoco perso)

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

Qualcuno sa come forzare una stringa vuota in Access, quindi è interpretata come una stringa vuota per SQL Server e non un NULL?

+0

La riga 'IsNull (ComponentPackID.Value)' restituisce True? – Jens

+0

In Access è probabilmente una cosa che rende la vita "più semplice" inviare NULL per una stringa vuota, perché nei brutti vecchi giorni VBA, non c'erano buoni modi per gestire i valori NULL. È hacky ma che ne dici di un singolo spazio, quindi tagliare tutto indietro? – Jeremy

+0

Sì, restituisce True. – knot22

risposta

1

Impostazione del valore predefinito nelle Proprietà casella di testo per PackID in L'accesso a questo

=" " 

lavorato. Lo spazio tra le virgolette è molto importante. Lasciare lo spazio fuori causa l'errore dell'inserto. In SQL Server LEN (PackID) restituisce 0. Per esempio:

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

sia restituire 0. Sembra come se SQL Server tratta sia di queste stringhe come vuote.

+0

Quindi per me è chiaro: non creare mai app in Access con database SQL Server ... Purtroppo hanno abbandonato il supporto ADP in Access 2013. –

0

Una soluzione alternativa a questo problema (nessun valore predefinito nella casella di testo Proprietà per PackID).

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

Questo utilizza ancora il concetto di passaggio SQL Server "" (leggere questo come citazione spazio citazione) come valore del campo. Sul lato dell'interfaccia utente, questa è un'alternativa all'impostazione di un valore predefinito per il campo.