FILESTREAM

THRON 05/02/2016 13:33:39
#457146
Boa tarde galera,

Bom, mesmo eu verificando linha por linha, já não sei se realmente sege isso,

eu fecho o FileStream em todas as conexões que faço no db que envolvam uma imagem, e mesmo assim, em alguns casos aparece [Ô]Erro ao acessar o arquivo, ele deve estar sendo usado por outro programa[Ô]

Cod: (segue um padrão no FileStream, todas as conexões eu fecho logo em seguida)

  

Try
[ô] Dim conn As New MySqlConnection

Dim conn As MySqlConnection
Dim myData As New DataTable
Dim dr As MySqlDataReader
Dim SQL As String



conn = New MySqlConnection
conn.ConnectionString = [Ô]server=localhost;user id=root;password=123456;database=apau_sers[Ô]
conn.Open()

SQL = [Ô]SELECT idarco_apa, arco_anime, arco_genero, arco_episodeos, arco_ovas, arco_especiais, arco_filmes,
arco_temporadas, arco_sinopse, arco_ap, arco_apganho, arco_datalancamento, arco_duracaoep, arco_produtores, arco_fimlancamento,
arco_dialancado, arco_imageanime, arco_up, arco_emlancamento, arco_nota FROM 'apau_sers'.'arco_apa' WHERE arco_anime=[ô][Ô] & DataGridView1.CurrentRow().Cells(0).Value & [Ô][ô];[Ô]

Try
Dim cmd As MySqlCommand = New MySqlCommand(SQL, conn)
dr = cmd.ExecuteReader(CommandBehavior.SingleRow)
If dr.HasRows Then
dr.Read()

point_arco.ID_M = dr.Item([Ô]idarco_apa[Ô])
point_arco.ANIME_M = dr.Item([Ô]arco_anime[Ô])
txtanime.Text = dr.Item([Ô]arco_anime[Ô])
point_arco.GENERO_M = dr.Item([Ô]arco_genero[Ô])
point_arco.EPISODEOS_M = dr.Item([Ô]arco_episodeos[Ô])
point_arco.OVAS_M = dr.Item([Ô]arco_ovas[Ô])
point_arco.ESPECIAIS_M = dr.Item([Ô]arco_especiais[Ô])
point_arco.FILMES_M = dr.Item([Ô]arco_filmes[Ô])
point_arco.TEMPORADAS_M = dr.Item([Ô]arco_temporadas[Ô])
point_arco.SINOPSE_M = dr.Item([Ô]arco_sinopse[Ô])
point_arco.AP_M = dr.Item([Ô]arco_ap[Ô])
point_arco.APG_M = dr.Item([Ô]arco_apganho[Ô])
point_arco.DATADELANÇAMENTO_M = dr.Item([Ô]arco_datalancamento[Ô])
point_arco.DURAÇÂOPOREP_M = dr.Item([Ô]arco_duracaoep[Ô])
point_arco.PRODUTORES_M = dr.Item([Ô]arco_produtores[Ô])
point_arco.FIMDELANÇAMENTO_M = dr.Item([Ô]arco_fimlancamento[Ô])
point_arco.DIALANÇADO_M = dr.Item([Ô]arco_dialancado[Ô])
point_arco.EMLANÇAMENTO = dr.Item([Ô]arco_emlancamento[Ô]) [ô] True / False
point_arco.NOTA_M = dr.Item([Ô]arco_nota[Ô])

If imganime.Image IsNot Nothing Then
imganime.Image.Dispose()
End If

Using fs As New FileStream([Ô]img.bmp[Ô], FileMode.Create)
Dim blobl As Byte() = DirectCast(dr.Item([Ô]arco_imageanime[Ô]), Byte())



fs.Write(blobl, 0, blobl.Length)

point_arco.IMG_M = Image.FromFile([Ô]img.bmp[Ô])


fs.Close()
End Using

imganime.Image = point_arco.IMG_M
imganime.Refresh()



End If

Catch ex As Exception
MsgBox(ex.ToString())
Finally

End Try
conn.Close()


Catch ex As MySqlException
MsgBox(ex.ToString())
End Try


DS2T 05/02/2016 13:38:46
#457147
Resposta escolhida
Quando você vai trabalhar com manipulação de arquivo ou banco de dados, é sempre bom destruir o objeto na memória com o Dispose.
Para isso, você pode fazer simplesmente:

                Dim NomeArquivoFoto As String = nomeArquivoImagem
Dim DadosImagem() As Byte
fs = New FileStream(NomeArquivoFoto, FileMode.Open, FileAccess.Read)
br = New BinaryReader(fs)
DadosImagem = br.ReadBytes(CType(fs.Length, Integer))
br.Close()
fs.Close()
fs.Dispose()


Ou ainda, usando o Using. Que faz isso automaticamente quando o objeto implementa a interface IDisposable.
Assim:

                Dim NomeArquivoFoto As String = nomeArquivoImagem
Dim DadosImagem() As Byte
Using fs = New FileStream(NomeArquivoFoto, FileMode.Open, FileAccess.Read)
br = New BinaryReader(fs)
DadosImagem = br.ReadBytes(CType(fs.Length, Integer))
br.Close()
fs.Close()
End Using


Abraços!
THRON 05/02/2016 13:51:54
#457150
Entre usar esse [Ô]Using[Ô] e usar o Dispose(), qual vc recomenda?
MOUSER 05/02/2016 14:00:28
#457152
Isso já fica a seu critério, o que se encaixar melhor para você! Eu nesta situação uso [Ô]Using[Ô]. Mas fica seu critério!
DS2T 05/02/2016 14:00:53
#457153
Eu recomendo o Using cara.
A única diferença entre eles é em caso da aplicação gerar um erro (um Exception). Com o Using, ele vai chamar o Dispose mesmo em caso de exception. O mesmo não ocorre se você usar .Dispose().
MOUSER 05/02/2016 14:02:39
#457154
Citação:

:
Eu recomendo o Using cara.
A única diferença entre eles é em caso da aplicação gerar um erro (um Exception). Com o Using, ele vai chamar o Dispose mesmo em caso de exception. O mesmo não ocorre se você usar .Dispose().


Uso da justificativa dele a minha!
THRON 05/02/2016 14:14:55
#457156
Cara, mesmo usando Dispose, quanto Using ainda aparece o mesmo erro :/

System.IO.IOException: O processo não pode acessar o arquivo [ô]C:\.....\img.bmp[ô] porque ele está sendo usado por outro processo.
OMAR2011 05/02/2016 14:28:18
#457157
Depois das explicações agora você entende porque disse para usar,
Using
End Using.
THRON 05/02/2016 14:29:36
#457158
Eu tive a ideia de, tipo olhem o codigo;


  
Try
Dim conn As New MySqlConnection


Dim myData As New DataTable
Dim dr As MySqlDataReader
Dim SQL As String



conn = New MySqlConnection
conn.ConnectionString = [Ô]server=localhost;user id=root;password=123456;database=apau_sers[Ô]
conn.Open()

SQL = [Ô]SELECT idarco_apa, arco_anime, arco_genero, arco_episodeos, arco_ovas, arco_especiais, arco_filmes,
arco_temporadas, arco_sinopse, arco_ap, arco_apganho, arco_datalancamento, arco_duracaoep, arco_produtores, arco_fimlancamento,
arco_dialancado, arco_imageanime, arco_up, arco_emlancamento, arco_nota FROM 'apau_sers'.'arco_apa' WHERE arco_anime=[ô][Ô] & DataGridView1.CurrentRow().Cells(0).Value & [Ô][ô];[Ô]

Try
Dim cmd As MySqlCommand = New MySqlCommand(SQL, conn)
dr = cmd.ExecuteReader(CommandBehavior.SingleRow)
If dr.HasRows Then
dr.Read()

point_arco.ID_M = dr.Item([Ô]idarco_apa[Ô])
point_arco.ANIME_M = dr.Item([Ô]arco_anime[Ô])
txtanime.Text = dr.Item([Ô]arco_anime[Ô])
point_arco.GENERO_M = dr.Item([Ô]arco_genero[Ô])
point_arco.EPISODEOS_M = dr.Item([Ô]arco_episodeos[Ô])
point_arco.OVAS_M = dr.Item([Ô]arco_ovas[Ô])
point_arco.ESPECIAIS_M = dr.Item([Ô]arco_especiais[Ô])
point_arco.FILMES_M = dr.Item([Ô]arco_filmes[Ô])
point_arco.TEMPORADAS_M = dr.Item([Ô]arco_temporadas[Ô])
point_arco.SINOPSE_M = dr.Item([Ô]arco_sinopse[Ô])
point_arco.AP_M = dr.Item([Ô]arco_ap[Ô])
point_arco.APG_M = dr.Item([Ô]arco_apganho[Ô])
point_arco.DATADELANÇAMENTO_M = dr.Item([Ô]arco_datalancamento[Ô])
point_arco.DURAÇÂOPOREP_M = dr.Item([Ô]arco_duracaoep[Ô])
point_arco.PRODUTORES_M = dr.Item([Ô]arco_produtores[Ô])
point_arco.FIMDELANÇAMENTO_M = dr.Item([Ô]arco_fimlancamento[Ô])
point_arco.DIALANÇADO_M = dr.Item([Ô]arco_dialancado[Ô])
point_arco.EMLANÇAMENTO = dr.Item([Ô]arco_emlancamento[Ô]) [ô] True / False
point_arco.NOTA_M = dr.Item([Ô]arco_nota[Ô])

If imganime.Image IsNot Nothing Then
imganime.Image.Dispose()
End If
point_arco.IMG_M = Nothing
Using fs As New FileStream([Ô]img.bmp[Ô], FileMode.Create)
Dim blobl As Byte() = DirectCast(dr.Item([Ô]arco_imageanime[Ô]), Byte())



fs.Write(blobl, 0, blobl.Length)
fs.Close()

End Using

point_arco.IMG_M = Image.FromFile([Ô]img.bmp[Ô])
imganime.Image = point_arco.IMG_M
imganime.Refresh()


End If

Catch ex As Exception
MsgBox(ex.ToString())
Finally

End Try
conn.Close()
Catch ex As MySqlException
MsgBox(ex.ToString())
End Try



Esse codigo, vai settar os valores do anime selecionado em um modulo.

o formulario2, vai fazer o mesmo, só que quando eu seleciono um registro na grid aparece o erro, então eu mudei no formulario 2 para [Ô]igm.bmp[Ô], sim funcionou tranquilo, mas queria saber o porque deste erro, uashdiauds não posso ficar criando arquivos toda vez que for fazer uma consulta com imagem
OMAR2011 05/02/2016 14:31:53
#457160
Pesquise na net e verificar
http://www.macoratti.net/vbn5_apl.htm
DS2T 05/02/2016 14:43:55
#457164
Opa cara, beleza?

Então, tenta fazer assim:


     Dim NomeArquivoFoto As String = nomeArquivoImagem
Dim DadosImagem() As Byte
Using fs = New FileStream(NomeArquivoFoto, FileMode.Open, FileAccess.Read)
Using br = New BinaryReader(fs)
DadosImagem = br.ReadBytes(CType(fs.Length, Integer))
br.Close()
End Using
fs.Close()
End Using



Não me atentei ao fato do seu BinaryReader não ter sido destruído também.

Tenta assim agora rapaz!
Página 1 de 3 [23 registro(s)]
Tópico encerrado , respostas não são mais permitidas