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

Luis Marques

[Resolvido] Erro ao inserir dados em SQL

Recommended Posts

Luis Marques

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.


LM

Share this post


Link to post
Share on other sites
José Lopes

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

posta la o pedaçõ de codigo onde da erro


Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Share this post


Link to post
Share on other sites
Luis Marques

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


LM

Share this post


Link to post
Share on other sites
anolsi

' 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.


"Nós somos o que fazemos repetidamente, a excelência não é um feito, e sim, um hábito."
Não respondo a questões por PM que possam ser colocadas no fórum!

Share this post


Link to post
Share on other sites
José Lopes

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.


Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Share this post


Link to post
Share on other sites
Luis Marques

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

Obrigado


LM

Share this post


Link to post
Share on other sites
jpaulino

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

Obrigado

Podes mostrar como ficou ?

Share this post


Link to post
Share on other sites
Luis Marques
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


LM

Share this post


Link to post
Share on other sites
jpaulino

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!

Share this post


Link to post
Share on other sites
Luis Marques

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"


LM

Share this post


Link to post
Share on other sites
jpaulino

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

Share this post


Link to post
Share on other sites
Luis Marques

    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! ;)


LM

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.