LER TEXT BOX E ESCREVER NO SQL
O texto inserido na textbox será sempre assim
2012/07/25 15:13 System Area Access granted on door User Code 4
2012/07/25 15:13 System Area Access granted on door Door 2
Separando por numero de caracteres, contando os espaços entre palavras seria:
[Ô]2012/07/25[Ô] 10 Caracteres [Ô]15:13[Ô] 5 Caracteres [Ô]System Area[Ô] 11 Caracteres [Ô]Access granted on door[Ô] 22 caracteres [Ô]User Code 4[Ô] 11 a 12 Caracteres
[Ô]2012/07/25[Ô] 10 Caracteres [Ô]15:13[Ô] 5 Caracteres [Ô]System Area[Ô] 11 Caracteres [Ô]Access granted on door[Ô] 22 caracteres [Ô]Door 2[Ô] 06 a 07 Caracteres
2012/07/25 15:13 System Area Access granted on door User Code 4
2012/07/25 15:13 System Area Access granted on door Door 2
Separando por numero de caracteres, contando os espaços entre palavras seria:
[Ô]2012/07/25[Ô] 10 Caracteres [Ô]15:13[Ô] 5 Caracteres [Ô]System Area[Ô] 11 Caracteres [Ô]Access granted on door[Ô] 22 caracteres [Ô]User Code 4[Ô] 11 a 12 Caracteres
[Ô]2012/07/25[Ô] 10 Caracteres [Ô]15:13[Ô] 5 Caracteres [Ô]System Area[Ô] 11 Caracteres [Ô]Access granted on door[Ô] 22 caracteres [Ô]Door 2[Ô] 06 a 07 Caracteres
Não, esquece o split, o que você vai ter que fazer são variáveis que buscam os dados da string que retorna da placa. Essas variáveis vão buscar posições fixas:
variavel_da_placa = [Ô]2012/07/25 15:13 System Area Access granted on door User Code 4 [Ô]
Dim data As String = variavel_da_placa.Substring(1, 16)
Dim area As String = variavel_da_placa.Substring(18, 15)
Dim acesso As String = variavel_da_placa.Substring(32, 25)
....
Então, crie uma classe com uma propriedade para cada um desses dados e crie uma lista:
Dim lista As New List(Of Sua_classe)
Dim item As Sua_Classe
item.Data = data
item.Area = area
item.Acesso = acesso
...
lista.Add(item)
Depois crie um grid e coloque nele as colunas que quer que apareça. Cada coluna, vai ter uma propriedade chamada DataItem(DataMember ou coisa assim, não lembro de cabeça), essa é a propriedade que indica que propriedade da classe em lista que você vai passar como datasource:
SeuGrid.Datasource = lista
E pronto...
variavel_da_placa = [Ô]2012/07/25 15:13 System Area Access granted on door User Code 4 [Ô]
Dim data As String = variavel_da_placa.Substring(1, 16)
Dim area As String = variavel_da_placa.Substring(18, 15)
Dim acesso As String = variavel_da_placa.Substring(32, 25)
....
Então, crie uma classe com uma propriedade para cada um desses dados e crie uma lista:
Dim lista As New List(Of Sua_classe)
Dim item As Sua_Classe
item.Data = data
item.Area = area
item.Acesso = acesso
...
lista.Add(item)
Depois crie um grid e coloque nele as colunas que quer que apareça. Cada coluna, vai ter uma propriedade chamada DataItem(DataMember ou coisa assim, não lembro de cabeça), essa é a propriedade que indica que propriedade da classe em lista que você vai passar como datasource:
SeuGrid.Datasource = lista
E pronto...
Tenho que criar variáveis para todos os possÃveis usuários e possÃveis portas?
Exemplo, se eu tiver 20 usuários, terei que fazer todas as variáveis para as colunas multiplicado por 20?
Eu não poderia fazer essas substrings assim:
Dim data As String = rtbReceived.Text.Substring(1, 11)
Dim data As String = rtbReceived.Text.Substring(12, 16)
Exemplo, se eu tiver 20 usuários, terei que fazer todas as variáveis para as colunas multiplicado por 20?
Eu não poderia fazer essas substrings assim:
Dim data As String = rtbReceived.Text.Substring(1, 11)
Dim data As String = rtbReceived.Text.Substring(12, 16)
Cara acho que vai dar certo, usei este código para fazer uns testes, e consegui o resultado do print que eu lhe envio em anexo.
Dim data As String = rtbReceived.Text.Substring(0, 10)
Dim hora As String = rtbReceived.Text.Substring(11, 6)
Dim area As String = rtbReceived.Text.Substring(18, 12)
Dim lista As New List(Of ListBox)
Dim item As ListBox
lstResultado.Items.Add(data)
lstResultado.Items.Add(hora)
lstResultado.Items.Add(area)
Dim data As String = rtbReceived.Text.Substring(0, 10)
Dim hora As String = rtbReceived.Text.Substring(11, 6)
Dim area As String = rtbReceived.Text.Substring(18, 12)
Dim lista As New List(Of ListBox)
Dim item As ListBox
lstResultado.Items.Add(data)
lstResultado.Items.Add(hora)
lstResultado.Items.Add(area)
Cara, o código que postei acima funcionou perfeitamente, consegui separar todos os dados em uma LISTBOX. No entanto, como nunca trabalhei com GRIDVIEW pelejei mas não consegui tirar os dados do TEXTBOX e inserir no GRID. Poderia me dar uma mão?
Dim data As String = rtbReceived.Text.Substring(0, 10)
Dim hora As String = rtbReceived.Text.Substring(11, 6)
Dim acesso As String = rtbReceived.Text.Substring(33, 22)
Dim usuario As String = rtbReceived.Text.Substring(58, 10)
Dim porta As String = rtbReceived.Text.Substring(133, 10)
Dim lista As New List(Of DataGridView)
Dim item As DataGridView
tabela.DataMember = (data)
tabela.DataMember = (hora)
tabela.DataMember = (acesso)
tabela.DataMember = (usuario)
tabela.DataMember = (porta)
Dim data As String = rtbReceived.Text.Substring(0, 10)
Dim hora As String = rtbReceived.Text.Substring(11, 6)
Dim acesso As String = rtbReceived.Text.Substring(33, 22)
Dim usuario As String = rtbReceived.Text.Substring(58, 10)
Dim porta As String = rtbReceived.Text.Substring(133, 10)
Dim lista As New List(Of DataGridView)
Dim item As DataGridView
tabela.DataMember = (data)
tabela.DataMember = (hora)
tabela.DataMember = (acesso)
tabela.DataMember = (usuario)
tabela.DataMember = (porta)
Um grid, é uma maneira de exibir uma coleção de dados. Logo, o que ele [Ô]enxerga[Ô], são coleções de dados, como a classe que te falei. Então, você vai fazer algo como o seguinte:
- Crie uma classe, clicando com o botão direito no Ãtem do projeto na janela [Ô]Solution explorer[Ô].
O código dela fica algo como:
Public Class ControleAcesso
Private _data As DateTime
Private _acesso As String
Private _usuario As String
Property Data() As DateTime
Get
Return _data
End Get
Set(ByVal Value As DateTime)
_data = Value
End Set
End Property
Property Acesso() As String
Get
Return _acesso
End Get
Set(ByVal Value As String)
_acesso = Value
End Set
End Property
Property Usuario() As String
Get
Return _usuario
End Get
Set(ByVal Value As String)
_usuario = Value
End Set
End Property
.........as outras propriedades do mesmo jeito
End Class
Então no seu código:
Dim data As String = rtbReceived.Text.Substring(0, 10)
Dim hora As String = rtbReceived.Text.Substring(11, 6)
Dim acesso As String = rtbReceived.Text.Substring(33, 22)
Dim usuario As String = rtbReceived.Text.Substring(58, 10)
Dim porta As String = rtbReceived.Text.Substring(133, 10)
Dim lista As List(Of ControleAcesso) = New List(Of ControleAcesso)
Dim item As ControleAcesso = New ControleAcesso
item.Data = Convert.ToDateTime(data)
item.Acesso = acesso
item.Usuario = usuario
lista.Add(item)
dgvDataGrid.DataSource = lista [ô]Onde dgvDataGrid é o nome do seu objeto grid
- Crie uma classe, clicando com o botão direito no Ãtem do projeto na janela [Ô]Solution explorer[Ô].
O código dela fica algo como:
Public Class ControleAcesso
Private _data As DateTime
Private _acesso As String
Private _usuario As String
Property Data() As DateTime
Get
Return _data
End Get
Set(ByVal Value As DateTime)
_data = Value
End Set
End Property
Property Acesso() As String
Get
Return _acesso
End Get
Set(ByVal Value As String)
_acesso = Value
End Set
End Property
Property Usuario() As String
Get
Return _usuario
End Get
Set(ByVal Value As String)
_usuario = Value
End Set
End Property
.........as outras propriedades do mesmo jeito
End Class
Então no seu código:
Dim data As String = rtbReceived.Text.Substring(0, 10)
Dim hora As String = rtbReceived.Text.Substring(11, 6)
Dim acesso As String = rtbReceived.Text.Substring(33, 22)
Dim usuario As String = rtbReceived.Text.Substring(58, 10)
Dim porta As String = rtbReceived.Text.Substring(133, 10)
Dim lista As List(Of ControleAcesso) = New List(Of ControleAcesso)
Dim item As ControleAcesso = New ControleAcesso
item.Data = Convert.ToDateTime(data)
item.Acesso = acesso
item.Usuario = usuario
lista.Add(item)
dgvDataGrid.DataSource = lista [ô]Onde dgvDataGrid é o nome do seu objeto grid
Valeu, fiz aqui e era exatamente o que eu precisava!!! Desculpe pela minha ignorancia, mas agora, é facil eu pegar os dados que estão apresentados no datagrid e inseri-los em uma tabela do bando de dados MSSQL? A tabela tem exatamente as mesmas colunas.
Um forte abraço.
Um forte abraço.
Um objeto List<T> pode ser percorrido com um simples For...Each:
Dim cn As SqlConnection = New SqlConnection([Ô]Sua connectionstring[Ô])
For Each item In lista
Dim cmd As New SqlCommand = New SqlCommand([Ô]Insert into tabela (campo1, campo2) Values (@campo1, @campo2)[Ô], cn)
cmd.Parameters.AddWithValue([Ô]@campo1[Ô], item.Data)
cmd.Parameters.AddWithValue([Ô]@campo2[Ô], item.Acesso)
cmd.ExecuteNonQuery()
Next item
[ô]Nota, fiz todo o código de cabeça portanto pode ter erro de sintaxe
A idéia é essa...
Dim cn As SqlConnection = New SqlConnection([Ô]Sua connectionstring[Ô])
For Each item In lista
Dim cmd As New SqlCommand = New SqlCommand([Ô]Insert into tabela (campo1, campo2) Values (@campo1, @campo2)[Ô], cn)
cmd.Parameters.AddWithValue([Ô]@campo1[Ô], item.Data)
cmd.Parameters.AddWithValue([Ô]@campo2[Ô], item.Acesso)
cmd.ExecuteNonQuery()
Next item
[ô]Nota, fiz todo o código de cabeça portanto pode ter erro de sintaxe
A idéia é essa...
Kerplunk, cara muito obrigado mesmo pelo apoio, consegui fazer toda a parte de conexão e os dados estão sendo inseridos na base de dados conforme necessário. No entanto, me deparei com o seguinte problema...
Coloquei o código abaixo no TEXTCHANGE, assim toda vez que um usuário apresenta seu cartão à leitora, a conexão é realizada, os dados são copiados para a GRID e da GRID inseridos no banco de dados, e logo após é limpada a RICHTEXTBOX para esperar o proximo código. Funciona perfeitamente caso eu de um intervalo entre uma leitura e outra, não sei porque raios, se eu passar 2 cartões muito rápido a informação que vem da plaquina está entrando no RICHTEXTBOX saltando uma linha ou deixando vazia uma linha entre uma instrução e outra, e como eu separo as informações a partir da posição do caracter isso ta me dando problema.
Existe alguma função que eu consigo eliminar linhas vazias? Olhe no anexo como está vindo o segundo código da placa... Tenho dois palpites para a solução, ou eu encontro outra forma para copiar os dados das 2 linhas recebidas para transforma-las em colunas ou trato as linhas em branco. Desde já agradeço.
Private Sub rtbReceived_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rtbReceived.TextChanged
Dim data As String = rtbReceived.Text.Substring(0, 10)
Dim hora As String = rtbReceived.Text.Substring(11, 6)
Dim acesso As String = rtbReceived.Text.Substring(33, 22)
Dim usuario As String = rtbReceived.Text.Substring(58, 12)
Dim porta As String = rtbReceived.Text.Substring(133, 12)
Dim lista As List(Of Ponto) = New List(Of Ponto)
Dim item As Ponto = New Ponto
item.Data = Convert.ToDateTime(data)
item.Hora = hora
item.Acesso = acesso
item.Usuario = usuario
item.Porta = porta
lista.Add(item)
tabela.DataSource = lista [ô]Onde dgvDataGrid é o nome do seu objeto grid
[ô]DECLARANDO STRING PARA INSERIR OS DADOS
Dim SQL As String = [Ô]INSERT INTO _Ponto_GSN([data], [hora], [acesso], [usuario], [porta]) VALUES (@data, @hora, @acesso, @usuario, @porta);[Ô]
[ô]CRIA CONEXÃO COM A BASE DE DADOS
Dim Conn As New SqlConnection([Ô]Server = 187.115.65.188; Database = GSNDATA; integrated security = true[Ô])
Try
Conn.Open()
Catch ex As Exception
MessageBox.Show(ex.Message, [Ô]Falha na conexão SQL[Ô])
End Try
If Conn.State = 1 Then
Me.Text = [Ô]Sistema Conectado ao DB GSNDATA[Ô]
Me.BackColor = Color.CadetBlue()
End If
For Each item In lista
Dim cmd As New SqlCommand(SQL, Conn)
cmd.Parameters.AddWithValue([Ô]@data[Ô], item.Data)
cmd.Parameters.AddWithValue([Ô]@hora[Ô], item.Hora)
cmd.Parameters.AddWithValue([Ô]@acesso[Ô], item.Acesso)
cmd.Parameters.AddWithValue([Ô]@usuario[Ô], item.Usuario)
cmd.Parameters.AddWithValue([Ô]@porta[Ô], item.Porta)
cmd.ExecuteNonQuery()
Next item
Call Me.Limpar(Me)
End Sub
Coloquei o código abaixo no TEXTCHANGE, assim toda vez que um usuário apresenta seu cartão à leitora, a conexão é realizada, os dados são copiados para a GRID e da GRID inseridos no banco de dados, e logo após é limpada a RICHTEXTBOX para esperar o proximo código. Funciona perfeitamente caso eu de um intervalo entre uma leitura e outra, não sei porque raios, se eu passar 2 cartões muito rápido a informação que vem da plaquina está entrando no RICHTEXTBOX saltando uma linha ou deixando vazia uma linha entre uma instrução e outra, e como eu separo as informações a partir da posição do caracter isso ta me dando problema.
Existe alguma função que eu consigo eliminar linhas vazias? Olhe no anexo como está vindo o segundo código da placa... Tenho dois palpites para a solução, ou eu encontro outra forma para copiar os dados das 2 linhas recebidas para transforma-las em colunas ou trato as linhas em branco. Desde já agradeço.
Private Sub rtbReceived_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rtbReceived.TextChanged
Dim data As String = rtbReceived.Text.Substring(0, 10)
Dim hora As String = rtbReceived.Text.Substring(11, 6)
Dim acesso As String = rtbReceived.Text.Substring(33, 22)
Dim usuario As String = rtbReceived.Text.Substring(58, 12)
Dim porta As String = rtbReceived.Text.Substring(133, 12)
Dim lista As List(Of Ponto) = New List(Of Ponto)
Dim item As Ponto = New Ponto
item.Data = Convert.ToDateTime(data)
item.Hora = hora
item.Acesso = acesso
item.Usuario = usuario
item.Porta = porta
lista.Add(item)
tabela.DataSource = lista [ô]Onde dgvDataGrid é o nome do seu objeto grid
[ô]DECLARANDO STRING PARA INSERIR OS DADOS
Dim SQL As String = [Ô]INSERT INTO _Ponto_GSN([data], [hora], [acesso], [usuario], [porta]) VALUES (@data, @hora, @acesso, @usuario, @porta);[Ô]
[ô]CRIA CONEXÃO COM A BASE DE DADOS
Dim Conn As New SqlConnection([Ô]Server = 187.115.65.188; Database = GSNDATA; integrated security = true[Ô])
Try
Conn.Open()
Catch ex As Exception
MessageBox.Show(ex.Message, [Ô]Falha na conexão SQL[Ô])
End Try
If Conn.State = 1 Then
Me.Text = [Ô]Sistema Conectado ao DB GSNDATA[Ô]
Me.BackColor = Color.CadetBlue()
End If
For Each item In lista
Dim cmd As New SqlCommand(SQL, Conn)
cmd.Parameters.AddWithValue([Ô]@data[Ô], item.Data)
cmd.Parameters.AddWithValue([Ô]@hora[Ô], item.Hora)
cmd.Parameters.AddWithValue([Ô]@acesso[Ô], item.Acesso)
cmd.Parameters.AddWithValue([Ô]@usuario[Ô], item.Usuario)
cmd.Parameters.AddWithValue([Ô]@porta[Ô], item.Porta)
cmd.ExecuteNonQuery()
Next item
Call Me.Limpar(Me)
End Sub
Como está sendo feito o preenchimento do richtextbox? Mostre a rotina que recebe os dados da placa...
Tópico encerrado , respostas não são mais permitidas