FILESTREAM
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)
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
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:
Ou ainda, usando o Using. Que faz isso automaticamente quando o objeto implementa a interface IDisposable.
Assim:
Abraços!
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!
Entre usar esse [Ô]Using[Ô] e usar o Dispose(), qual vc recomenda?
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!
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().
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().
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!
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.
System.IO.IOException: O processo não pode acessar o arquivo [ô]C:\.....\img.bmp[ô] porque ele está sendo usado por outro processo.
Depois das explicações agora você entende porque disse para usar,
Using
End Using.
Using
End Using.
Eu tive a ideia de, tipo olhem o codigo;
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
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
Pesquise na net e verificar
http://www.macoratti.net/vbn5_apl.htm
http://www.macoratti.net/vbn5_apl.htm
Opa cara, beleza?
Então, tenta fazer assim:
Não me atentei ao fato do seu BinaryReader não ter sido destruÃdo também.
Tenta assim agora rapaz!
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!
Tópico encerrado , respostas não são mais permitidas