uso un database access e per interrogarlo ADO.net. ho fatto un query che interroga il DB ma non so come scrivere il risultato dentro un file di testo.. ho provato con streamwrite writer ma non ci sono riuscito... qualche suggerimento?
uso un database access e per interrogarlo ADO.net. ho fatto un query che interroga il DB ma non so come scrivere il risultato dentro un file di testo.. ho provato con streamwrite writer ma non ci sono riuscito... qualche suggerimento?
fa' vedere quello che hai fatto
non mi da nessun errore ma al posto del risultato della query nel file di testo mi scrive "System.Data.OleDb.OleDbCommand"codice:archivio.Open() Dim modificadata1 As New System.DateTime(DateTimePicker1.Value.Ticks) Dim ricerca As New OleDb.OleDbCommand("SELECT Cli_For_Neg FROM Movimenti WHERE Data = @valore1", archivio) ricerca.Parameters.Add("@valore1", OleDbType.Date).Value = modificadata1.ToShortDateString ricerca.ExecuteNonQuery() Dim dataadapter As New OleDb.OleDbDataAdapter(ricerca) Dim data As New DataTable dataadapter.Fill(data) Dim scrive As New StreamWriter("C:\Amico\Dati.txt") scrive.Write(ricerca) archivio.Close() scrive.Close()
Ciao...
Quello che intendi fare non è così scontato: vuoi convertire un oggetto datatable in un file di testo..
Devi scrivere del codice tu, che a partire dalla tabella la ricrei come flusso di caratteri.
Potresti partire con separare ogni colonna col carattere tab e per ogni riga vai a capo.
Se il tuo obiettivo è quello di ottenere un file txt "in chiaro" il procedimento in generale è questo. Se invece a te serve solo salvare una copia del datatable da poterla ricaricare successivamente (anche se non ha molto senso) cerca processi di serializzazione di oggetti.
e quindi gli argomenti da toccare per fare ciò quali sono ?
Una veloce e sana ricerca su google?![]()
Ecco cosa ho trovato io, in 0.3 secondi.
Non l'ho provato ma è facile intuirne il funzionamento.codice:Public Sub DataTableToTextFile(dtToText As DataTable, filePath As String) Dim i As Integer = 0 Dim sw As StreamWriter = Nothing Try sw = New StreamWriter(filePath, False) 'For ColumnName's For i = 0 To dtToText.Columns.Count - 2 sw.Write(dtToText.Columns(i).ColumnName) Next sw.Write(dt.Columns(i).ColumnName) sw.WriteLine() 'For Data in the Rows For Each row As DataRow In dtToText.Rows Dim array As Object() = row.ItemArray For i = 0 To array.Length - 2 sw.Write(array(i).ToString()) Next sw.Write(array(i).ToString()) sw.WriteLine() Next sw.Close() Catch ex As Exception Response.Write("") End Try End Sub
Nel primo ciclo ti scrive il nome, l'intestazione della colonna.
Poi passa a scriverti le righe una alla volta.
Sto codice si può anche migliorare un po'.. Tipo, potresti pensare di usare lo stringbuilder per creare lo stream di caratteri che poi salvi tutto in una volta. Ne migliorerebbero le prestazioni. Poi non capisco perchè fa uscire il ciclo a -1 elemento dalla fine per scriverlo da solo la riga dopo..Bisogna provarlo. Altra correzione: usare gli array di object generici così non è che mi inspiri molto, perchè i cast li fa lui implicitamente..
Facci sapere![]()
![]()
grazie sono riuscito nel mio intento in questa maniera:
ora vorrei però che il datarow oppure anche la query scrivesse soltanto se un determinato compo fosse riempito da numeri mentre se ci fossero dei caratteri saltasse quest'ultimo e scrivesse soltanto gli altri.. è possibile ?codice:Dim dataadapter As New OleDb.OleDbDataAdapter(ricerca) Dim dataset As New DataSet dataadapter.Fill(dataset, "Movimenti") Dim table As DataTable = dataset.Tables("Movimenti") Dim lettura_tabella_del_dataset() As DataRow = table.Select() Dim numero As Integer For numero = 0 To lettura_tabella_del_dataset.GetUpperBound(0) FileOpen(1, "C:\Amico\dati.txt", OpenMode.Append) Print(1, lettura_tabella_del_dataset(numero)("Cli_For_Neg"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("Data"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("Ora"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("Numcassa"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("Numdoc"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("PrezzoVendita"), vbCrLf) FileClose() Next numero
usa la funzione IsNumeric
fatto così ma mi salta il campo anche quando c'è il numero..codice:If IsNumeric(lettura_tabella_del_dataset) = False Then For numero = 0 To lettura_tabella_del_dataset.GetUpperBound(0) FileOpen(1, "C:\Amico\dati.txt", OpenMode.Append) Print(1, Format(lettura_tabella_del_dataset(numero)("Data"), "yyyy/MM/dd"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("Ora"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("Numcassa"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("Numdoc"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("PrezzoVendita"), vbCrLf) FileClose() Next numero Else For numero = 0 To lettura_tabella_del_dataset.GetUpperBound(0) FileOpen(1, "C:\Amico\dati.txt", OpenMode.Append) Print(1, lettura_tabella_del_dataset(numero)("Cli_For_Neg"), SPC(3)) Print(1, Format(lettura_tabella_del_dataset(numero)("Data"), "yyyy/MM/dd"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("Ora"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("Numcassa"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("Numdoc"), SPC(3)) Print(1, lettura_tabella_del_dataset(numero)("PrezzoVendita"), vbCrLf) FileClose() Next numero End If
francolino, a volte mi perplimiRagiona prima di fare le cose
vuoi scrivere UN SINGOLO campo solo se è numerico? DENTRO al ciclo FOR...NEXT testa QUEL SINGOLO campo e decidi se scriverlo
dai che ce la fai!