ERRO em VB.net

Farmit

Power Member
Boas ,
eu tenho um erro na aplicação que nao consigo emendar :005::

-tenho um formulario de inserção de dados que seram enviados numa aplicação de access (*.mdb).

-O problema é que quando carrego no butão (btn_inserir) do formulario de inserção (frm_inserir) , aparece este errro :


An unhandled exception of type 'System.InvalidOperationException' occurred in system.data.dll

Additional information: The 'Microsoft.jet.4.0' provider is not registered on the local machine.

Eu ja pesquisei na net para ver qual é o tipo de erro que ocorre quando esta mensagem aparece , e o que aparece é isto:

You get this error when running your application:
Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
Solution

Install the Microsoft Jet Engine on your system. The Microsoft Jet engine is used by Iron Speed Designer to communicate with its internal Microsoft Access database. Review the following links to download the latest version of the Microsoft Jet 4.0 Database Engine.

Mas este nao parece ser o meu caso , porque eu ja tinha a ultima versão ....

Portanto preceso de ajuda para resolver este problema

OBG
 
Faz o Download do ultimo MDAC e tenta novamente , já agora se poderes mete o codigo para vermos melhor :)

Cumprimentos
 
A tal mensagem de erro que aparecia antes ja nao aparece outra vez , descubri que era apenas um erro de sintaxe no codigo do Provider.
Mas mesmo assim continuo a ter um erro , mas nao aparece nenhuma informação adicional :
An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in system.data.dll -> apenas isto

A class onde tenho o erro é esta :

Código:
Imports System.Data
Imports System.Data.OleDb
------------------------------------------------------------------------------------------------------
Public Class Bdaccess
    Private _Con As OleDbConnection
    Private _Erro As Boolean
    Private Const _Strcom = "Provider=Microsoft.jet.oledb.4.0;Data source="c:\BD_projecto\projecto.mdb"
    Private _StrSql As String
    Private _Cmd As OleDbCommand
------------------------------------------------------------------------------------------------------
    Public Sub New(ByVal mdb As String)
        Me._Con = New OleDbConnection(Bdaccess._Strcom + mdb)
        Me._Erro = False
    End Sub

-------------------------------------------------------------------------------------------------------
Public Sub abrir()
        Me._Erro = False
        Try
            Me._Con.Open()
        Catch ex As Exception
            Me._Erro = True
        End Try
    End Sub
------------------------------------------------------------------------------------------------------
    Public Sub Fechar()
        Me._Erro = False
        Try
            Me._Con.Close()
        Catch ex As Exception
            Me._Erro = True
        End Try
    End Sub
-------------------------------------------------------------------------------------------------------
    Public ReadOnly Property erro() As Boolean
        Get
            Return Me._Erro
        End Get
    End Property
--------------------------------------------------------------------------------------------------------
   Public Property StrSql() As String
        Get
            Return Me._StrSql
        End Get
        Set(ByVal value As String)
            Me._StrSql = value
        End Set
    End Property
-------------------------------------------------------------------------------------------------------
    Public Function Executar() As OleDbDataReader
        Me._Erro = False
        Try
            Me._Cmd = New OleDbCommand(Me._StrSql, Me._Con)
            Me._Cmd.CommandType = CommandType.Text
            If Me._Con.State = ConnectionState.Open Then
                Me._Con.Close()
            End If
            [COLOR=White][COLOR=YellowGreen][COLOR=Red]Me._con.Open()[/COLOR] [/COLOR][/COLOR]---------------> ERRO
        Me._cmd.ExecuteNonQuery()
        Me._con.Close()
            
       
    End Function[COLOR=White]


Nao faço a minima onde esta o erro
[/COLOR]
 
Última edição pelo moderador:
ok , eu acho que o prblema esta mesmo aqui

vejam se o esta query está certo:


Código:
If (tbx_nome.Text <> "") Then
            If (Me._expcodigopostal.EValido(tbx_postal.Text) Or tbx_postal.Text = "") Then
                Me._bd.strsql = "insert into contactos (bi,nome,apelido,tipo_relacao,tipo_contacto,sexo,idade,data_nascimento,morada,cod_postal,email,telemovel,contribuinte,observacoes) values(" + _
                tbx_bi.Text + "," + _
                "'" + tbx_nome.Text + "'" + "," + _
                "'" + tbx_apelido.Text + "'" + "," + _
                "'" + tbx_relacao.Text + "'" + "," + _
                "'" + tbx_contacto.Text + "'" + "," + _
                "'" + tbx_sexo.Text + "'" + "," + _
                tbx_idade.Text + "," + _
                "'#" + tbx_nascimento.Text + "#'" + "," + _
                "'" + tbx_morada.Text + "'" + "," + _
                "'" + tbx_postal.Text + "'" + "," + _
                "'" + tbx_email.Text + "'" + "," + _
                "'" + tbx_telemovel.Text + "'" + "," + _
                "'" + tbx_contribuinte.Text + "'" + "," + _
                "'" + tbx_observacao.Text + "'" + ")"

se alguma coisa estiver errado avisem -me sfv
 
Última edição pelo moderador:
Boas,

acho que a melhor forma é adicionar Parâmetros ao OLEDB_Command. Vais ver que não ficas com essa mistura toda de caixas de texto, "+" / "," / "&", etc.

Fazes assim:

[Comando OLEDB]

Dim _Com as New OLEDB_Command("INSERT INTO tab_xpto(xpto1,xpto2,xpto3) VALUES(@xpto1,@xpto2,@xpto3)",_Con)

[Parametros]
_Cmd.Parameters.Add(New OLEDB.Parameter("@xpto1",txt_xpto1.text))
_Cmd.Parameters.Add(New OLEDB.Parameter("@xpto2",txt_xpto2.text))
_Cmd.Parameters.Add(New OLEDB.Parameter("@xpto3",txt_xpto3.text))

[Enviar Comando + Parâmetros p/Base de Dados]

_Con.Open
_Com.ExecuteNonQuery
_Con.Close

Vê lá se te safas com esta ajuda. ;)

Cumps
 
E fazeres isto?

Código:
Try
_Con.Open
_Com.ExecuteNonQuery
_Con.Close
 
Catch ex As Exception
    MessageBox(ex.Message) 'ou este
    MessageBox(ex.InnerException) 'ou este
End Try
Pode ser que ajude. Mais ainda, sempre que faças uma conexão a uma BD usa o try catch. Evita, quase sempre, que o software estoire e fazes também um controlo de erros. Muito importante!

1abraço!
 
Ok. Também serve!
Então para ser mais completo o exemplo adiciona isto no catch.

If Not IsNothing(_Con) Then
If _Con.State = Data.ConnectionState.Open Then _Con.Close
_Con = Nothing
End If


Cumps
 
Última edição:
Só uma nota: se estás a usar OLEDB os parâmetros têm que ser adicionados pela ordem que estão na query! Estive umas horas com esse stress :P

1Abraço!
 
Sim , antes eu tinha a cena do catch em comentario , e era por causa disso que fiquem mais que uma hora a tentar encontar o erro , mas quando tirem o catch do comentario , o programa deixou de ter erros :D :

Public Sub ExecutarNonQuery()
Me._Erro = False
Try
Me._Cmd = New OleDbCommand(Me._StrSql, Me._Con)
Me._Cmd.CommandType = CommandType.Text
If Me._Con.State = ConnectionState.Open Then
Me._Con.Close()
End If
Me._Con.Open()
Me._Cmd.ExecuteNonQuery()
Me._Con.Close()
Catch ex As Exception
Me._Erro = True
End Try
End Sub
 
Back
Topo