Erro ao tentar chamar o método de preparar antes de adicionar parâmetros: "Uma exceção sem tratamento do tipo 'System.Data.SqlClient.SqlException' Ocorreu no system.data.dll"

Traduções de Artigos Traduções de Artigos
Artigo: 310368 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Para obter uma Microsoft Visual C# .NET versão deste artigo, consulte 311348.

Este artigo faz referência à seguintes espaços de nomes Microsoft .NET Framework Class Library:
  • System.data.OLEDB
  • System.data.SqlClient
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando criar um comando com parâmetros SQL Server 7.0, se chamar o método de preparação antes de adicionar parâmetros ao comando, receberá a seguinte mensagem de erro:
Excepção não processada do tipo 'System.Data.SqlClient.SqlException' Ocorreu no system.data.dll.
Obter informações adicionais: erro de sistema.
Este problema não ocorre no SQL Server 2000.

Causa

Este problema ocorre no SQL Server 7.0 porque, por predefinição, não é possível executar o método preparar antes de adicionar parâmetros. Isto aplica-se a maioria dos sistemas de base de dados.

SQL Server 2000 não gerar a excepção anteriormente mencionada porque não funciona preparar até o primeiro comando é executado. Esta optimização evita a sobrecarga de preparar se não comandos são executados posteriormente.

Resolução

Para resolver este problema, não chame o método de preparar até depois de adicionar os parâmetros.

Mais Informação

Passos para reproduzir o comportamento

O código de exemplo a seguir utiliza o índice de região da base de dados de exemplo.
  1. Inicie o Microsoft Visual Studio NET..
  2. Crie um novo projecto de aplicação do Windows do Visual Basic. Form1 é adicionado ao projecto por predefinição.
  3. Certifique-se que o projecto contém uma referência ao espaço de nomes System.data e adicione uma referência a este espaço de nomes se não tiver.
  4. Coloque um controlo de botão no Form1. Alterar a propriedade Name do botão para btnTest e alterar a propriedade de texto para teste .
  5. Utilize a instrução de importação espaços de nomes System.data.SqlClient , System.data.OLEDB e sistema para que não é necessário para qualificar declarações os espaços de nomes mais tarde no código. Adicione o seguinte código à secção "General Declarations" do Form1:
    Imports System
    Imports System.Data.OleDb
    Imports System.Data.SqlClient
    					
  6. Adicione o seguinte código à janela de código depois da região "Criador de formulários Windows gerado código".

    Nota <username>Tem de alterar ID de utilizador <utilizador> e palavra-passe = < palavra-passe segura > para os valores correctos antes de executar este código. Certifique-se que o ID de utilizador tem as permissões adequadas para efectuar esta operação na base de dados.
        Private Sub btnTest_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnTest.Click
            Dim myConnString As String = _
                "User ID=<username>;password=<strong password>;Initial Catalog=Northwind;Data Source=myServer"
            Dim id As Integer = 25
            Dim desc As String = "myFirstRegion"
            Dim rConn As SqlConnection = New SqlConnection(myConnString)
            rConn.Open()
            Dim command As SqlCommand = New SqlCommand("", rConn)
            command.CommandText = "insert into Region (RegionID, RegionDescription)" & _
                                  "values (@id, @desc)"
    
            'SQL Server 7.0 throws an exception here.
            'Comment the following line to resolve this problem against SQL Server 7.0.
            command.Prepare()
    
            command.Parameters.Add("@id", SqlDbType.Int, 4)
            command.Parameters.Add("@desc", SqlDbType.Char, 50)
            'You can call Prepare after you set up CommandText and parameters.
            command.Prepare() 
    
            command.Parameters(0).Value = id
            command.Parameters(1).Value = desc
            command.ExecuteNonQuery()
            MessageBox.Show("Updated Successfully")
        End Sub
    					
  7. Modificar a cadeia de ligação ( myConnString ) conforme apropriado para o ambiente.
  8. Guarde o projecto. No menu Debug , clique em Iniciar para executar o projecto.
  9. Clique em Testar . Se estiver ligado a uma base de dados SQL Server 7.0, o código gera a excepção anteriormente mencionada.

    Se estiver ligado a uma base de dados do SQL Server 2000, o código é executado correctamente e é apresentada a caixa de mensagem "com actualização êxito".
  10. Para resolver este problema com o SQL Server 7.0, comentar a chamada para command.Prepare que precede o código para adicionar os parâmetros e, em seguida, execute novamente o projecto.

Referências

Para obter mais informações sobre objectos ADO.NET e sintaxe, consulte o seguinte Microsoft .NET Framework Software Development Kit (SDK) documentação:
Acessando dados com o ADO.NET
http://msdn2.microsoft.com/en-us/library/e80y5yhx(vs.71).aspx

Propriedades

Artigo: 310368 - Última revisão: 24 de fevereiro de 2014 - Revisão: 2.8
A informação contida neste artigo aplica-se a:
  • Microsoft ADO.NET 2.0
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic 2005
  • Microsoft SQL Server 7.0 Standard Edition
Palavras-chave: 
kbnosurvey kbarchive kbmt kbtshoot kberrmsg kbnofix kbprb kbsqlclient kbsystemdata KB310368 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 310368

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com