Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    188

    [VB6 SP6] Istruzione MySQL - problema inserimento Data

    Cari Amici,

    è tutto il pomeriggio che sto sbattendo contro un'istruzione per mysql comprendente l'inserimento della data. Ho provato varie versioni, ma mi inserisce sempre 01/01/0001.

    Qualcuno è così gentile da farmi capire dove sbaglio?

    L'istruzione è

    sql2 = "INSERT INTO tabella (data,idpaz) " _
    & "SELECT " & datevalue (campodata) & ", " + campo2 +""

    Ripeto che ho provato varie soluzioni, tra cui

    sql2 = "INSERT INTO tabella (data,idpaz) " _
    & "SELECT " & campodata & ", " + campo2 +""
    dove campodata è un campo definito data e nel quale ho messo il valore con istruzione subito precedente, ho provato come stringa

    sql2 = "INSERT INTO tabella (data,idpaz) " _
    & "SELECT '" + trim(datevalue (campodata)) + "', " + campo2 +""

    ma nulla. Gli altri campi, ho messo solo idpaz per motivi di semplicità, vengono popolati correttamente, sia che siano bit, integer, text, boolean.

    Se uso la recordset, funzion, però se riuscivo con l'istruzione secca preferisco.

    Grazie

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Scusa ma la sintassi che stai usando non mi pare esista.
    L'hai inventata tu?

    Qui trovi la sintassi corretta:
    http://www.w3schools.com/sql/sql_insert.asp

    Comunque, anche usando la sintassi corretta, resta sempre il problema della formattazione dei dati, che dipende dalle impostazioni del database e/o del singolo campo (soprattutto se di tipo Data).

    Per evitare mal di testa inutili, ti suggerisco di usare i Command con i Parametri proprio per evitare questo genere di problemi (vedi link sulla mia firma).

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    188
    Lungi da me il voler polemizzare, ma ...
    Originariamente inviato da gibra
    Scusa ma la sintassi che stai usando non mi pare esista.
    L'hai inventata tu?
    A prescindere che funziona, se non ricordo male, lavoravo con database Access, e, dopo aver creato la query (una simile, che mi faceva il popolamento dei campi di una tabella) sono andato a vedere la sintassi sql e l'ho riportata nel mio progetto visual basic.

    Comunque, ho preso quanto da te suggerito (il tuo esempio dell'uso del command e dei paramater)
    codice:
     sql2 = "INSERT INTO " + Trim(tabe) + " (idpaz,data,idop,stato,idfass,idrif1,idyyrif1,idora) " _      & "values (@idpaz,@data,@idop,@stato,@idfass,@idrif1,@idyyrif1,@idora)" 
     With cmd   
        Set par = .CreateParameter("@idpaz", adInteger, adParamInput, vista1.ListItems(i).SubItems(2))   .Parameters.Append par   
        Set par = .CreateParameter("@data", adDBDate, adParamInput, datacontcodfisc)   .Parameters.Append par
       Set par = .CreateParameter("@idop", adInteger, adParamInput, vista1.ListItems(i).SubItems(3))   .Parameters.Append par
       Set par = .CreateParameter("@stato", adWChar, adParamInput, 20, "0")   .Parameters.Append par
       Set par = .CreateParameter("@idfass", adInteger, adParamInput, vista1.ListItems(i).SubItems(7))
       .Parameters.Append par
       Set par = .CreateParameter("@idrif1", adInteger, adParamInput, vista1.ListItems(i).SubItems(4))
       .Parameters.Append par
       Set par = .CreateParameter("@idyyrif1", adInteger, adParamInput, vista1.ListItems(i).SubItems(5))
       .Parameters.Append par
       Set par = .CreateParameter("@idora", adInteger, adParamInput, vista1.ListItems(i).SubItems(6))
       .Parameters.Append par
        End With
               cmd.ActiveConnection = dbextfarm    'è la connessione aperta al database       cmd.CommandType = adCmdText  'il Tipo di comando, è semplice testo
         cmd.CommandText = sql2       'il testo del comando, la nostra query
          cmd.Execute

    ma il risultato non cambia, sempre 01/01/0001. Vorrà dire che userò il vecchio recordset.

    Grazie per il suggerimento.

    P.S.: per la cronaca ho provato anche sia type data che datatime, ma nulla.
    La cosa strana e che se faccio i due inserimenti 'contemporaneamente' quello con il recordset inserisce la data correttamente

    codice:
          
     rsorario.Open Trim(tabella), dbextfarm, adOpenStatic, adLockOptimistic                
     rsorario.AddNew 
     With rsorario 
         .AddNew
            !Data = DateValue(vista1.ListItems(i)):!idpaz = vista1.ListItems(i).SubItems(2)
            !idop = vista1.ListItems(i).SubItems(3): !stato = 0: 
            !idfass =vista1.ListItems(i).SubItems(7): !idrif1 = vista1.ListItems(i).SubItems(4):  
            !idyyrif1 = vista1.ListItems(i).SubItems(5):!idora = vista1.ListItems(i).SubItems(6)
          .Update
          .Close
     End With
    Conviene lasciar perdere?

    Ancora Grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    759
    Originariamente inviato da benjy
    A prescindere che funziona, se non ricordo male, lavoravo con database Access, e, dopo aver creato la query (una simile, che mi faceva il popolamento dei campi di una tabella) sono andato a vedere la sintassi sql e l'ho riportata nel mio progetto visual basic.
    La sintassi di INSERT che hai proposto è, molto approssimativamente, quella usata nel caso che si intenda prelevare i dati da un'altra tabella e non, come mi sembra che sia il tuo caso, da variabili. Credo anche che sia valida solo per database Jet.

    Per risalire alla causa del tuo problema, cosa contiene esattamente campodata? Verificalo in debug ponendo un break sulla linea immediatamente precedente e verifica anche il valore di DateValue(campodata). Trim non c'entra niente: più cose aggiungi è più è difficile trovare le cause.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    188
    campodata è una variabile definita data e, come ho fatto notare ad inizio post, ho provato varie soluzioni, con datevalue senza, con # con format etc. etc..

    Per quanto riguarda la sintassi,
    La sintassi di INSERT che hai proposto è usata nel caso che si intenda prelevare i dati da un'altra tabella e non, come mi sembra che sia il tuo caso, da variabili. Credo anche che sia valida solo per database Jet.
    Tieni anche presente che se il tuo database è MySql non puoi usare l'operatore "+" per concatenare stringhe nella query.
    la stringa sql funziona per tutti i campi tranne per quello data, che mi inserisce sempre il valore 01/01/0001, anche utilizzando le istruzioni dell'ottimo Gibra.campodata



    Infine, per risalire alla causa del tuo problema, cosa contiene esattamente campodata? Verificalo in debug ponendo un break sulla linea immediatamente precedente e verifica anche il valore di DateValue(campodata).
    non me ne volere, ma dopo 20 anni di programmazione, la prima cosa che controllo è il contenuto del campo e ripeto, lo strano è che le stesse variabili popolano correttamente se si usa la recordset.
    Purtroppo, mi sento la sfiga addosso, visto che da un pò di tempo mi capitano problemi che teoricamente hanno soluzioni 'facili' e praticamente mi si incaglia tutto. Pazienza, per il momento ho optato per aggirare il problema.

    Caro Grumphy , grazie lo stesso per l'aiuto (sinceramente, scusa se posso esserti sembrato brusco all'inizio)

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    1)
    Credo che non si possa paragonare Access, per il quale valgono altre regole, soprattutto per le date!

    2)
    Tu intendi dire che invece di usare adDBDate hai provato anche con adDate ?

    3)
    A parte questo, nel command usi questo:
    Set par = .CreateParameter("@data", adDBDate, adParamInput, datacontcodfisc)

    mentre nel Recordset usi questo:
    !Data = DateValue(vista1.ListItems(i))

    Non mi pare che il valore sia uguale...

    4)
    Inoltre, mi pare che in alcune chiamate CreateParameter hai omesso il parametro sulla dimensione...

    A parte il tutto, siccome non mi piace parlare senza cognizione di causa, ho fatto un test in MySQL con VB6 e ti confermo che il tuo codice NON è corretto.

    Ti suggerisco di utilizzare la routine SetADOParameter o meglio il modulo modADO.bas completo che trovi nel mio progetto su ADO che trovi in firma e che funziona egregiamente . Testato!

    Ad esempio, io usato questo codice con la tabella ORDERS (è del database NORTHWIND che ho convertito in MySQL).

    codice:
        Dim sSQL As String
        Dim sTable As String
        Dim cmd As ADODB.Command
    
        On Error GoTo ERR_HANDLER
    
        sTable = frmMain.cboTables.Text
        sSQL = "UPDATE " & sTable
        sSQL = sSQL & " SET CustomerID=?"
        sSQL = sSQL & "   , EmployeeID=?"
        sSQL = sSQL & "   , OrderDate=?"
        sSQL = sSQL & " WHERE OrderID=" & m_lOrderID
        
        Set cmd = New ADODB.Command
        With cmd
            .ActiveConnection = CN
            .CommandText = sSQL
            .CommandType = adCmdText
            SetADOParameter cmd, sTable, "CustomerID", txtCustomerID.Text
            SetADOParameter cmd, sTable, "EmployeeID", txtEmployeeID.Text
            SetADOParameter cmd, sTable, "OrderDate", DTPicker1.Value
                    
            .Execute
        End With
    Come vedi la data è impostata utilizzando un controllo DataPicker che come saprai la visualizza nel formato italiano (dd-mm-yyyy), mentre MySQL la vuole nel formato: yyyy-mm-dd

    Questo dimostra che il metodo migliore per UPDATE ed INSERT è quello di usare i Command di ADO.


  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    188
    A parte questo, nel command usi questo:
    Set par = .CreateParameter("@data", adDBDate, adParamInput, datacontcodfisc)

    mentre nel Recordset usi questo:
    !Data = DateValue(vista1.ListItems(i))

    Non mi pare che il valore sia uguale...

    hai perfettamente ragione, sono io che copiando in pezzi di codice, non mi sono accorto che non combaciavano, ma, ti assicuro, il datacontcodfisc è solo una delle prove, ho provato anche con la versione usata per la recordset (datavalue, per capirci)

    per quanto rigurada i parametri sulla dimensione... giusto ... ma essendo integer e date, bastano le 2 virgole ', , ' visto che non hanno dimensione, giusto?

    Comunque ho provato anche con questa modifica ma mi immette solo null. Però, l'ho preso dal tuo esempio sul tuo sito, why non funge?

    Volevo provare utilizzando il codice da te postato, ma giustamente non mi inserisce in quanto trattasi di update ed io devo inserire ex-novo.
    Ora mi metto a fare delle prove, modificando questa e provando parte del tuo progetto modADO, che se non erro oltre al modulo la routine che mi interessa è la RecordAggiorna
    Poi ti faccio sapere. Per ora grazie.

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    188
    WHAHO Risolto!!!!!!!!!!!!

    Innanzi tutto, caro Gibra, con il tuo modulo (da me modificato) non ci sono riuscito, mi inseriva sempre campi nulli. (Probabilmente sono l'unico che ha fatto intoppare la tua creazione ma... me ne faccio una colpa HAHAHHA )
    Alla fine era quasi l'uovo di Colombo (mio grande concittadino) ovvero, avevo provato tutto, ma non la formattazione all'americana, inserita poi come stringa ovvero:

    codice:
    sql2 = "INSERT INTO tabella (data) values ('" + Format(campodata, "yyyy-mm-dd") + "')"
    (ho semplificato con il solo campo data

    ... per non polemizzare, l'istruzione 'che mi sono inventato ' funziona anche per le variabili, anche in questo caso, basta una piccola modifica

    codice:
    sql2 = "INSERT INTO tabella (data)  select '" + Format(campodata, "yyyy-mm-dd") + "'"
    ... a differenza di VALUES, non servono le parentesi

    1) Credo che non si possa paragonare Access, per il quale valgono altre regole, soprattutto per le date!
    questa stessa istruzione funge su Access,SQL,MySQL.

    Oggi mi sono divertito, anche grazie a Voi.

    Un salutone e... a presto, sto per arrivare con un altro problema. Gibra, preparati, so che tu hai la soluzione per .Net, a me serve per VB6. Preparo il post, penso per domani.


    25

  9. #9
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da benjy
    Volevo provare utilizzando il codice da te postato, ma giustamente non mi inserisce in quanto trattasi di update ed io devo inserire ex-novo.
    Vero, ma non ha molta importanza, basta modificare la stringa SQL.
    Il problema era nel Command ed io volevo capire il perchè il tuo codice generava un'errore relativo al formato della data, cosa che con un Command non ha senso, dato che il Command converte automaticamente il valore nel formato richiesto dal campo della tabella.


    Originariamente inviato da benjy
    WHAHO Risolto!!!!!!!!!!!!

    Innanzi tutto, caro Gibra, con il tuo modulo (da me modificato) non ci sono riuscito, mi inseriva sempre campi nulli. (Probabilmente sono l'unico che ha fatto intoppare la tua creazione ma... me ne faccio una colpa HAHAHHA )
    Il modulo va usato così com'è , senza fare alcuna modifica dato che funziona perfettamente già di suo. Per inciso io lo uso in tutti i miei progetti.
    Infatti, mi è bastato aggiungere il file nel progetto di test, null'altro.

    Originariamente inviato da benjy
    Alla fine era quasi l'uovo di Colombo (mio grande concittadino) ovvero, avevo provato tutto, ma non la formattazione all'americana...
    come ti avevo già indicato è il formato che vuole MySQL.

    A parte le varie considerazioni personali, esiste un'ulteriore vantaggio nell'utilizzare i Command: se cambi database non devi correggere la query per adattarla al diverso database.

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    188
    Originariamente inviato da gibra
    Vero, ma non ha molta importanza, basta modificare la stringa SQL.
    Il problema era nel Command ed io volevo capire il perchè il tuo codice generava un'errore relativo al formato della data, cosa che con un Command non ha senso, dato che il Command converte automaticamente il valore nel formato richiesto dal campo della tabella.



    Il modulo va usato così com'è , senza fare alcuna modifica dato che funziona perfettamente già di suo. Per inciso io lo uso in tutti i miei progetti.
    Infatti, mi è bastato aggiungere il file nel progetto di test, null'altro.
    ...cioè: inserisco il modulo (cosa che ho fatto), io ho modificato poi la parte relativa al RecordAggiorna inserendo io miei campi e la mia connessione. Invece, cosa dovevo fare? lasciare la parte di istruzione che mi avevi detto che non funzionava e modificare... cosa?

    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.