Oppure

Loading
21/07/14 8:53
Light
Salve a tutti.
Per caricare un file in un database MySQL uso questo codice:

Dim conn As New MySqlConnection
Dim cmd As New MySqlCommand


Dim SQL As String


Dim FileSize As UInt32
Dim rawData() As Byte
Dim fs As FileStream




conn.ConnectionString = "server=ip;" _
& "uid=user;" _
& "pwd=pass;" _
& "database=test"


OpenFileDialog1.FileName = ""
OpenFileDialog1.Filter = "txt files (*.jpg)|*.png|All files (*.*)|*.*"
If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then


Try


fs = New FileStream(OpenFileDialog1.FileName, FileMode.Open, FileAccess.Read)
FileSize = fs.Length


rawData = New Byte(FileSize) {}
fs.Read(rawData, 0, FileSize)
fs.Close()


conn.Open()


SQL = "INSERT INTO upload (file_id,file_name,file_size,file) VALUES(NULL, ?file_name, ?file_size, ?file)"


cmd.Connection = conn
cmd.CommandText = SQL
cmd.Parameters.Add("?file_name", IO.Path.GetFileName(OpenFileDialog1.FileName))
cmd.Parameters.Add("?file_size", FileSize)
cmd.Parameters.Add("?file", rawData)


cmd.ExecuteNonQuery()


MessageBox.Show("File Inserted into database successfully!", _
"Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)


conn.Close()
Catch ex As Exception
MessageBox.Show("There was an error: " & ex.Message, "Error", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try


End If


Per scaricare un file in un database MySQL uso questo codice:

Dim conn As New MySqlConnection
Dim cmd As New MySqlCommand
Dim myData As MySqlDataReader
Dim SQL As String
Dim rawData() As Byte
Dim FileSize As UInt32
Dim fs As FileStream


conn.ConnectionString = "server=ip;" _
& "uid=user;" _
& "pwd=pass;" _
& "database=test"


SQL = "SELECT file_name, file_size, file FROM upload where file_id='2';"


Try
conn.Open()


cmd.Connection = conn
cmd.CommandText = SQL


myData = cmd.ExecuteReader


If Not myData.HasRows Then Throw New Exception("There are no BLOBs to save";)


myData.Read()


FileSize = myData.GetUInt32(myData.GetOrdinal("file_size";))
rawData = New Byte(FileSize) {}


myData.GetBytes(myData.GetOrdinal("file";), 0, rawData, 0, FileSize)


fs = New FileStream("C:\" & myData.GetString(myData.GetOrdinal("file_name";)), FileMode.OpenOrCreate, FileAccess.Write)
fs.Write(rawData, 0, FileSize)
fs.Close()


MessageBox.Show("File successfully written to disk!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)


myData.Close()
conn.Close()
Catch ex As Exception
MessageBox.Show("There was an error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try


Vorrei visualizzare la percentuale di caricamento del file in una label ed anche in una progressbar
Come posso fare?
Grazie in anticipo
aaa
21/07/14 20:42
Roby94
Il codice è interamente tuo o lo hai preso da qualche esempio?
aaa
21/07/14 20:56
Light
Un pò mio e un pò in rete, perchè?
aaa
23/07/14 15:45
Roby94
Perché senza che tu abbia ben chiaro tutti i passaggi che fai diventa una procedura ostica.
aaa
23/07/14 23:01
Light
Vi è una soluzione al mio problema?
aaa
24/07/14 14:02
Roby94
Scusa se non ho risposto completamente prima ma ero di fretta. Mhh non ci giurerei ma credo che sia improbabile... Praticamente tu stai aprendo il file in formato binario, a questo punto scrivi tutti i byte in una cella del database, per tanto il tempo della tua operazione comprende il tempo per aprire il file piu quello per leggerlo piu il tempo per scriverlo nel database. Dato l'altissimo livello con cui esegui queste operazioni mi sembra impossibile giungere a un valore di percentuale, l'unica opzione è sperare che esista un metodo della libreria mysql che ti restituisca la percentuale di completamento della query ma anche questo è fortemente improbabile.
aaa
24/07/14 15:09
Light
Quindi non è possibile ne avere una percentuale di caricamento(quando scarica), ne avere una percentuale di upload?
Molti mi dicono di usare il BrackgroundWorker.
aaa
24/07/14 23:44
Roby94
Sai a cosa serve la classe BackgroundWorker? Serve ad eseguire delle operazioni in un thread separato, se la tuo applicazione ha un interfaccia utente indubbiamente dovrai spostare le operazioni di upload e download in un thread separato, ma primo non con la classe BackgroundWorker ma direttamente con la classe Thread e secondo non risolveresti in ogni caso il tuo problema, poiché la percentuale di completamento del BackgroundWorker la dovresti dare tu con il metodo ReportProgress.
msdn.microsoft.com/it-it/library/…
Se hai altre domande chiedi pure.
aaa