+ Rispondi al messaggio
Pagina 3 di 4 primaprima 1234 ultimoultimo
Visualizzazione dei risultati da 21 a 30 su 31

inserimento tipo di dato NUMERIC in database *.dbf VISUALFOXPRO

  1. #21
    Sgrubak non è in linea Scribacchino

  2. #22
    cris77 non è in linea Scolaretto
    grazie per il suggerimento Sgrubak ero verifico ...

  3. #23
    cris77 non è in linea Scolaretto
    Ho risolto per quanto riguarda l'inserimento dell' importo con la funzione Replace dove sostituisco la virgola con il punto in questo modo ed ora i records vengono inseriti all' interno della tabella:
    
      Dim cn As OleDbConnection
    
            cn = New OleDbConnection("Provider=vfpoledb.1;Data Source=C:\VTAM200701\VTAMDBF\;;Exclusive=false;Nulls=false")
    
     cn.Open()
    
     For Each row As DataGridViewRow In DataGridView1.Rows
    
                If Not row.IsNewRow Then
    
       Dim query As String = "INSERT INTO Docum(dosigpos, doannpos, donumpos, dotratta, dodatins, donumart, docontat, docoddoc, donumdoc, dodatdoc, dotrasmi, donote, docampo1, docampo2, dolinea, dotest1, dotest2, dotest3, dotest4, dotest5, dotest6, dovalor1, dovalor2, dodata1, dodata2, dointerno) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
    
    Dim cmd As OleDbCommand = New OleDbCommand(query)
                    cmd.Connection = cn
    
    
    
                    cmd.Parameters.AddWithValue("@dosigpos", row.Cells(6).Value)
                    cmd.Parameters.AddWithValue("@doannpos", row.Cells(7).Value)
                    cmd.Parameters.AddWithValue("@donumpos", row.Cells(5).Value)
                    cmd.Parameters.AddWithValue("@dotratta", 0)
                    cmd.Parameters.AddWithValue("@dodatins", row.Cells(0).Value)
                    cmd.Parameters.AddWithValue("@donumart", row.Cells(8).Value)
                    cmd.Parameters.AddWithValue("@docontat", 0)
                    cmd.Parameters.AddWithValue("@docoddoc", "N380")
                    cmd.Parameters.AddWithValue("@donumdoc", Trim(row.Cells(4).Value) & " " & Trim(row.Cells(1).Value))
                    cmd.Parameters.AddWithValue("@dodatdoc", #1/12/1899#)
                    cmd.Parameters.AddWithValue("@dotrasmi", " ")
                    cmd.Parameters.AddWithValue("@donote", " ") 'OleDbType.Empty
                    cmd.Parameters.AddWithValue("@docampo1", " ")
                    cmd.Parameters.AddWithValue("@docampo2", " ")
                    cmd.Parameters.AddWithValue("@dolinea", " ")
                    cmd.Parameters.AddWithValue("@dotest1", " ")
                    cmd.Parameters.AddWithValue("@dotest2", " ")
                    cmd.Parameters.AddWithValue("@dotest3", row.Cells(9).Value)
                    cmd.Parameters.AddWithValue("@dotest4", " ")
                    cmd.Parameters.AddWithValue("@dotest5", row.Cells(2).Value)
                    cmd.Parameters.AddWithValue("@dotest6", " ")
                    cmd.Parameters.AddWithValue("@dovalor1", Year(MaskedTextBox1.Text))
                    cmd.Parameters.AddWithValue("@dovalor2", row.Cells(3).Value)
                    cmd.Parameters.AddWithValue("@dodata1", #1/12/1899#)
                    cmd.Parameters.AddWithValue("@dodata2", #1/12/1899#)
                    cmd.Parameters.AddWithValue("@dointerno", 0)
    
    
    
    
                    cmd.ExecuteNonQuery()
    
    
                End If
    
            Next
    
    
            cn.Close()
            cn = Nothing
    
    l'unico problema è l' inserimento di un valore empty (quindi non nullo perchè mi da errore) per valore data nella tabella *.dbf.

    questo è il valore che deve comparire nel campo della tabella:

    / /
    io ora per inserire il record inserisco questo valore ma non mi piace:

      cmd.Parameters.AddWithValue("@dodata1", #1/12/1899#)
    
    qualche suggerimento?
    grazie

  4. #24
    Sgrubak non è in linea Scribacchino
    Quote Originariamente inviato da cris77 Visualizza il messaggio
    ora i records vengono inseriti all' interno della tabella:
    Probabile, ma la vedo dura... Forse ti inserisce il primo correttamente... Se ne hai più di uno, i successivi per me te li sbaglia.

    Quote Originariamente inviato da cris77 Visualizza il messaggio
    io ora per inserire il record inserisco questo valore ma non mi piace:
    Predisporre il campo che accetti valori NULL?

    Usa lo Using per gestire la connessione ed il comando...

  5. #25
    cris77 non è in linea Scolaretto
    Ciao Sgrubak,

    ti confermo che vengono inseriti tutti i records della tabella l' unico problema è con la data ...

  6. #26
    Sgrubak non è in linea Scribacchino
    Quote Originariamente inviato da cris77 Visualizza il messaggio
    ti confermo che vengono inseriti tutti i records della tabella l' unico problema è con la data ...
    Che vengano inseriti, lo immagino. Che i dati inseriti siano corretti, son certo di no...
    Dal momento che tu inserisci i punti interrogativi nell'istruzione di INSERT, quando il comando viene eseguito, questi vengono sostituiti coi i valori correttamente formattati dei parametri. I segnaposto, ossia i punti interrogativi, vengono sostituiti in ordine: il primo punto interrogativo viene sostituito con il valore del parametro @dosigpos, il secondo punto interrogativo con il valore del parametro @doannpos e così via.

    Ora, tralasciando l'inutilità (a mio avviso) di aggiungere un parametro tipo
    cmd.Parameters.AddWithValue("@dotratta", 0)
    
    in luogo di inserire uno zero direttamente nell'istruzione, dovresti notare che, ad esempio nel caso tu abbia due righe che differiscono solo per la data di inserimento (presumo il tuo parametro @dodatins corrispondente a row.Cells(0).Value), entrambe le righe verranno inserite con la stessa data. Il comando sostituirà il segnaposto col corrispondente parametro, ma che per lui sarà sempre lo stesso e di conseguenza avrà sempre lo stesso Value.

    Puoi fare un test di inserimento con valori diversi e dovresti notare quel che dico. In più, aggiungendo prima del Next un classico
    MessageBox.Show(cmd.Parameters.Count.ToString)
    
    dovresti anche notare un incremento, di 26 alla volta, del numero di parametri. Ma se tu hai 26 punti interrogativi i valori sostituiti saranno solo quelli dei primi 26 parametri. Quelli da 27 a 52 verranno ignorati.

    I parametri, secondo la mia esperienza, vanno dichiarati e creati fuori dal ciclo. Poi, all'interno del ciclo, fai variare i valori prendendoli dalla griglia. Alla fine, richiami l'ExecuteNonQuery e passi alla riga successiva. Proprio come da discussione che ti ho postato in precedenza
    Mi spiego?

  7. #27
    cris77 non è in linea Scolaretto
    Che vengano inseriti, lo immagino. Che i dati inseriti siano corretti, son certo di no...
    Ma cosa intendi che non è corretto il tipo di dato inserito?

    io sto cercando di inserire con questo parametro un dato di tipo date ma vuoto e non nullo

      cmd.Parameters.AddWithValue("@dodatdoc", OleDb.OleDbType.Date = vbEmpty
    
    ma da il seguente errore:

    Data Type Mismatch
    

  8. #28
    Sgrubak non è in linea Scribacchino
    Quote Originariamente inviato da cris77 Visualizza il messaggio
    Ma cosa intendi che non è corretto il tipo di dato inserito?
    Ad esempio, per il fatto che stai usando un overload del metodo (ossia uno dei tanti metodi che si chiamano AddWithValue ma che hanno dei parametri specifici - nel tuo caso una String per definire il nome ed un Object per il valore) che richiede delle attenzioni.

    Ti riporto la nota che la guida specifica:
    Prestare attenzione quando si utilizza questo overload del OleDbParameter costruttore per specificare i valori dei parametri Integer. Poiché l'overload accetta un value di tipo Object, è necessario convertire il valore integrale in un tipo Object, come illustrato nell'esempio C# riportato di seguito.
    Parameter = new OleDbParameter("@pname", Convert.ToInt32(0));
    
    Se non si esegue questa conversione, il compilatore presuppone che si stia tentando di chiamare l' OleDbParameter Overload del costruttore.
    Dal codice che hai riportato sembra tu inserisca sempre stringhe, ma i campi del DB sono effettivamente di quel tipo? Tu passi come secondo parametro una cosa tipo [row.Cells(9).Value]. Ora guarda sulla guida della proprietà DataGridViewCell.Value: vedi che l'oggetto ritornato dalla proprietà è un Object? Il che è compatibile con la firma dell'overload, ma devi pensare che effettivamente non puoi inserire un Object in un DB. Object è la classe di base del mondo .NET, ma nel DB devi inserire quel che il DB si aspetta, o, meglio ancora, un valore compatibile con quanto previsto dal campo del DB.

    A quello servono i parametri. A fare in modo che tu debba preoccuparti solo di mettere il segnaposto nel punto giusto dell'istruzione di INSERT e a valorizzarlo correttamente. Poi a "tradurlo" affinchè il DB lo capisca senza fraintendimenti ci pensa tutto il codice che sta dietro alla classe OleDBParameter.

    Rischi che passando un Object generico, senza fare in modo da codice che il valore sia esattamente quel che il DB vuole (nota la chiamata al metodo Convert.ToInt32 che nella guida), le conversioni generiche che il framework mette in atto, non siano aderenti perfettamente a quanto tu ti aspetti. Per ovviare a questo potresti specificare la tipologia di parametro andando a valorizzare la proprietà OleDBParameter.DbType e poi assegnando un Value opportunamente castato da codice.

    una cosa tipo:
    Dim pardosigpos as New OledbParameter()
    pardosigpos.DbType = DbType.String
    ...
    Dim query As String = "INSERT INTO Docum(dosigpos, doannpos) VALUES(?, '0')"
    Using cmd As New OdbcCommand(query, cn)
        cmd.Parameters.Add(pardosigpos)
    
        cn.Open()
        For Each row As DataGridViewRow In DataGridView1.Rows
     
               If Not row.IsNewRow Then
                    pardosigpos.Value = row.Cells(6).ToString() 'Chiamo il ToString perché è DbType.String. se fosse una data, farei in modo di assegnare una data.
               cmd.ExecuteNonQuery()
               End If
        Next
    End Using
    
    Ho semplificato la query riducendo i valori da inserire a due per comodità. Vedi che basta solo un parametro in questo caso? Il secondo valore, essendo una costante, l'ho inserito direttamente nell'istruzione del comando. Nota anche che creo il comando con i relativi parametri fuori dal ciclo. Così evito di dover, ad ogni riga, ricrearlo ed reinserire il parametro. Nel ciclo cambio solo il suo valore, ma tutta la parte di creazione la eseguo una volta sola.

    Riesco a spiegarmi?
    Ultima modifica di Sgrubak; 02-07-2021 14:16  Motivo: Corretto esempio. L'executeNonQuery era fori dal If.

  9. #29
    cris77 non è in linea Scolaretto
    Magari ho frainteso male io :

    Non capisco perché pur usando un Command non usi i relativi Parameters.
    Vedrai che con i parametri si mette tutto a posto da solo.
    Pensavo che leggendo i dati di una tabella per poi portarli nel datagridview e poi inserirli in un'altra tabella usando i parametri non avrei avuto bisogno di fare conversione o cast del tipo di dato... evidente non ho controllato verificato questa cosa...

    Using cmd As New OdbcCommand(query, cn)
    non dovrebbe essere:

    Using cmd As New OledbCommand
    oppure è indifferente ?

    grazie per il suggerimento ci studio un pò su

  10. #30
    Sgrubak non è in linea Scribacchino
    Quote Originariamente inviato da cris77 Visualizza il messaggio
    Pensavo che leggendo i dati di una tabella per poi portarli nel datagridview e poi inserirli in un'altra tabella usando i parametri non avrei avuto bisogno di fare conversione o cast del tipo di dato
    Si e no. Ad esempio le date... Alcuni DBMS ti complicano un po' la vita perchè preferiscono la data in formato anglosassone. Se tu ce l'hai mostrata nella griglia in formato italiano, e la importi dal DB come stringa, nel momento dell'insert o dell upload, rischi di inserire dati errati. Lo 01/02/2022 per noi è il primo febbraio, per altri è il due gennaio. Con i parametri, se tu assegni il DbType a Date e assegni come Value un DateTime, sei certo che il tutto sia corretto.


    Quote Originariamente inviato da cris77 Visualizza il messaggio
    oppure è indifferente ?
    Non è indifferente. Esistono 4 overload del costruttore.
    Ognuno crea un oggetto di tipo OleDbCommand. Solo che se già a priori conosci alcune proprietà, puoi sfruttare i costruttori dedicati, risparmiando di modificare quelle proprietà in un secondo momento. Nel caso dell'esempio, al blocco Using viene sempre assegnato un OleDbCommand, che verrà gestito direttamente dal framework a livello di Garbage Collection. Non ti devi preoccupare di chiamare il Dispose nemmeno in caso di eccezioni. Questo Command avrà già valorizzate le due proprietà OleDbConnection e CommandText. Senza usare quell'overload il codice sarebbe:
    Using cmd As New OdbcCommand
        cmd.CommandText = query
        cmd.Connection = cn
    
        cmd.Parameters.Add(pardosigpos)
     
    ...
    End Using
    

+ Rispondi al messaggio
Pagina 3 di 4 primaprima 1234 ultimoultimo

Potrebbero interessarti anche ...

  1. Risposte: 2
    Ultimo Post: 17-06-2021, 10:22
  2. Incompatibilità tra dato tipo testo di una cella e dato tipo string
    Da saveriomartino nel forum Microsoft Excel
    Risposte: 10
    Ultimo Post: 16-07-2015, 18:50
  3. tipo di dato per chiave primaria
    Da orpo970 nel forum Microsoft SQL Server
    Risposte: 3
    Ultimo Post: 27-06-2012, 20:47
  4. [c#] Tipo di dato in una textbox
    Da Zigo nel forum C#
    Risposte: 2
    Ultimo Post: 16-01-2006, 09:53
  5. controllo tipo di dato su textbox
    Da manupil nel forum Visual Basic 6
    Risposte: 9
    Ultimo Post: 13-03-2004, 10:39