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"

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.

310368
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
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 SystemImports System.Data.OleDbImports 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:

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 310368 - Última Revisão: 02/24/2014 06:07:40 - Revisão: 2.8

  • 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
  • kbnosurvey kbarchive kbmt kbtshoot kberrmsg kbnofix kbprb kbsqlclient kbsystemdata KB310368 KbMtpt
Esta informação foi útil?