Passare un valore nullo ad un campo datetime in sql

giovedì 17 maggio 2012 - 17.21

trinity Profilo | Guru

Ragazzi devo gestire una tabella già creata da altri e devo aggiornare delle date passandogli un valore Null..in altre parole nella colonna deve apparire "null".
Questa colonna è già settata ad acconsentire ad accettare valori null ed allora attraverso parameters ho scritto questo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Però mi dice che non posso passare un valore null..ovviamente se fosse stata creata da me gli avrei passato il valore standard 01-01-1900, ma nn posso altrimenti sballa mezzo programma.

Come faccio?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Però mi dice che non posso passare un valore null..ovviamente
>se fosse stata creata da me gli avrei passato il valore standard
>01-01-1900, ma nn posso altrimenti sballa mezzo programma.
un conto è la tabella, ma tu stai lanciando una stored procedure, l'errore che prendi è perchè il PARAMETRO non accetta null, non la colonna.

>Come faccio?
se non puoi cambiare.. devi passare un valore di default
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

trinity Profilo | Guru

Aspetta ho controllato e mi passa questo erroe:

Messaggio 515, livello 16, stato 2, procedura TR_AGGIUNGI_ANAGRAFICA, riga 78
Cannot insert the value NULL into column 'R_Codice_Albergo', table 'DB_GA_PROVA.dbo.Tab_Anagrafica_Clienti'; column does not allow nulls. INSERT fails.
The statement has been terminated.

Che si riferisce ad un'altra tabella e ho controllato sia la tabella su cui lavoro sia questa che viene indicata nell'errore e non sono state create delle relazioni tra loro...

La stored che eseguo è la seguente:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ecco ho fatto la prova anche di passare alla stored il valore '1900-01-01' ma esce lo stesso messaggio...strano

boh!!!

Guarda questa è la struttura della tabella su cui devo eseguire la stored:


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Questa invece è la struttura della tabella che viene citata nell'errore:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Cannot insert the value NULL into column 'R_Codice_Albergo',
>table 'DB_GA_PROVA.dbo.Tab_Anagrafica_Clienti'; column does not
>allow nulls. INSERT fails.
scusa ma cosa c'entra la data allora? stai cercando di inserire null dove non è consentito.. Ovvero la colonna R_Codice_Albergo nella Tab_Anagrafica_Clienti.
Non essendo nella sp, sicuro che non ci sia un trigger? Mi spiace ma così è proprio dura. Devi controllare con molta più attenzione ed approfondire cosa succede nella transazione.

>ecco ho fatto la prova anche di passare alla stored il valore
>'1900-01-01' ma esce lo stesso messaggio...strano
non è strano, non c'entra niente proprio, o meglio, se c'entra è perchè il trigger filtra per quella data..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

trinity Profilo | Guru

Nella transazione non avviene nulla io lavoro solo esclusivamente sulla tabella tab_alloggiati puoi vedere nel post precedente dove ho scitto la stored che eseguo...purtroppo il db non l'ho creato io me lo hanno dato in gestione ed il programma annesso non può essere + di tanto modificato..lo so è un bel casino e schifo (scusa la parola) ma cmq devo trovare una soluzione in merito.

si vero c'è un trigger...ora controllo se posso toglierlo..
Domanda ma i trigger che sono e a cosa servono?

ecco il trigger:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Nella transazione non avviene nulla io lavoro solo esclusivamente
>sulla tabella tab_alloggiati puoi vedere nel post precedente
>dove ho scitto la stored che eseguo...purtroppo il db non l'ho
>creato io me lo hanno dato in gestione ed il programma annesso
>non può essere + di tanto modificato..lo so è un bel casino e
>schifo (scusa la parola) ma cmq devo trovare una soluzione in
>merito.
Questo è quello che ti sembra, il trigger fa del lavoro da quanto si vede, e guardacaso sulla tabella che dà errore

>si vero c'è un trigger...ora controllo se posso toglierlo..
non credo proprio che tu possa toglierlo, da quanto vedo le logiche al suo interno sono decisamente tante.

>Domanda ma i trigger che sono e a cosa servono?
a "fare qualcosa" in base ad un certo evento. Nel tuo caso, questo trigger "fa qualcosa" appena dopo la insert o l'update.
Non credo che riuscirai a toglierlo, perchè dovrai mettere una mano pesante di refactor per assicurare retrocompatibilità ed evitare regressioni dannose.
Di solito non uso trigger a meno che non sia fondamentale o comodo, preferisco l'approccio procedurale, ma in questo caso credo che tu hai le mani proprio legate.

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Mau67 Profilo | Expert

Ciao io faccio nel seguente modo per memorizzare un dato null nei campi data vedi se ti può essere utile

chiaramente come controllo non puoi usare il datetimepicher ma o una textbox1 o una MaskedTextBox1

questo è il codice che devi inserire nella insert

If (MaskedTextBox1.Text = "") Then
SqlCmd.Parameters.AddWithValue("@CampoTuaTabella", DBNull.Value)
Else
SqlCmd.Parameters.AddWithValue("@Campotuatabella", MaskedTextBox1.Text)
End If

spero di esserti stato utile Ciao Maurizio
Mau67

trinity Profilo | Guru

Si grazie Mau,
rispondo ad Alx81 io comunque devo settare le date a null secondo te non ho altra strada?
Non si può bypassare? ossia non capisco devo aggiornare un campo che poi non è neanche chiave da nessuna parte e l'errore me lo va a generare un'altra tabella con la colonna di chiave primaria eseguendomi una insert...Boh non capisco proprio i programmatori che hanno creato sto database come hanno ragionato.....secondo me ci sono vie più semplici e performanti e molto + lineare



Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>rispondo ad Alx81 io comunque devo settare le date a null secondo te non ho altra strada?
Mi spiace ma non possiamo saperlo, la riuscita di quelle istruzioni è totalmente dipendente da logiche che sono nel software che stai guardando.
Se poi non lo puoi toccare e nessuno ti ha dato specifiche su come usarlo, per noi è dura

>Non si può bypassare? ossia non capisco devo aggiornare un campo
>che poi non è neanche chiave da nessuna parte e l'errore me lo
>va a generare un'altra tabella con la colonna di chiave primaria
>eseguendomi una insert...Boh non capisco proprio i programmatori
>che hanno creato sto database come hanno ragionato.....secondo
>me ci sono vie più semplici e performanti e molto + lineare
Che c'entra se il campo non è chiave? Se un campo ha un'importanza nel business e se qualcuno ha deciso di metterlo in quel modo, chi ha scelto avrà (o meno) avuto i suoi buoni motivi.
Purtroppo essendo di terze parti, quel software dovrà essere utilizzato così com'è, ed ogni cambiamento costa quanto ti sta già succedendo.
Sinceramente siamo un po' impotenti in situazioni come queste.
Non riesci a contattare chi ha scritto il software?


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

renarig Profilo | Expert

Concordo con Alx_81
Non puoi fare nulla senza l'appoggio di chi ha scritto il soft

>...Boh non capisco proprio i programmatori
>che hanno creato sto database come hanno ragionato.....secondo
>me ci sono vie più semplici e performanti e molto + lineare

Tu hai una tabella "Tab_alloggiati" con le prenotazioni
e in questa hai "DataArrivo" e "DataPartenza"

Poi hai la tabella "Tab_Anagrafica_Clienti"

La persona alloggiata non è sempre il cliente,
Ci sono Aziende ( clienti ) che fanno alloggiare i dipendenti ( alloggiato )


Per questo motivo sono necessarie 2 tabelle,
ma il modulo di prenotazione e presumibilmente unico ...


_____________________________________________________


Altra osservazione:
in una prenotazione DEVI inserire anche le date di arrivo e partenza
Diversamente che prenotazione è ??

__________________________________________________

Magari anche la fatturazione è legata alle date di arrivo e partenza

__________________________________________________

se non riesci neanche a scrivere una data di default ( 1/1/1900)
potrebbe significare che in qualche altra tabella è definito
l'inizio della attivita della stanza che stai prenorando

( Sto dando delle ipotesi di fantasia )




> io comunque devo settare le date a null secondo
>te non ho altra strada?

Io seguirei una strada alternativa:
Aggiungi alla tua "Tab_Alloggiati" il campo "Data_Partenza_Bis"

Dopo dovresti poter settare il campo Bis
al valore che vuoi, Anche a null se necessario

e per i tuoi scopi usi il tuo campo bis



saluti








Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5