none
Inserir dados em banco de dados Access no VB RRS feed

  • 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
    terça-feira, 27 de maio de 2014 12:11

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 View Diego Murakami's LinkedIn profile - MCP, MS
    * Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.

    terça-feira, 27 de maio de 2014 18:59
  • 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 View Diego Murakami's LinkedIn profile - MCP, MS
    * Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.

    terça-feira, 27 de maio de 2014 12:49
  • 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 View Diego Murakami's LinkedIn profile - MCP, MS
    * Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.

    terça-feira, 27 de maio de 2014 13:48
  • 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 View Diego Murakami's LinkedIn profile - MCP, MS
    * Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.

    terça-feira, 27 de maio de 2014 18:35

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 View Diego Murakami's LinkedIn profile - MCP, MS
    * Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.

    terça-feira, 27 de maio de 2014 12:49
  • opa obrigado,

    Diego

    não consegui entender Public Class Produto, pra que seria?  

    estou perguntando porque se futuramente eu  colocar algum campo novo, gostaria de entender o código 

    • Editado Lucas NDS terça-feira, 27 de maio de 2014 13:11
    terça-feira, 27 de maio de 2014 13:07
  • Não consegui colocar no meu código : ( 

    como te disse, no  Designer tenho 5 textbox , neles eu coloco os valores a serem incluídos 

    terça-feira, 27 de maio de 2014 13:21
  • 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 View Diego Murakami's LinkedIn profile - MCP, MS
    * Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.

    terça-feira, 27 de maio de 2014 13:48
  • 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? 

    terça-feira, 27 de maio de 2014 14:26
  • 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 View Diego Murakami's LinkedIn profile - MCP, MS
    * Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.

    terça-feira, 27 de maio de 2014 18:35
  • acho que o maximo q o access aceita e10 mesmo :(

    sera q vou ter q mudar de banco ? 

    terça-feira, 27 de maio de 2014 18:54
  • 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 View Diego Murakami's LinkedIn profile - MCP, MS
    * Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.

    terça-feira, 27 de maio de 2014 18:59