Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584

    [.net] funzione di aggiornamento tabella mysql da access (mi date un'occhiata?)

    salve a tutti
    data la seguente funzione (in basso)
    sto ercando di aggiornare delle tabella mysql trasferendo dei dati da access
    ho creato questa funzione che mi permette di modificare se un file esiste, e di inserirlo se non esiste
    purtroppo è gia' una settimana che ci sbatto la testa in quanto nell'update mi da errore hce la data non è nel formato valido, e nell'insert mi inserisce sempre NULL a tutti i parametri ed ovviamente mi da errore per chiave duplicata al secondo insert

    cosa sbaglio?
    cisarebbe anche da controllare come fare a reperire quale è il campo chiave o contatore dellatabella infatti non me lo prende mai

    codice:
    
        Public Function SincronizzaDb(ByVal DT As DataTable, ByVal DTMysql As DataTable, ByVal DataultimaSincrinizzazione As String, ByVal NomeTabella As String, 
    
    ByVal conn1 As OleDbConnection, ByVal MysqlConn As MySqlConnection) As String
            ' Dim NomeTabella As String = DT.ToString
            Dim Col As Int16
            Dim i As Integer
            Dim strsqlInsert As String = " INSERT INTO " & NomeTabella & "  ("
            Dim StrsqlUpdate As String = " UPDATE " & NomeTabella & " SET "
            Dim StrValues As String = " VALUES ("
            Dim NomeColonna As String
            Dim IndiceAutoIncremet As Int16
    
            '----cerco il contatore (da modificare per multichiavi)-----------------
            'For Col = 0 To DT.Columns.Count - 1
            '     If DT.Columns(i).AutoIncrement = True Then
            '          IndiceAutoIncremet = i
            '       End If
            '    Next
            IndiceAutoIncremet = 1 'LO METTO AD UNO IN QUANTO devo cercare il modo di reperire il campo chiave
    
    
    
    
    
            '--------stringa sql INSERT------
            For Col = 0 To DT.Columns.Count - 1
                '   If Col <> IndiceAutoIncremet Then
                strsqlInsert = strsqlInsert & " " & DT.Columns(Col).Caption & ","
                StrValues = StrValues & "@" & DT.Columns(Col).ColumnName() & "," '?
                '  End If
            Next
            strsqlInsert = Mid(strsqlInsert, 1, Len(strsqlInsert) - 1) 'tolgo l'ultima virgola 
            StrValues = Mid(StrValues, 1, Len(StrValues) - 1)
            strsqlInsert = strsqlInsert & " )"
            strsqlInsert = strsqlInsert & StrValues & ")"
    
    
            '--------stringa sql UPDATE------
            For Col = 0 To DT.Columns.Count - 1
                If Col <> IndiceAutoIncremet Then
                    StrsqlUpdate = StrsqlUpdate & " " & DT.Columns(Col).Caption & "=?,"
                End If
            Next
            StrsqlUpdate = Mid(StrsqlUpdate, 1, Len(StrsqlUpdate) - 1) 'tolgo l'ultima virgola 
    
    
    
    
    
    
            '--------parametri----------
            Dim CMDIns As New MySqlCommand(strsqlInsert, MysqlConn)
            Dim CMDUPd As New MySqlCommand(StrsqlUpdate, MysqlConn)
    
            For Col = 0 To DT.Columns.Count - 1
                NomeColonna = "?" ' DT.Columns(i).Caption
                ' Dim param As New OleDbParameter(DT.Columns(y).ColumnName(), GetOleDbType(DT.Columns(y).DataType()))
                CMDIns.Parameters.Add("@" & DT.Columns(Col).ColumnName(), GetOleDbType(DT.Columns(Col).DataType()))
    
                '---l'update non vuole il contatore------------------
                If Col <> IndiceAutoIncremet Then
                    NomeColonna = "?" ' DT.Columns(i).Caption
                    ' Dim param As New OleDbParameter(DT.Columns(y).ColumnName(), GetOleDbType(DT.Columns(y).DataType()))
                    CMDUPd.Parameters.Add(NomeColonna, GetOleDbType(DT.Columns(Col).DataType()))
                End If
            Next
    
    
    
    
            '-------valori con insert DT----------
    
            For i = 0 To DT.Rows.Count - 1
                If RecordEsiste(DTMysql, DT.Rows(i)(IndiceAutoIncremet), DT.Columns(IndiceAutoIncremet).Caption) = True Then
                    For Col = 0 To DT.Columns.Count - 1
                        If Col <> IndiceAutoIncremet Then
                            NomeColonna = DT.Columns(Col).Caption
                            CMDUPd.Parameters("?").Value = DT.Rows(i)(NomeColonna) 'NomeColonna
                        End If
                    Next
                    CMDUPd.CommandText = StrsqlUpdate & " WHERE " & DT.Columns(IndiceAutoIncremet).Caption & "=" & DT.Rows(i)(IndiceAutoIncremet)
                    CMDUPd.ExecuteNonQuery()
                Else
                      For Col = 0 To DT.Columns.Count - 1
                           NomeColonna = DT.Columns(Col).ColumnName() 'DT.Columns(Col).Caption
                            CMDIns.Parameters("@" & NomeColonna).Value = DT.Rows(i)(NomeColonna)
                        Next
                         CMDIns.ExecuteNonQuery()
                 
                End If
            Next
    
        End Function
        Private Function RecordEsiste(ByVal DT As DataTable, ByVal Codice As String, ByVal NomeCampo As String) As Boolean
            Dim i As Integer
            For i = 0 To DT.Rows.Count - 1
                If DT.Rows(i)(NomeCampo) = Codice Then
                    Return True
                End If
            Next
    
            Return False
        End Function
    
        Private Function GetOleDbType(ByVal sysType As Type) As MySqlDbType
            If sysType Is GetType(String) Then
                Return MySqlDbType.VarChar
            ElseIf sysType Is GetType(Integer) Then
                Return MySqlDbType.Int16
            ElseIf sysType Is GetType(Boolean) Then
                Return MySqlDbType.Bit
            ElseIf sysType Is GetType(Date) Then
                Return MySqlDbType.Date
            ElseIf sysType Is GetType(Char) Then
                Return MySqlDbType.String
            ElseIf sysType Is GetType(Decimal) Then
                Return MySqlDbType.Decimal
            ElseIf sysType Is GetType(Double) Then
                Return MySqlDbType.Double
            ElseIf sysType Is GetType(Single) Then
                Return MySqlDbType.Int64
            ElseIf sysType Is GetType(Byte()) Then
                Return MySqlDbType.Byte
            ElseIf sysType Is GetType(Guid) Then
                Return MySqlDbType.VarChar
            End If
        End Function
    grazie
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  2. #2
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Private Function GetOleDbType(ByVal sysType As Type) As MySqlDbType
    If sysType Is GetType(String) Then
    Return MySqlDbType.VarChar
    ElseIf sysType Is GetType(Integer) Then
    Return MySqlDbType.Int16
    ElseIf sysType Is GetType(Boolean) Then
    Return MySqlDbType.Bit
    ElseIf sysType Is GetType(Date) Then
    Return MySqlDbType.Date
    ElseIf sysType Is GetType(Char) Then
    Return MySqlDbType.String
    ElseIf sysType Is GetType(Decimal) Then
    Return MySqlDbType.Decimal
    ElseIf sysType Is GetType(Double) Then
    Return MySqlDbType.Double
    ElseIf sysType Is GetType(Single) Then
    Return MySqlDbType.Int64
    ElseIf sysType Is GetType(Byte()) Then
    Return MySqlDbType.Byte
    ElseIf sysType Is GetType(Guid) Then
    Return MySqlDbType.VarChar
    End If
    End Function
    questa è molto carina

  3. #3
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    si, serve per farti ritornare il tipo di dati di mysql ,i nquanto sono diversi da oledb, in effetti la funzione dovevo chiamarla diverrsamente..forse "getMysqlDbtype"

    cmq hai notato xke da quegli errori?
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Sarò ripetitivo, ma ancora non riesco a capire come mai i parametri non li utilizza nessuno... per arrivare poi a stupirsi degli errori derivanti dal loro mancato uso. :rollo:
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    Originariamente inviato da alka
    Sarò ripetitivo, ma ancora non riesco a capire come mai i parametri non li utilizza nessuno... per arrivare poi a stupirsi degli errori derivanti dal loro mancato uso. :rollo:
    se noti bene io USO i parametri
    infatti prima costruisco la stringa update e insert concatenando i vari campi e poi i parametri e poi faccio un ciclo per valorizzare i parametri
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da Kahm
    se noti bene io USO i parametri
    In effetti...

    Certo, c'è un po' di confusione in quell'uso, visto che l'SQL viene costruito sempre dinamicamente.

    Ad ogni modo, hai provato ad eseguire il debug passo per passo per verificare quali sono gli statement SQL finali? E soprattutto se ci sono tutti i parametri, assieme al loro valore effettivo?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    si
    allora tutti i parametri vengono valorizzati, ho controllato anche prima che viene eseguita la query per vedere ogni parametr oche valore ha e "stranamente" nella insert mi inserisce sempre null, come se non valorizzasse niente dei valori!

    poi nell'update ho un problema con le date, infatti da errore di data non è nel formato valido, eppure in access è un campo data!

    potete provare tutti questa funzione,ovviamente è molto generica, serve per aggiornare una tabella mysql da un database access,basta passargli le 2 connessoni,ed i datatable
    una volta completata credo che serva a tutti, purtroppo per ora non mi vanno alcune cose/
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

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.