Conversione data su SqL

di Anonimizzato11185 il
11 risposte
Buonasera, ho scritto un programma il VB.net che va sul server SQL e scrive dei campi su una tabella tra cui una data. settata lì in formato data/ora.

Già, ho il problema che la dta e l' ora (Now) mi viene presa nel formato americano es(01/18/2019 17:51:01) ma cerco di trasformarla
       
        Dim str As Date = Now 
        Dim dDate As DateTime = DateTime.Parse(str, CultureInfo.InvariantCulture)
ma quando faccio l' insert il campo dDate che contiene la data mi da errore di conversione e non me la scrive.

Ho provato in tutti i modi anche cercando ci formattarla prima, ma niente.

Qualcuno sa aiutarmi?

11 Risposte

  • Il codice che mnostri non serve a nulla, riguardo alla scrittura e oltretutto non mostri come registri nella tabella.
    I campi di tipo DateTime vanno sempre scritti nella tabella nel formato americano (per default in tutti i database)

    A parte questo, si devono sempre usare i parametri nel Command, in questo modo non occorre preoccuparsi del formato richiesto dal database sottostante, sarà il Command stesso che pensa a registrare i valori nel formato richiesto.

    Per inciso, tu puoi banalmente anche passare al parametro una qualsiasi data purché valida come "18/01/2019", la proprietà di un controllo (Text o Value che sia). Sarà sempre il parametro a convertirla come serve.

    Puoi vedere un mio progetto :
    VB2008 OleDb (Access)
    http://nuke.vbcorner.net/Projects/NET/VB2008OleDbAccessnoDataSet/tabid/102/language/en-US/Default.aspx
  •     
                Dim FormatDate As DateTime = DateTime.Parse(Now, CultureInfo.InvariantCulture)
    
                                    strSQL = "INSERT INTO " & IniTbl & _
                                        "([Numero],[Descrizione],[Famiglia]," & _
                                        "[Iniziale],[Destinazione],[Percorso]," & _
                                        "[Stato],[Start]) " & _
                                        "VALUES ('" & Trim(Numero_Letto) & "','" & Trim(Descrizione_Letto) & "','" & Trim(Famiglia_Letto) & "','" & 			   Trim(Iniziale_Letto) & _
                                            "','" & Trim(Destinazione_Letto) & "','" & Trim(Percorso_Letto) & "','" & Stato & "','" & FormatDate & "')"
    
     
    
                                    cmdInt = New OleDbCommand(strSQL, MyConnessione)
                                    cmdInt.ExecuteNonQuery()
    
    Questo è il mio insert.
    nto pare non ho usato i parametri nel command.per settare la data come hai fatto tu nel to programma.

    Non uso mai i command?!?!?!?


    dovrei fare qualcosa del genere ?
                                    cmdInt.Parameters.Add("@ADateTime", OleDbType.Date)
    
  • Salve,
    di base "non si usa mai" codice dinamico al fine di evitare problemi di SQL Injection, dove a titolo di esempio, al codice "SELECT * ... " la persona con intento "malevolo" aggiunge un "; DROP [dbo].[tabella1];" o ricerche diverse o peggio ancora acquisizione di privilegi sull'engine e potenzialmente sul macchina stessa...
    questo e' uno dei motivi per i quali si usano i command, che sono in grado di gestire il parametro "puro e semplice", che andrebbe poi legato (ma qui apro una guerra di religione) alla esecuzione di sole stored procedures (ovviamente parametriche) e, al iivello di DCL (data control language) di esclusione di accesso diretto alle tabelle a tutti i database users/roles e quindi esecuzione di tutte le istruzioni DML tramite chiamate ad apposite stored procedures...

    chiusa questa "polemica" , SQL Server gestisce le date archiviandole in formato proprietario, e la SOLA VISUALIZZAZIONE e' in formato "leggibile"... tale formato di visualizzazione viene codificato in base alla Locale del account loggato... se le sue impostazioni (Management Studio -> Security -> Logins -> nomeAccount -> Properties -> proprieta' "Default Language" ) sono "Italiano", le date (ed anche i numeri) vengono visualizzati in formato italiano, diversamente vengono ovviamente rispettate le impostazioni della Locale prescelta...

    Detto questo, nell'esecuzione di codice dinamico, le date vanno "passate" alle istruzioni DML in un formato riconoscibile al momento dell'esecuzione, quindi, nel caso di impostazione di Locale in italiano per l'account in esecuzione, vanno formattate rispettando tale impostazione al fine di evitare che i "mesi" diventino "giorni" e viceversa... SQL Server, per evitare tale problematica, accetta di default anche la formattazione standard ISO, quindi ad esempio "yyyyMMdd" e "yyyy-MM-dd", che NON sono interpretabili se non come codificato, quindi risolvono de facto la problematica, e tale valorizzazione e' quella preferibile in assoluto in quanto NON legata alle impostazioni di localizzazione dello specifico account.

    saluti omnia
    --
    Andrea
  • Siete stati molto gentili ed esplicativi.
    Provo
    Saluti
  • visualrenzo ha scritto:


    Non uso mai i command?!?!?!?
    Ed è un grave errore, perché come hai già constatato, usare la concatenazione di stringhe (come hai mostrato) oltre che mettere in serio rischio la sicurezza, può solo creare problemi, e non porta alcun vantaggio pratico.

    visualrenzo ha scritto:


    dovrei fare qualcosa del genere ?
                                    cmdInt.Parameters.Add("@ADateTime", OleDbType.Date)
    
    Esatto.
  • Scusate, ma adesso mi avete fatto venire seri dubbi.

    "non usare codice dinamico al fine di evitare problemi di SQL Injection," quello che hai detto qui, come dovrei evitarlo?

    A questo punto ho sempre sbagliato,e forse mi è andata bene perchè nessuno ha modificato nulla.

    Quindi quale sarebbe il percorso da fare corretto per evitare spiacevoli inconvenienti..?

    Grazie
  • Salve,
    non posso dirti quello che "devi" fare... ti posso dire quello che "io" richiedo...
    utilizzando di base SQL Server, "io", "non accetto" codice come hai scritto tu, neanche se utilizzato tramite un command... nei framework che seguo, "tu" utilizzerai sempre e solo chiamate, sempre e solo tramite oggetti command, a stored procedures che il dba o altri abbiano gia' "autorizzato", valutato, ed ottimizzato... brutalmente, per capirci, cosa succede al tuo codice "se" il dba decide che la tua tabella
    "INSERT INTO " & IniTbl & _
                                        "([Numero],[Descrizione],[Famiglia]," & _
                                        "[Iniziale],[Destinazione],[Percorso]," & _
                                        "[Stato],[Start]) " & _
    non sara' piu' una sola tabella ma verra' "normalizzata" ulteriormente, per problemi architetturali, per problemi di armonizzazione degli "schemas", per frammentazione o altro? tendenzialmente "tutto" il codice applicativo dovra' essere analizzato per per verificarne i punti di accesso ed escludere che nessuna istruzione DML che referenzi la tabella [dbo].[pippo] sia ancora presente, visto che la tabella ora e' magari stata scomposta in [production].[pippo_legacy] e [production].[pippo_dati_nuovi]... con chiamate a stored procedures, il dba puo' permettersi, a parita' di parametri di ingresso e sempre a parita' di result set finale, di modificare e quindi "astrarre" completamente la "sua" base dati dal "tuo" codice applicativo, senza "rompere" niente (ok, questo ovviamente e' un'affermazione molto forte )... ancora, tu potresti non sapere che la chiamata a "SELECT p.[x], p.[y], p.[z] FROM [dbo].[pippo] p WHERE p.[x] = @param" che tu esegui dinamicamente, nella stored procedure che la sostituisce e che tu sei chiamato ad usare, quest'anno il dba abbia deciso di aggiungere " .... OPTION ( OPTIMIZE FOR (@anno = 2019') ); " visto che, quest'anno e' il 2019, mentre l'anno prossimo probabilmente utilizzera' 2020, e tutto questo consente migliore riusabilita' dei piani di esecuzione con aumenti di performance ...
    comprendo ovviamente che ad esempio tutti i "nuovi attrezzi" ORM siano bravi (piu' che bravi, a dire il vero) a scrivere codice dinamico, ma personalmente preferisco il "mio"
    ed in ogni caso i punti di accesso, e quindi di failure, sono minori e piu' controllabili... con il "tuo" codice dinamico, non penso tu sappia in effetti dire "velocemente" quanti siano questi punti di accesso alla base dati, alla specifica tabella, o ancora allo specifico attributo... con restrizioni di uso alle sole stored procedures, la valutazione si risolve sicuramente molto piu' in fretta e coinvolgendo sicuramente meno persone nell'analisi...
    ed altre motivazioni sono a sostegno di questa modalita'... come altre sono sicuramente contrarie.

    ripeto pero'.... questa e' una guerra di religione e non voglio ovviamente convincere nessuno... c'e' chi e' milanista e chi no
    polemica = off :D

    saluti omnia
    --
    Andrea
  • visualrenzo ha scritto:


    Quindi quale sarebbe il percorso da fare corretto per evitare spiacevoli inconvenienti..?
    Usare i parametri nei command.
  • Capito grazie.
  • Ho risolto.
     cmdInt.Parameters.Add("@ADateTime", OleDbType.Date)
     
     
    Se si usa oledb nella stringa insert non si mettono le @.... la i ?

    Grazie ancora a tutti
Devi accedere o registrarti per scrivere nel forum
11 risposte