Usuário com melhor resposta
Inserir dados em banco de dados Access no VB

Pergunta
-
bom dia,
Estou criando um cadastro de produtos e estou com um dificuldade em inserir dados no banco
recebo a conexão através de um modulo
Public Function getConnection() As OleDbConnection Dim sql As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Lucas\Documents\Visual Studio 2010\Projects\Controle de estoque\dados.accdb" Return New OleDbConnection(sql) End Function End Module
em um outro Form tenho o seguinte Código:
Private Sub grava() Using con As OleDbConnection = getConnection() Dim cmd As New OleDbCommand End Sub
tenho um botão pra chamar esse codigo " GRAVA "
Private Sub btngravar_Click(sender As System.Object, e As System.EventArgs) Handles btngravar.Click grava() End Sub
tenho 5 textbox
exemplo:
textbox1 textbox2 textbox3 textbox4 textbox5
no meu banco tenho uma tabela chamada "produtos"
nela tenho os seguintes campos codigo_do_produto, referencia, descricao, estoqueatual, valorproduto
porem não sei como incluir os dados no banco :(
alguem poderia me ajudar?
se precisar de mais informação so falar
- Editado Lucas NDS terça-feira, 27 de maio de 2014 12:18
Respostas
-
Ou você muda de banco de dados ou muda o tipo do campo.
Fica a seu critério mudar ou não.
Se for uma aplicação que você está desenvolvendo para aprendizado, vale somente mudar o tipo do campo.
Mas se for uma aplicação que você vai fazer para outras pessoas (comercial), vale mudar de banco de dados.
Abraços !
Diego Murakami
- MCP, MS
* Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 19:39
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 11:39
-
Lucas, bom dia.
1. Sugestão: Sempre dê uma olhada na documentação do MSDN. É muito boa ! ;)
2. Vou postar aqui um exemplo de código e um pro seu código:
SELECT:
Public Sub ReadMyData(ByVal connectionString As String) Dim queryString As String = "SELECT OrderID, CustomerID FROM Orders" Using connection As New OleDbConnection(connectionString) Dim command As New OleDbCommand(queryString, connection) connection.Open() Dim reader As OleDbDataReader = command.ExecuteReader() While reader.Read() Console.WriteLine(reader.GetInt32(0).ToString() + ", " _ + reader.GetString(1)) End While ' always call Close when done reading. reader.Close() End Using End Sub
Agora um exemplo baseado nos seus dados:
Classe Produto (afinal isso aqui é OOP):
Public Class Produto Private _codProduto As Integer Public Property CodProduto() As Integer Get Return _codProduto End Get Set(ByVal value As Integer) _codProduto = value End Set End Property Private _referencia As String Public Property Referencia() As String Get Return _referencia End Get Set(ByVal value As String) _referencia = value End Set End Property Private _descricao As String Public Property Descricao() As String Get Return _descricao End Get Set(ByVal value As String) _descricao = value End Set End Property Private _estoqueAtual As Integer Public Property EstoqueAtual() As Integer Get Return _estoqueAtual End Get Set(ByVal value As Integer) _estoqueAtual = value End Set End Property Private _valorProduto As Decimal Public Property ValorProduto() As Decimal Get Return _valorProduto End Get Set(ByVal value As Decimal) _valorProduto = value End Set End Property End Class
Agora o método grava:
Public Function grava(ByVal produto As Produto) As Integer ' Query com os parametros passados Dim queryString As String = "INSERT INTO produtos (codigo_do_produto, referencia, descricao, estoqueatual, valorproduto) VALUES " & _ "(@codProduto, @referencia, @descricao, @estoqueAtual, @valorProduto)" Dim connection As OleDbConnection = getConnection() Try Dim command As New OleDbCommand(queryString, connection) ' Adiciona os parametros command.Parameters.AddWithValue("@codProduto", produto.CodProduto) command.Parameters.AddWithValue("@referencia", produto.Referencia) command.Parameters.AddWithValue("@descricao", produto.Descricao) command.Parameters.AddWithValue("@estoqueAtual", produto.EstoqueAtual) command.Parameters.AddWithValue("@valorProduto", produto.ValorProduto) 'Abre conexao connection.Open() 'Executa comando retornando os registros afetados Return command.ExecuteNonQuery() Catch ex As Exception 'Trata sua exception aqui com MessageBox ou algo do tipo ;) Finally connection.Close() End Try End Function
Veja se funciona, continue seus estudos e poste aqui seus resultados.
Abraços !
Diego Murakami
- MCP, MS
* Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 19:38
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 11:39
-
Ok Lucas, sua dúvida então é por conta do transporte do form para o banco...então dá uma olhada na modificação do método do botão:
Private Sub btngravar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btngravar.Click Try 'Pra isso que serve a classe Produto, veja abaixo Dim produto As New Produto() ' Aqui você transporta os dados do formulario pro objeto produto produto.CodProduto = Integer.Parse(IIf(String.IsNullOrEmpty(txtCodProduto.Text), 0, txtCodProduto.Text)) produto.Referencia = txtReferencia.Text produto.Descricao = txtDescricao.Text produto.EstoqueAtual = Integer.Parse(IIf(String.IsNullOrEmpty(txtEstoqueAtual.Text), 0, txtEstoqueAtual.Text)) produto.ValorProduto = Decimal.Parse(IIf(String.IsNullOrEmpty(txtValorProduto.Text), 0, txtValorProduto.Text)) grava(produto) Catch ex As Exception 'Trata sua exception aqui com MessageBox ou algo do tipo ;) End Try End Sub
Testa e posta aqui seus resultados ;)
Abraços !
Diego Murakami
- MCP, MS
* Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 19:38
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 11:39
-
Ah sim...
Esse erro acontece porque você está tentando gravar um numero inteiro no banco e o máximo que um número inteiro suporta é de 10 dígitos.
Você precisa alterar o tipo do campo ou verificar se existe um numero maior que 10 digitos.
Não sou especialista em access mas acho que você vai ter que mudar o tipo do campo na tabela para suportar tal tamanho (13 digitos).
Teste e poste os resultados.
Abraços !
Diego Murakami
- MCP, MS
* Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 19:39
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 11:39
Todas as Respostas
-
Lucas, bom dia.
1. Sugestão: Sempre dê uma olhada na documentação do MSDN. É muito boa ! ;)
2. Vou postar aqui um exemplo de código e um pro seu código:
SELECT:
Public Sub ReadMyData(ByVal connectionString As String) Dim queryString As String = "SELECT OrderID, CustomerID FROM Orders" Using connection As New OleDbConnection(connectionString) Dim command As New OleDbCommand(queryString, connection) connection.Open() Dim reader As OleDbDataReader = command.ExecuteReader() While reader.Read() Console.WriteLine(reader.GetInt32(0).ToString() + ", " _ + reader.GetString(1)) End While ' always call Close when done reading. reader.Close() End Using End Sub
Agora um exemplo baseado nos seus dados:
Classe Produto (afinal isso aqui é OOP):
Public Class Produto Private _codProduto As Integer Public Property CodProduto() As Integer Get Return _codProduto End Get Set(ByVal value As Integer) _codProduto = value End Set End Property Private _referencia As String Public Property Referencia() As String Get Return _referencia End Get Set(ByVal value As String) _referencia = value End Set End Property Private _descricao As String Public Property Descricao() As String Get Return _descricao End Get Set(ByVal value As String) _descricao = value End Set End Property Private _estoqueAtual As Integer Public Property EstoqueAtual() As Integer Get Return _estoqueAtual End Get Set(ByVal value As Integer) _estoqueAtual = value End Set End Property Private _valorProduto As Decimal Public Property ValorProduto() As Decimal Get Return _valorProduto End Get Set(ByVal value As Decimal) _valorProduto = value End Set End Property End Class
Agora o método grava:
Public Function grava(ByVal produto As Produto) As Integer ' Query com os parametros passados Dim queryString As String = "INSERT INTO produtos (codigo_do_produto, referencia, descricao, estoqueatual, valorproduto) VALUES " & _ "(@codProduto, @referencia, @descricao, @estoqueAtual, @valorProduto)" Dim connection As OleDbConnection = getConnection() Try Dim command As New OleDbCommand(queryString, connection) ' Adiciona os parametros command.Parameters.AddWithValue("@codProduto", produto.CodProduto) command.Parameters.AddWithValue("@referencia", produto.Referencia) command.Parameters.AddWithValue("@descricao", produto.Descricao) command.Parameters.AddWithValue("@estoqueAtual", produto.EstoqueAtual) command.Parameters.AddWithValue("@valorProduto", produto.ValorProduto) 'Abre conexao connection.Open() 'Executa comando retornando os registros afetados Return command.ExecuteNonQuery() Catch ex As Exception 'Trata sua exception aqui com MessageBox ou algo do tipo ;) Finally connection.Close() End Try End Function
Veja se funciona, continue seus estudos e poste aqui seus resultados.
Abraços !
Diego Murakami
- MCP, MS
* Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 19:38
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 11:39
-
-
-
Ok Lucas, sua dúvida então é por conta do transporte do form para o banco...então dá uma olhada na modificação do método do botão:
Private Sub btngravar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btngravar.Click Try 'Pra isso que serve a classe Produto, veja abaixo Dim produto As New Produto() ' Aqui você transporta os dados do formulario pro objeto produto produto.CodProduto = Integer.Parse(IIf(String.IsNullOrEmpty(txtCodProduto.Text), 0, txtCodProduto.Text)) produto.Referencia = txtReferencia.Text produto.Descricao = txtDescricao.Text produto.EstoqueAtual = Integer.Parse(IIf(String.IsNullOrEmpty(txtEstoqueAtual.Text), 0, txtEstoqueAtual.Text)) produto.ValorProduto = Decimal.Parse(IIf(String.IsNullOrEmpty(txtValorProduto.Text), 0, txtValorProduto.Text)) grava(produto) Catch ex As Exception 'Trata sua exception aqui com MessageBox ou algo do tipo ;) End Try End Sub
Testa e posta aqui seus resultados ;)
Abraços !
Diego Murakami
- MCP, MS
* Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 19:38
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 11:39
-
Olha, consegui fazer assim
Imports System.Data Imports System.Data.OleDb Public Class formcadastroitens Private Sub formcadastroitens_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load End Sub Public Sub grava() 'Dim plu As Integer 'plu = TextBox0.Text Dim codigo As String codigo = txtcod.Text Dim referencia As String referencia = txtref.Text Dim descricao As String descricao = txtdesc.Text Dim estoqueAtual As Integer estoqueatual = txtsaldo.Text Dim valorProduto As Decimal valorProduto = txtvalor.Text ' Query com os parametros passados Dim queryString As String = "INSERT INTO produtos (codigo_do_produto, referencia, descricao, estoqueatual, valorproduto) VALUES " & _ "(@codProduto, @referencia, @descricao, @estoqueAtual, @valorProduto)" Dim connection As OleDbConnection = getConnection() Try Dim command As New OleDbCommand(queryString, connection) ' Adiciona os parametros 'command.Parameters.AddWithValue("@codigo", plu) command.Parameters.AddWithValue("@codProduto", codigo) command.Parameters.AddWithValue("@referencia", referencia) command.Parameters.AddWithValue("@descricao", descricao) command.Parameters.AddWithValue("@estoqueAtual", estoqueAtual) command.Parameters.AddWithValue("@valorProduto", valorProduto) 'Abre conexao connection.Open() 'Executa comando retornando os registros afetados command.ExecuteNonQuery() Catch ex As Exception MessageBox.Show(ex.Message, "Insert Records") Finally MessageBox.Show("Produto incluido") connection.Close() End Try End Sub Private Sub btngravar_Click(sender As System.Object, e As System.EventArgs) Handles btngravar.Click grava() End Sub Private Sub btnnovo_Click(sender As System.Object, e As System.EventArgs) Handles btnnovo.Click txtcod.Text = "" txtref.Text = "" txtdesc.Text = "" txtsaldo.Text = "" txtvalor.Text = "" End Sub End Class
mas estou com um problema,
a mensagem retornada é "sobrecarga"
não esta gravando no banco
lembrando que o
código terá 13 números (somente números)
a referencia te 24 carácter (letras e numeros)
a descrição terá ate 40 carácter (letras e numeros)
saldoatual tera ate 6 numeros
e o valor do produto 5 (exemplo 159,58)
poderia tirar mais essa duvida?
-
Ah sim...
Esse erro acontece porque você está tentando gravar um numero inteiro no banco e o máximo que um número inteiro suporta é de 10 dígitos.
Você precisa alterar o tipo do campo ou verificar se existe um numero maior que 10 digitos.
Não sou especialista em access mas acho que você vai ter que mudar o tipo do campo na tabela para suportar tal tamanho (13 digitos).
Teste e poste os resultados.
Abraços !
Diego Murakami
- MCP, MS
* Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 19:39
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 11:39
-
-
Ou você muda de banco de dados ou muda o tipo do campo.
Fica a seu critério mudar ou não.
Se for uma aplicação que você está desenvolvendo para aprendizado, vale somente mudar o tipo do campo.
Mas se for uma aplicação que você vai fazer para outras pessoas (comercial), vale mudar de banco de dados.
Abraços !
Diego Murakami
- MCP, MS
* Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 27 de maio de 2014 19:39
- Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 28 de maio de 2014 11:39