Fórum Arquivo TXT no VB2005 .NET + Coletor de Dados #6909
18/06/2009
0
Estou com o seguinte problema em VB2005.NET e um Coletor para código de barras:
****************************************************************************
****************************************************************************
****************************************************************************
Funcionamento:
O programa lê códigos e grava em arquivo TEXTO
( DEFINIÇÃO GLOBAL Dim TxT As New System.IO.StreamWriter......).
Quando atinge a quantidade de 5 eu fecho o arquivo "Leituras.txt" , e transfiro os dados para o Banco de dados.
Essa operação se repetir inúmeras vezes. O problema ocorre quando vou ler a próxima variável, pois em
Sub InsereDados estou fechando TxT.Close()
Como faço para refazer a conexão com o arquivo "Leituras.txt" ?????
****************************************************************************
****************************************************************************
****************************************************************************
EXECUTANDO O PROGRAMA:
Tenho um form "FrmLeitura" onde tenho 3 SUB E A CLASSE Public Class ClsBD com a função
Function InsereLeituras()
1- TxT As New System.IO.StreamWriter( - Como GLOBAL)
2- Em InsereDados LEIO OS 5 CÓDIGOS
3- Executo TXT.Close
4- InsereLeituras() da Classe ClsBD - Gravo no banco e APAGO "Leituras.txt"
5- Volto para InsereDados, crio novamente o arquivo "Leituras.txt"
6- No próxima leitura trava em TxT.WriteLine(GravarTexto)
7 - Eu precisava que o TXT voltasse a funcionar
Obrigado
Ernany
****************************************************************************
****************************************************************************
****************************************************************************
CÓDIGO
Public Class FrmLeitura
Dim TxT As New System.IO.StreamWriter(EnderecoBDDados & "Leituras.txt", False)
Dim BDDescrCod As New ClsBD
WithEvents BDTxt As New ClsBD
Dim GravarTexto As String = ""
' Quando carrega o form - Novo
1- Private Sub FrmLeitura_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
TxT.AutoFlush = True
BDDescrCod.AbreBD()
Me.Tela()
End Sub
2- Private Sub FrmLeitura_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
TxT.Flush()
TxT.Close()
GravaLeituras()
End Sub
'Insere os dados no Banco de dados
3- Private Sub InsereDados(ByVal Codigo As String, ByVal Quantidade As Double, ByVal TipoDescricaoQtde As Integer)
If GravarTexto <> "" Then
TxT.WriteLine(GravarTexto) <<======================
End If
GravarTexto = LojaCod
ContLeituras += 1
If ContLeituras = 5 Then
TxT.WriteLine(GravarTexto)
TxT.Flush()
TxT.Close()
InsereLeituras()
If IO.File.Exists(EnderecoBDDados & "Leituras.txt") = False Then
Dim TxT As New System.IO.StreamWriter(EnderecoBDDados & "Leituras.txt", False)
End If
TxT.AutoFlush = True ????????????????????
End If
End Sub
End Class
'***********************************************************************
'***********************************************************************
'***********************************************************************
'***********************************************************************
'Nesta classe estão todas as funções de Banco de Dados
Public Class ClsBD
'Esta é a variável do endereço do BD
Const bd As String = EnderecoBDDados & NomeArquivoBDDados
Dim conn As New SQLite.SQLiteConnection(ConnStringDados) '"Data Source = " & bd)
Dim comm As New SQLite.SQLiteCommand
Public Event LinhaGravada(ByVal TamanhoString As Long)
Public TamanhoArquivo As Long
Public Function InsereLeituras() As Boolean
Dim Retorno As Boolean = True
Dim Txt As New IO.StreamReader(EnderecoBDDados & "Leituras.txt")
Dim Trans As SQLite.SQLiteTransaction
Dim Linha As String = "a"
Dim Valor As String()
Dim CommInsere As New SQLite.SQLiteCommand()
AbreBD()
CommInsere = conn.CreateCommand
Trans = conn.BeginTransaction
CommInsere.Transaction = Trans
While Linha <> Nothing And Retorno = True
Linha = Txt.ReadLine
If Linha <> Nothing Then
Valor = Linha.Split(";")
If Valor.Length = 8 Then
Try
CommInsere.CommandText = "insert into pcdesc (loja) values ('" & Valor(0) & "' )"
CommInsere.ExecuteNonQuery()
Catch ex As SQLite.SQLiteException
MsgBox(ex.Message)
Retorno = False
End Try
Else
Retorno = False
End If
RaiseEvent LinhaGravada(Linha.Length)
End If
End While
If Retorno = True Then
Try
Trans.Commit()
Catch ex As Exception
Trans.Rollback()
Retorno = False
End Try
End If
FechaBD()
Try
Txt.DiscardBufferedData()
Txt.Close()
Catch ex As Exception
Retorno = False
End Try
If Retorno = True Then
Try
IO.File.Delete(EnderecoBDDados & "Leituras.txt")
Catch ex As Exception
Retorno = False
End Try
End If
CommInsere = Nothing
Txt = Nothing
Trans = Nothing
Return Retorno
End Function
End Class
Ernany
Curtir tópico
+ 0Posts
18/06/2009
Ernany
Ocorre em :
If GravarTexto <> "" Then
TxT.WriteLine(GravarTexto) <<<<=================================
System.ObjectDisposedException was unhandled
Message="ObjectDisposedException"
ObjectName=""
StackTrace:
at System.IO.__Error.WriterClosed()
at System.IO.StreamWriter.Flush()
at System.IO.StreamWriter.Write()
at System.IO.TextWriter.WriteLine()
at PocketClient.FrmLeitura.InsereDados()
at PocketClient.FrmLeitura.txtquantidade_KeyDown()
at System.Windows.Forms.Control.OnKeyDown()
at System.Windows.Forms.Control.WnProc()
at System.Windows.Forms.Control._InternalWnProc()
at Microsoft.AGL.Forms.EVL.EnterMainLoop()
at System.Windows.Forms.Application.Run()
at PocketClient.FrmMain.Main()
Gostei + 0
19/06/2009
Ernany
A criação de "Dim TxT As New System.IO....." não funciona, pois "TXT" não está como global.
https://www.devmedia.com.br/imagens/discovirtual/185374/ErroArquivoTXT.zip
If ContLeituras = 5 Then
TxT.WriteLine(GravarTexto)
TxT.Flush()
TxT.Close()
InsereLeituras()
If IO.File.Exists(EnderecoBDDados & "Leituras.txt") = False Then
Dim TxT As New System.IO.StreamWriter(EnderecoBDDados & "Leituras.txt", False)
End If
TxT.AutoFlush = True ????????????????????
*******************************************************************************
*********************************************************************************************************************************************************************************************************************************************OUTRA TENTATIVA:
Eu tentei colocar o seguinte código:
If ContLeituras = 5 Then
me.close()
endIf
Mas ocorre o ERRO no Sub InterfaceComQtde() , quando está limpando a tela paraler um próximo número. Segue o código e a imagem do ERRO.
Esse código ficou melhor pois mantenho "TXT" como global.
https://www.devmedia.com.br/imagens/discovirtual/185374/ErroArquivoTXT2.zip
Obrigado
Ernany
****************************************************************************
****************************************************************************
****************************************************************************
CÓDIGO
Public Class FrmLeitura
Dim TxT As New System.IO.StreamWriter(EnderecoBDDados & "Leituras.txt", False)
Dim BDDescrCod As New ClsBD
WithEvents BDTxt As New ClsBD
Dim GravarTexto As String = ""
' Quando carrega o form - Novo
1- Private Sub FrmLeitura_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
TxT.AutoFlush = True
BDDescrCod.AbreBD()
Me.Tela()
End Sub
2- Private Sub FrmLeitura_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
TxT.Flush()
TxT.Close()
GravaLeituras() <<=========== Gravação
End Sub
'Insere os dados no Banco de dados
3- Private Sub InsereDados(ByVal Codigo As String, ByVal Quantidade As Double, ByVal TipoDescricaoQtde As Integer)
If GravarTexto <> "" Then
TxT.WriteLine(GravarTexto)
End If
GravarTexto = LojaCod
ContLeituras += 1
If ContLeituras = 5 Then
Me.close <<<< ================= fecha
End If
End Sub
4- 'Faz a limpeza da tela nos casos com qtde
Private Sub InterfaceComQtde()
Me.txtquantidade.Text = "" <<<< ================= ERRO
Me.TxtCodValue.Text = ""
Me.TxtCodValue.Focus()
Me.TxtCodValue.SelectAll()
End Sub
End Class
'***********************************************************************
'***********************************************************************
'***********************************************************************
'***********************************************************************
'Nesta classe estão todas as funções de Banco de Dados
Public Class ClsBD
'Esta é a variável do endereço do BD
Const bd As String = EnderecoBDDados & NomeArquivoBDDados
Dim conn As New SQLite.SQLiteConnection(ConnStringDados) '"Data Source = " & bd)
Dim comm As New SQLite.SQLiteCommand
Public Event LinhaGravada(ByVal TamanhoString As Long)
Public TamanhoArquivo As Long
Public Function InsereLeituras() As Boolean
Dim Retorno As Boolean = True
Dim Txt As New IO.StreamReader(EnderecoBDDados & "Leituras.txt")
Dim Trans As SQLite.SQLiteTransaction
Dim Linha As String = "a"
Dim Valor As String()
Dim CommInsere As New SQLite.SQLiteCommand()
AbreBD()
CommInsere = conn.CreateCommand
Trans = conn.BeginTransaction
CommInsere.Transaction = Trans
While Linha <> Nothing And Retorno = True
Linha = Txt.ReadLine
If Linha <> Nothing Then
Valor = Linha.Split(";")
If Valor.Length = 8 Then
Try
CommInsere.CommandText = "insert into pcdesc (loja) values ('" & Valor(0) & "' )"
CommInsere.ExecuteNonQuery()
Catch ex As SQLite.SQLiteException
MsgBox(ex.Message)
Retorno = False
End Try
Else
Retorno = False
End If
RaiseEvent LinhaGravada(Linha.Length)
End If
End While
If Retorno = True Then
Try
Trans.Commit()
Catch ex As Exception
Trans.Rollback()
Retorno = False
End Try
End If
FechaBD()
Try
Txt.DiscardBufferedData()
Txt.Close()
Catch ex As Exception
Retorno = False
End Try
If Retorno = True Then
Try
IO.File.Delete(EnderecoBDDados & "Leituras.txt")
Catch ex As Exception
Retorno = False
End Try
End If
CommInsere = Nothing
Txt = Nothing
Trans = Nothing
Return Retorno
End Function
End Class
Gostei + 0
19/06/2009
Fabio Mans
Passo somente o problema
Obrigado
Gostei + 0
19/06/2009
Ernany
Vamos tentar novamente:
O ocorre o ERRO no Sub InterfaceComQtde() , quando está limpando a tela paraler um próximo número.
https://www.devmedia.com.br/imagens/discovirtual/185374/ErroArquivoTXT2.zipSequencia do programa:
1- Sub InsereDados2- ContLeituras = 5 ===> me.close3- Sub FrmLeitura_Closing == > GravaLeituras()4- Function InsereLeituras() ==> insere os dados no Banco5- Volta para FrmLeitura_Closing6- Continua para novas Leituras ..... e trava em : Sub InterfaceComQtde()
Obrigado
Ernany
****************************************************************************
****************************************************************************
****************************************************************************
C�DIGO
Public Class FrmLeitura
Dim TxT As New System.IO.StreamWriter(EnderecoBDDados & "Leituras.txt", False)
Dim BDDescrCod As New ClsBD
WithEvents BDTxt As New ClsBD
Dim GravarTexto As String = ""
' Quando carrega o form - Novo
1- Private Sub FrmLeitura_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
TxT.AutoFlush = True
BDDescrCod.AbreBD()
Me.Tela()
End Sub
2- Private Sub FrmLeitura_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
TxT.Flush()
TxT.Close()
GravaLeituras() <<=========== Gravação
BDDescrCod.FechaBD()
BDDescrCod.Dispose()
BDDescrCod = Nothing
BDTxt = Nothing
GC.Collect()
End Sub
'Insere os dados no Banco de dados
3- Private Sub InsereDados(ByVal Codigo As String, ByVal Quantidade As Double, ByVal TipoDescricaoQtde As Integer)
If GravarTexto <> "" Then
TxT.WriteLine(GravarTexto)
End If
GravarTexto = LojaCod
ContLeituras += 1
If ContLeituras = 5 Then
Me.close <<<< ================= fecha
End If
End Sub
4- 'Faz a limpeza da tela nos casos com qtde
Private Sub InterfaceComQtde()
Me.txtquantidade.Text = "" <<<< ================= ERRO
Me.TxtCodValue.Text = ""
Me.TxtCodValue.Focus()
Me.TxtCodValue.SelectAll()
End Sub
End Class
'***********************************************************************
'***********************************************************************
'***********************************************************************
'***********************************************************************
'Nesta classe estão todas as funções de Banco de Dados
Public Class ClsBD
'Esta é a variável do endereço do BD
Const bd As String = EnderecoBDDados & NomeArquivoBDDados
Dim conn As New SQLite.SQLiteConnection(ConnStringDados) '"Data Source = " & bd)
Dim comm As New SQLite.SQLiteCommand
Public Event LinhaGravada(ByVal TamanhoString As Long)
Public TamanhoArquivo As Long
Public Function InsereLeituras() As Boolean
Dim Retorno As Boolean = True
Dim Txt As New IO.StreamReader(EnderecoBDDados & "Leituras.txt")
Dim Trans As SQLite.SQLiteTransaction
Dim Linha As String = "a"
Dim Valor As String()
Dim CommInsere As New SQLite.SQLiteCommand()
AbreBD()
CommInsere = conn.CreateCommand
Trans = conn.BeginTransaction
CommInsere.Transaction = Trans
While Linha <> Nothing And Retorno = True
Linha = Txt.ReadLine
If Linha <> Nothing Then
Valor = Linha.Split(";")
If Valor.Length = 8 Then
Try
CommInsere.CommandText = "insert into pcdesc (loja) values ('" & Valor(0) & "' )"
CommInsere.ExecuteNonQuery()
Catch ex As SQLite.SQLiteException
MsgBox(ex.Message)
Retorno = False
End Try
Else
Retorno = False
End If
RaiseEvent LinhaGravada(Linha.Length)
End If
End While
If Retorno = True Then
Try
Trans.Commit()
Catch ex As Exception
Trans.Rollback()
Retorno = False
End Try
End If
FechaBD()
Try
Txt.DiscardBufferedData()
Txt.Close()
Catch ex As Exception
Retorno = False
End Try
If Retorno = True Then
Try
IO.File.Delete(EnderecoBDDados & "Leituras.txt")
Catch ex As Exception
Retorno = False
End Try
End If
CommInsere = Nothing
Txt = Nothing
Trans = Nothing
Return Retorno
End Function
End Class
Gostei + 0
22/06/2009
Luiz Maia
Gostei + 0
22/06/2009
Ernany
Vamos lá:
Tenho um coletor de Dados com VB2005.NET e SQLite.
Qdo eu faço uma consulta no Banco SQLite está rápida, mas a gravação está lenta. Geralmente na
terceira consulta ele fica "pensando" uns 5 segundos.... para gravar.
Devido a essa demora, após um valor de leituras estipulado, eu grava os dados em um ARQUIVO texto
e depois transfiro para o BANCO SQLite.
Basicamente o programa tem duas Telas:
a)Entrada (Menu de Opções)
b)Leituras ( onde são feitas as inúmeras leituras dos produtos de código de barras.)
Problema: Está sendo as aberturas do ARQUIVO Texto.
a) Qdo estou em na SUB InsereDados executo o seguinte comando : "TxT.Close()"
b) Em Sub GravaLeituras() estou BDTxt.FechaBD()
c) E qdo estou em Public Function InsereLeituras estou apagando o arquivo texto
IO.File.Delete(EnderecoBDDados & "Leituras.txt")
COMO FAÇO PARA ABRI-LOS NOVAMENTE, pois eles estão definidos como
GLOBAL???
****************************************************************************
****************************************************************************
****************************************************************************
Sequencia do programa:
1- Sub InsereDados2- ContLeituras = 5 (5 leituras para fazer os testes)
3- GravaLeituras()4- Function InsereLeituras() ==> insere os dados no Banco5- Sub InsereDados6- Aguarda para a próxima leitura
Obrigado
Ernany
****************************************************************************
****************************************************************************
****************************************************************************
CODIGO
Public Class FrmLeitura
Dim TxT As New System.IO.StreamWriter(EnderecoBDDados & "Leituras.txt", False)
Dim BDDescrCod As New ClsBD
WithEvents BDTxt As New ClsBD <<========== Classe onde tenho a função que grava no SQLite
Dim GravarTexto As String = ""
1- ' Gerencia quantas leituras são realizadas antes de inserir no Banco
Private Sub InsereDados(ByVal Codigo As String, ByVal Quantidade As Double, ByVal TipoDescricaoQtde As Integer)
If GravarTexto <> "" Then
TxT.WriteLine(GravarTexto)
End If
GravarTexto = LojaCod <<=========== variável a ser gravada
ContLeituras += 1
If ContLeituras = 5 Then
If GravarTexto <> "" Then <<=========== Gravação
TxT.WriteLine(GravarTexto)
GravarTexto = ""
ContLeituras = 0
End If
TxT.Flush()
TxT.Close() <<========= fechando
GravaLeituras() <<=========== Gravação
' Criação do Arquivo Leituras.txt , pois foi apagado em InsereLeituras()
If IO.File.Exists(EnderecoBDDados & "Leituras.txt") = False Then
Dim novo As New System.IO.StreamWriter(EnderecoBDDados & "Leituras.txt", True)
End If
End Sub
2- 'Faz o processo de inclusão das leituras
Private Sub GravaLeituras()
If IO.File.Exists(EnderecoBDDados & "Leituras.txt") = True Then
PB.Maximum = ClsTexto.TamanhoArquivo(EnderecoBDDados & "Leituras.txt")
If PB.Maximum > 60 Then
Application.DoEvents()
Me.Refresh() ' colocado depois
BDTxt.InsereLeituras()
BDTxt.FechaBD() <<========= fechando
BDTxt = Nothing
Else
IO.File.Delete(EnderecoBDDados & "Leituras.txt") << =======arquivo vazio
End If
End If
End Sub
3- Public Function InsereLeituras() As Boolean da Classe <<== Está em outro arquivo
Classe ClsBD
'***********************************************************************
'***********************************************************************
'***********************************************************************
'***********************************************************************
'Nesta classe estão todas as funções de Banco de Dados
Public Class ClsBD
'Esta é a variável do endereço do BD
Const bd As String = EnderecoBDDados & NomeArquivoBDDados
Dim conn As New SQLite.SQLiteConnection(ConnStringDados) '"Data Source = " & bd)
Dim comm As New SQLite.SQLiteCommand
Public Event LinhaGravada(ByVal TamanhoString As Long)
Public TamanhoArquivo As Long
Public Function InsereLeituras() As Boolean
Dim Retorno As Boolean = True
Dim Txt As New IO.StreamReader(EnderecoBDDados & "Leituras.txt")
Dim Trans As SQLite.SQLiteTransaction
Dim Linha As String = "a"
Dim Valor As String()
Dim CommInsere As New SQLite.SQLiteCommand()
AbreBD()
CommInsere = conn.CreateCommand
Trans = conn.BeginTransaction
CommInsere.Transaction = Trans
While Linha <> Nothing And Retorno = True
Linha = Txt.ReadLine
If Linha <> Nothing Then
Valor = Linha.Split(";")
If Valor.Length = 8 Then
Try
CommInsere.CommandText = "insert into pcdesc (loja) values ('" & Valor(0) & "' )"
CommInsere.ExecuteNonQuery()
Catch ex As SQLite.SQLiteException
MsgBox(ex.Message)
Retorno = False
End Try
Else
Retorno = False
End If
RaiseEvent LinhaGravada(Linha.Length)
End If
End While
If Retorno = True Then
Try
Trans.Commit()
Catch ex As Exception
Trans.Rollback()
Retorno = False
End Try
End If
FechaBD()
Try
Txt.DiscardBufferedData()
Txt.Close()
Catch ex As Exception
Retorno = False
End Try
If Retorno = True Then
Try
IO.File.Delete(EnderecoBDDados & "Leituras.txt")
Catch ex As Exception
Retorno = False
End Try
End If
CommInsere = Nothing
Txt = Nothing
Trans = Nothing
Return Retorno
End Function
End Class
Gostei + 0
22/06/2009
Luiz Maia
Gostei + 0
22/06/2009
Ernany
Como faço para "limpar" um arquivo TXT?
Ernany
Gostei + 0
22/06/2009
Luiz Maia
Substituir:
StreamWriter arquivo = new StreamWriter(Server.MapPath("ListaCpf.txt"), true, Encoding.ASCII);
Por:
StreamWriter arquivo = new StreamWriter(Server.MapPath("ListaCpf.txt"), false, Encoding.ASCII);
O segundo parâmetro indica se o modo de escrita é appendable, ou seja, ao invés de criar um novo arquivo ele incrementa ao arquivo anterior o conteúdo a ser escrito. Como false o arquivo é sobrescrito pelo novo conteúdo.
Espero ter ajudado. Aguardo Abraços Att Luiz Maia
Gostei + 0
22/06/2009
Ernany
Não deu certo.
1- Se você reparar inicialmente o arquivo foi criado como "FALSE"
Dim TxT As New System.IO.StreamWriter(EnderecoBDDados & "Leituras.txt", False)
2- Recriando o arquivo como FALSE, dentro de Sub InsereDados, também não deu certo, pois
tive antes que executar "TxT.Close()"
Dim Txt As New System.IO.StreamWriter(EnderecoBDDados & "Leituras.txt", FALSE)
3- Se eu não executo "TxT.Close()" e BDTxt.FechaBD() não consigo recriar o Arquivo.
4- Executando "TxT.Close()""Quando chego em
If GravarTexto <> "" Then
TxT.WriteLine(GravarTexto) <<<<============ Erro NullReferenceException"
End If
Então ficamos na mesma.... ou eu falta alguma coisa???
Obrigado,
Ernany
Gostei + 0
23/06/2009
Luiz Maia
Gostei + 0
24/06/2009
Luiz Maia
Gostei + 0
24/06/2009
Ernany
Eu também estou tentando entender a lógica para te falar sobre o porque da lentidão. Eu tenho
problema de memória no Coletor... tem pouca memória para trabalhar. E a cada 3 leituras o coletor para
uns 3 a 5 segundos para a próxima leitura.
Com o arquivo texto eu só paro uma vez para gravar no banco ....em um intervalo determinado de leituras.
Estou preparando e te passo para entendermos o que acontece.
Obrigado,
Ernany
Gostei + 0
25/06/2009
Ernany
Fiz vários testes de Leitura e Gravação e o problema está nos acessos à memória. O coletor
possui 3 memórias: a RAM, um pen driver e um cartão SD.
Quando se trabalha na RAM é super rápido.... tanto Leitura quanto gravação, mas o problema é se
ocorrer algum problema de energia da bateria perco todos os dados. Com isso voltamos a necessidade
de uma ARQUIVO TXT, pois o acesso a gravação fora da memória RAM é mais lento.
Continuando a idéia do Arquivo TXT:
Como eu tenho duas TELAS
a) Principal (Menu)
b) Leitura (onde se lê e grava os códigos de barras)
A idéia é:
1- Ler por exemplo 200 códigos gravando em TXT;
2- Fecho o arquivo TXT
3- Gravo no Banco
4- Fecho o Form Leitura, retornando para o Prrincipal
5- E em seguida retorno para o Form Leitura parando na posição de leitura de novo código.
6- Com isso tenho restituo os meus acessos ao banco, que estão como globais.
Dim TxT As New System.IO.StreamWriter(EnderecoBDDados & "Leituras.txt", False)
Dim BDDescrCod As New ClsBD
WithEvents BDTxt As New ClsBD
Problema:
Não estou conseguindo fechar o form e retornar para a posição leitura. Como faço?
Ou você tem outra idéia melhor???
Obrigado,
Ernany
Gostei + 0
27/06/2009
Luiz Maia
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)