Arquivo TXT no VB2005 .NET + Coletor de Dados
Boa noite,
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
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
Curtidas 0
Respostas
Ernany
18/06/2009
Mensagem de ERRO:
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()
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
Ernany
18/06/2009
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
Fabio Mans
18/06/2009
Ernani você não pode passar por partes o seu chamado, você colocou várias coisas e ficou complicado te ajudar.
Passo somente o problema
Obrigado
Passo somente o problema
Obrigado
GOSTEI 0
Ernany
18/06/2009
Boa Noite,
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
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
Luiz Maia
18/06/2009
Ola Ernany, como vai?
Ocorreu uma troca de consultores e agora eu estou responsavel pelo seu chamado.
Pode me dizer qual o problema e o contexto de seu projeto?
Aguardo
Abraços
Att
Luiz Maia
GOSTEI 0
Ernany
18/06/2009
Bom dia Luiz,
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
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
Luiz Maia
18/06/2009
Ola Ernany,
Por que vc não tenta LIMPAR o arquivo txt ao invés de Deleta-lo e depois recria-lo?
Aguardo
Abraços
Att
Luiz Maia
GOSTEI 0
Ernany
18/06/2009
Boa Tarde Luiz,
Como faço para "limpar" um arquivo TXT?
Ernany
Como faço para "limpar" um arquivo TXT?
Ernany
GOSTEI 0
Luiz Maia
18/06/2009
Ola Ernany,
Tente tb:
Quando você constrói o objeto StreamWriter, coloque false no segundo parâmetro.
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
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
Ernany
18/06/2009
Boa tarde,
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
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
Luiz Maia
18/06/2009
Ernany,
Me explique o problema que esta tendo, e vamos achar uma outra solução.
Qual o contexto de sua aplicação?
Não entendi o porque do arquivo TXT. Não tem logica a inserção estar lenta.
Aguardo
Abraços
Att
Luiz Maia
GOSTEI 0
Luiz Maia
18/06/2009
Oi Ernany, blz?
Estou aguardando seu contato, ok?
Abraços
Att
Luiz Maia
GOSTEI 0
Ernany
18/06/2009
Bom dia Luiz,
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
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
Ernany
18/06/2009
Boa tarde Luiz,
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
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
Luiz Maia
18/06/2009
Ola Ernany,
Preciso enteder direito o que vc realmente esta precisando.
Vc quer transferir dados da base de um Pocket para outra base em desktops?
É isto?
Estou aguardando... Por que se for isto mesmo. Podemos usar varios outras formas de conexao, uma delas, a mais indicada, é, se os Palms Tiverem acesso a Web, podemos usar um web service, ai teremos como transacionar o processo e assim que o usuario clicar em um botao no Palm de sincronizar, o processo starta e uma transaçao tb, se caso de algum tipo de falha na conexao, vc da um RollBack na transacao, assim vc mantem seus dados totalmente concistentes. É isto que ocorre em transaçoes bancarias...
Att
Luiz Maia
GOSTEI 0
Ernany
18/06/2009
Boa tarde Luiz,
Explicando o funcionamento:
1- Eu tenho um coletor de dados portátil que lê códigos de barras
2- Leio os códigos e ele busca na sua base interna qual a descrição
3- Em seguida a leitura é gravada em outra tabela, no coletor.
4- Finalizando as leituras transfiro os dados para o PC via ActiveSync
5- Tenho no computador um programa que recebe e transmite os ítens da retaguarda
para o coletor.
Problema:
1- A memória do coletor é volátil. Se acaba energia apaga os dados. Para não perder os dados
preciso gravar os dados em uma memória não volátil.
2- Qdo acesso a base que é um SQLitena memória não volátil, o programa fica lento.
3- Se o programa + a Base SQLite ficam na memória volátil, o programa fica rápido;
4- Mas corro o risco de perder todos os dados.
5- Qual a solução que encontrei:
a cada 200 leituras, por exemplo, gravo os dados em um arquivo TXT, depois transfiro os dados para
a Base que fica numa memória não volátil.
Como está o programa HOJE:
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
Explicando o funcionamento:
1- Eu tenho um coletor de dados portátil que lê códigos de barras
2- Leio os códigos e ele busca na sua base interna qual a descrição
3- Em seguida a leitura é gravada em outra tabela, no coletor.
4- Finalizando as leituras transfiro os dados para o PC via ActiveSync
5- Tenho no computador um programa que recebe e transmite os ítens da retaguarda
para o coletor.
Problema:
1- A memória do coletor é volátil. Se acaba energia apaga os dados. Para não perder os dados
preciso gravar os dados em uma memória não volátil.
2- Qdo acesso a base que é um SQLitena memória não volátil, o programa fica lento.
3- Se o programa + a Base SQLite ficam na memória volátil, o programa fica rápido;
4- Mas corro o risco de perder todos os dados.
5- Qual a solução que encontrei:
a cada 200 leituras, por exemplo, gravo os dados em um arquivo TXT, depois transfiro os dados para
a Base que fica numa memória não volátil.
Como está o programa HOJE:
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
Luiz Maia
18/06/2009
Ola Ernany,
Não entendi a questão do Form. Para que vc precisa fecha-lo?
Por que vc nao faz uma rotina para ler o txt e a medida que for fazendo a sincronização, vc vai apagando os registros do txt. Desta forma, se ocorre a quebra da sincronização, quando vc voltar a ler o txt ele vai estar no mesmo lugar. Isto resolve? Aguardo
Att Luiz Maia
Por que vc nao faz uma rotina para ler o txt e a medida que for fazendo a sincronização, vc vai apagando os registros do txt. Desta forma, se ocorre a quebra da sincronização, quando vc voltar a ler o txt ele vai estar no mesmo lugar. Isto resolve? Aguardo
Att Luiz Maia
GOSTEI 0
Devmedia
18/06/2009
Ernany,
por falta de retorno estamos concluído o seu chamado. Caso ainda tenha dúvidas sobre o assunto aqi tratado, por favor, volte a postar aqui mesmo que o consultor voltará a lhe atender.
por falta de retorno estamos concluído o seu chamado. Caso ainda tenha dúvidas sobre o assunto aqi tratado, por favor, volte a postar aqui mesmo que o consultor voltará a lhe atender.
GOSTEI 0
Ernany
18/06/2009
Boa tarde Luiz,
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 FACO 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
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 FACO 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
Luiz Maia
18/06/2009
Ola Ernany,
Use o ShowModal ao inves de Show.
Abraços
Att
Luiz Maia
GOSTEI 0
Ernany
18/06/2009
Obrigado Luiz,
Eu já estava triste com os Consultores.....
Funcionou....valeu..... você ajudou a solucionar um problema que vinha a meses...
Era só uma palavrinha.... que valia por muitas.....
Obrigado,
Ernany
Eu já estava triste com os Consultores.....
Funcionou....valeu..... você ajudou a solucionar um problema que vinha a meses...
Era só uma palavrinha.... que valia por muitas.....
Obrigado,
Ernany
GOSTEI 0
Luiz Maia
18/06/2009
Ernany,
Precisando é so falar, estamos a sua disposição para eventuais dúvidas.
Abraços
Att
Luiz Maia
GOSTEI 0