Conversione data su SqL

di il
11 risposte

Conversione data su SqL

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

  • Re: Conversione data su SqL

    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
  • Re: Conversione data su SqL

        
                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)
    
  • Re: Conversione data su SqL

    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
  • Re: Conversione data su SqL

    Siete stati molto gentili ed esplicativi.
    Provo
    Saluti
  • Re: Conversione data su SqL

    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.
  • Re: Conversione data su SqL

    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
  • Re: Conversione data su SqL

    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
  • Re: Conversione data su SqL

    visualrenzo ha scritto:


    Quindi quale sarebbe il percorso da fare corretto per evitare spiacevoli inconvenienti..?
    Usare i parametri nei command.
  • Re: Conversione data su SqL

    Capito grazie.
  • Re: Conversione data su SqL

    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
  • Re: Conversione data su SqL

    Salve,
    vedi ad esempio https://stackoverflow.com/questions/5893837/using-parameters-inserting-data-into-access-database
    soprattutto la parte di heikofritz e igor

    vabbe'... ovviamente meglio anche il relativo KB: https://docs.microsoft.com/en-us/dotnet/api/system.data.oledb.oledbcommand.parameters?redirectedfrom=MSDN&view=netframework-4.7.2#System_Data_OleDb_OleDbCommand_Parameters

    saluti omnia
    --
    Andrea
Devi accedere o registrarti per scrivere nel forum
11 risposte