• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Luis Marques

[Resolvido] Erro ao inserir dados em SQL

12 mensagens neste tópico

Está a darme uma erro que é o seguinte: failer to convert parameter value a string to a Int32

Alguem me sabe dizer possiveis causas para dar este erro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tas a tentar converter uma string para um int32........

posta la o pedaçõ de codigo onde da erro

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try

            Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\imovel.mdb;"

            Dim lm As String = "INSERT INTO `imovel` (`natureza`, `tipologia`, `negocio`, `concelho`, `preco`, `detalhes`, `imagem`, `imagem2`, `imagem3`, `imagem4`, `imagem5`, `nomeproprietario`, `telefone`, `morada`) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

            ' Inicia uma ligação à bse de dados
            Using connection As New OleDbConnection(connString)

                ' Define o comando e os parâmetros
                Dim command As New OleDbCommand(lm, connection)

                command.Parameters.Add("natureza", OleDbType.VarChar).Value = NaturezaComboBox.Text
                command.Parameters.Add("tipologia", OleDbType.VarChar).Value = TipologiaComboBox.Text
                command.Parameters.Add("negocio", OleDbType.VarChar).Value = NegocioComboBox.Text
                command.Parameters.Add("concelho", OleDbType.VarChar).Value = ConcelhoComboBox.Text
                command.Parameters.Add("preco", OleDbType.Integer).Value = PrecoTextBox.Text
                command.Parameters.Add("detalhes", OleDbType.VarChar).Value = DetalhesTextBox.Text
                command.Parameters.Add("imagem", OleDbType.VarChar).Value = ImagemTextBox.Text
                command.Parameters.Add("imagem2", OleDbType.VarChar).Value = Imagem2TextBox.Text
                command.Parameters.Add("imagem3", OleDbType.VarChar).Value = Imagem3TextBox.Text
                command.Parameters.Add("imagem4", OleDbType.VarChar).Value = Imagem4TextBox.Text
                command.Parameters.Add("imagem5", OleDbType.VarChar).Value = Imagem5TextBox.Text
                command.Parameters.Add("nomeproprietario", OleDbType.VarChar).Value = NomeproprietarioTextBox.Text
                command.Parameters.Add("telefone", OleDbType.Integer).Value = TelefoneTextBox.Text
                command.Parameters.Add("morada", OleDbType.VarChar).Value = MoradaTextBox.Text


                ' Abre a ligação e insere o registo
                connection.Open()
                Dim x As Integer = command.ExecuteNonQuery()
                If x <> 1 Then
                    Throw New ArgumentException("Não foi possível inserir o registo na base de dados!")
                End If


            End Using

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try
    End Sub

Quando vou adicionar os dados na tabela, se nao preencher os campos telefone e preco, dame este erro. ou seja basta nao preencher um destes 2 campos para dar o erro

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

' Define o comando e os parâmetros
Dim command As New OleDbCommand(lm, connection)

Antes disto, por exemplo fazes:

If PrecoTextBox.Text = "" Then PrecoTextBox.Text = "0"
If TelefoneTextBox.Text = "" Then TelefoneTextBox.Text = "0"

Por uma questão de coerência deverias fazer também:

command.Parameters.Add("preco", OleDbType.Integer).Value = CInt(PrecoTextBox.Text)

command.Parameters.Add("telefone", OleDbType.Integer).Value = CInt(TelefoneTextBox.Text)

Ou seja, fazer uma conversão explicita.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

se nao estou em erro... tu estas a setar um parâmetro da Bd que é numérico com um campo que esta vazio...

<b>command.Parameters.Add("telefone", OleDbType.Integer).Value = TelefoneTextBox.Text</b>

Logo... qq coisa do tipo : int32 = ""

Dá erro na conversão...

Tens várias soluções.... uma delas sera´fazer um teste...

tipo

if not  TelefoneTextBox.Text = "" Then
command.Parameters.Add("telefone", OleDbType.Integer).Value = TelefoneTextBox.Text
End If

ou então criares uma função que retorne 0 (que assim sendo, será introduzido na BD)... como por exemplo o nz em access ou o nvl em oracle.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema já está resolvido, coloquei o codigo que me deste e ficou bom! ;)

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema já está resolvido, coloquei o codigo que me deste e ficou bom! ;)

Obrigado

Podes mostrar como ficou ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try

            Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\imovel.mdb;"

            Dim lm As String = "INSERT INTO `imovel` (`natureza`, `tipologia`, `negocio`, `concelho`, `preco`, `detalhes`, `imagem`, `imagem2`, `imagem3`, `imagem4`, `imagem5`, `nomeproprietario`, `telefone`, `morada`) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

            ' Inicia uma ligação à bse de dados
            Using connection As New OleDbConnection(connString)
                If PrecoTextBox.Text = "" Then PrecoTextBox.Text = "0"
                If TelefoneTextBox.Text = "" Then TelefoneTextBox.Text = "0"
                ' Define o comando e os parâmetros
                Dim command As New OleDbCommand(lm, connection)

                'pergunta se quer guardar ou nao
                Dim msg = MsgBox("Pretende guardar o registo? ", MsgBoxStyle.YesNoCancel)
                If msg = MsgBoxResult.Yes Then

                    command.Parameters.Add("natureza", OleDbType.VarChar).Value = NaturezaComboBox.Text
                    command.Parameters.Add("tipologia", OleDbType.VarChar).Value = TipologiaComboBox.Text
                    command.Parameters.Add("negocio", OleDbType.VarChar).Value = NegocioComboBox.Text
                    command.Parameters.Add("concelho", OleDbType.VarChar).Value = ConcelhoComboBox.Text
                    command.Parameters.Add("preco", OleDbType.Integer).Value = CInt(PrecoTextBox.Text)
                    command.Parameters.Add("detalhes", OleDbType.VarChar).Value = DetalhesTextBox.Text
                    command.Parameters.Add("imagem", OleDbType.VarChar).Value = ImagemTextBox.Text
                    command.Parameters.Add("imagem2", OleDbType.VarChar).Value = Imagem2TextBox.Text
                    command.Parameters.Add("imagem3", OleDbType.VarChar).Value = Imagem3TextBox.Text
                    command.Parameters.Add("imagem4", OleDbType.VarChar).Value = Imagem4TextBox.Text
                    command.Parameters.Add("imagem5", OleDbType.VarChar).Value = Imagem5TextBox.Text
                    command.Parameters.Add("nomeproprietario", OleDbType.VarChar).Value = NomeproprietarioTextBox.Text
                    command.Parameters.Add("telefone", OleDbType.Integer).Value = CInt(TelefoneTextBox.Text)
                    command.Parameters.Add("morada", OleDbType.VarChar).Value = MoradaTextBox.Text

                ElseIf msg = MsgBoxResult.No Then
                End If

                If msg = MsgBoxResult.Cancel Then
                    Form1.Show()
                    Me.Close()

                End If

                ' Abre a ligação e insere o registo
                connection.Open()
                Dim x As Integer = command.ExecuteNonQuery()
                If x <> 1 Then
                    Throw New ArgumentException("Não foi possível inserir o registo na base de dados!")

                End If

            End Using

        Catch ex As Exception
            'MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem me parecia ...  mas colocar um zero não é solução (pelo menos agradável).

Acrescentando um pouco ao que já foi dito pelo José Lopes e pelo anolsi (e bem), deves verifica se o campo está vazio e não inserir zero mas sim inserir um valor nulo.

Experimenta assim:

        If TelefoneTextBox.Text.Trim <> String.Empty Then
            Command.Parameters.Add("telefone", OleDbType.Integer).Value = TelefoneTextBox.Text
        Else
            Command.Parameters.Add("telefone", OleDbType.Integer).Value = DBNull.Value
        End If

Depois repete para o outro campo numérico e remove a comparação para colocar zeros.

PS: Quando inserires código escolhe o GeShi para ficar melhor formatado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas não vou colocar este codigo no sitio deste aqui pois nao:

If PrecoTextBox.Text = "" Then PrecoTextBox.Text = "0"
               If TelefoneTextBox.Text = "" Then TelefoneTextBox.Text = "0"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas não vou colocar este codigo no sitio deste aqui pois nao:

Não! Apagas esse e colocas junto aos outros parâmetros a seguir a este:

command.Parameters.Add("nomeproprietario", OleDbType.VarChar).Value = NomeproprietarioTextBox.Text

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try

            Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\imovel.mdb;"

            Dim lm As String = "INSERT INTO `imovel` (`natureza`, `tipologia`, `negocio`, `concelho`, `preco`, `detalhes`, `imagem`, `imagem2`, `imagem3`, `imagem4`, `imagem5`, `nomeproprietario`, `telefone`, `morada`) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

            ' Inicia uma ligação à bse de dados
            Using connection As New OleDbConnection(connString)

                ' Define o comando e os parâmetros
                Dim command As New OleDbCommand(lm, connection)

                'pergunta se quer guardar ou nao
                Dim msg = MsgBox("Pretende guardar o registo? ", MsgBoxStyle.YesNoCancel)
                If msg = MsgBoxResult.Yes Then

                    command.Parameters.Add("natureza", OleDbType.VarChar).Value = NaturezaComboBox.Text
                    command.Parameters.Add("tipologia", OleDbType.VarChar).Value = TipologiaComboBox.Text
                    command.Parameters.Add("negocio", OleDbType.VarChar).Value = NegocioComboBox.Text
                    command.Parameters.Add("concelho", OleDbType.VarChar).Value = ConcelhoComboBox.Text

                    If PrecoTextBox.Text.Trim <> String.Empty Then
                        command.Parameters.Add("preco", OleDbType.Integer).Value = PrecoTextBox.Text
                    Else
                        command.Parameters.Add("preco", OleDbType.Integer).Value = DBNull.Value
                    End If

                    command.Parameters.Add("detalhes", OleDbType.VarChar).Value = DetalhesTextBox.Text
                    command.Parameters.Add("imagem", OleDbType.VarChar).Value = ImagemTextBox.Text
                    command.Parameters.Add("imagem2", OleDbType.VarChar).Value = Imagem2TextBox.Text
                    command.Parameters.Add("imagem3", OleDbType.VarChar).Value = Imagem3TextBox.Text
                    command.Parameters.Add("imagem4", OleDbType.VarChar).Value = Imagem4TextBox.Text
                    command.Parameters.Add("imagem5", OleDbType.VarChar).Value = Imagem5TextBox.Text
                    command.Parameters.Add("nomeproprietario", OleDbType.VarChar).Value = NomeproprietarioTextBox.Text

                    If TelefoneTextBox.Text.Trim <> String.Empty Then
                        command.Parameters.Add("telefone", OleDbType.Integer).Value = TelefoneTextBox.Text
                    Else
                        command.Parameters.Add("telefone", OleDbType.Integer).Value = DBNull.Value
                    End If

                    command.Parameters.Add("morada", OleDbType.VarChar).Value = MoradaTextBox.Text


                ElseIf msg = MsgBoxResult.No Then
                End If

                If msg = MsgBoxResult.Cancel Then
                    Form1.Show()
                    Me.Close()

                End If

                ' Abre a ligação e insere o registo
                connection.Open()
                Dim x As Integer = command.ExecuteNonQuery()
                If x <> 1 Then
                    Throw New ArgumentException("Não foi possível inserir o registo na base de dados!")

                End If

            End Using

        Catch ex As Exception
            'MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try
    End Sub

Já esta! ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora