PDA

View Full Version : [c#] sql server 2005: costraint nn funziona


giangi_luca
21-06-2010, 21:20
ciao a tutti ho un problema che non riesco davvero a risolvere

ho definito a livello di db una tabella e in una colonna ho creato un costraint
che ogni volta che inserisco un recod mette il la data corrente.

il problem è che se faccio l'insert da db funziona
se faccio l'insert da form c# non funziona cioè nella colonna data viene messo null!

db è sql server 2005

come mai?

grazie
Gianluca

gugoXX
22-06-2010, 11:29
La colonna nel database l'hai scritta cosi?

CREATE TABLE [Test] (
....
[datetime] DEFAULT (getdate()) )

Se e' cosi', immagino che la tua form stia anche dichiarando esplicitamente il valore NULL per quella colonna, durante la insert.
Non devi assegnare alcun valore a quella colonna durante la insert, e allora il valore di default verra' imposto.

giangi_luca
22-06-2010, 13:28
ciao e per prima cosa grazie della risposta.

questo problema mi sta facendo ammattire.

allora la mia tabella era già esistente e dopo ho aggiunto il constraint cosi:

ALTER TABLE dbo.t_blacklist
ADD CONSTRAINT
data_corrente DEFAULT getdate() FOR dt_insert

poi da visual studio, lavoro con t-sql, e ho usato la seguente sintassi per popolare alcuni campi, fare la insert e committare, però non dò nessun valore alla data.
ecco cosa scrivo:


//istanza della tabella
t_blacklist tbList = new t_blacklist();

//la connessione col db
MyConnectionDB_SCDataContext conDb = new MyConnectionDB_SCDataContext();

//aggiorno due campi della tabella
tbList.NEW_CARD = Convert.ToInt64(newSC.Text);
tbList.OLD_CARD = Convert.ToInt64(oldSC.Text);

//effettuo l'insert a db
conDb.t_blacklists.InsertOnSubmit(tbList);

//effettuo il commit a db
conDb.SubmitChanges();


il campo dell'id della tabella a cui ho assegnato il vincolo di indentity invece funziona correttamente.

è davvero strano, spero riusciamo a risolvere il problema.
grazie mille
gianluca

gugoXX
22-06-2010, 14:21
Se stai usando l'entity framework immagino che la definzione della tabella t_blacklist e del gestore di questa tabella per andare a leggere/scrivere i record, passi NULL sotto quella colonna quando stai inserendo il singolo record

Occorre andare a vedere come "Insegnare" all'entity framework a trattare quel tipo di colonna.
Hai provato semplicemente a rinfrescare i metadati dopo aver aggiunto il constraint?

giangi_luca
22-06-2010, 15:24
dopo aver aggiunto il copstraint ho
1. fatto refresh sulla tabella da management studio
2. fatto refresh da visual studio nella parte dove aggiorno la tabella
e rimappata la tabella nel file di connessione.


devo fare altro?

giangi_luca
22-06-2010, 18:16
allora mettendo un breakpoint subito dopo avre eseguito il comando
conDb.t_blacklists.InsertOnSubmit(tbList);
conDb.SubmitChanges();

ho che la data è valorizza a null
mentre il campo id (su db è cn vincolo di identity) è valorizzato al valore che incrementa ogni volta.

che test posso fare altro?

Grazie
Gianluca

giangi_luca
22-06-2010, 18:39
ok!!! ho capito e risolto!!

allora il problema era il seguente:

accedendo ai campi della tabella mappata da VISUAL STUDIO ho
visto che i seguenti campi erano cosi valorizzati:

Auto Generated Value = false
Auto-sicn = never

mettondoli a true e oninsert ha funzionato.

però mi chiedo e vi chiedo queste opzioni vanno impostate da visual studio?
però per il campo del ID (con vincolo identity) i campi Auto Generated Value e Auto-sicn erano già valorizzati a true e onsinert.


Grazie del supporto
Gianluca