ID do artigo: 910696 - Última revisão: quarta-feira, 28 de novembro de 2007 - Revisão: 2.1 Problemas conhecidos para o ADODB Primary Interop Assembly (PIA) que acompanha o Visual Studio 2005
cuidado ADO e ADO MD não foram totalmente testados em um ambiente Microsoft .NET Framework. Eles podem causar problemas intermitentes, especialmente em aplicativos baseados em serviço ou em aplicativos multissegmentados. As técnicas descritos neste artigo só devem ser usadas como uma medida temporária durante a migração para o ADO.NET. Você só deve usar essas técnicas depois de ter conduzido teste completo para verificar não se estão nenhum problema de compatibilidade. Quaisquer problemas que são causados por usando ADO ou ADO MD dessa maneira não são suportados. Para obter mais informações, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft: 840667
(http://support.microsoft.com/kb/840667/
)
Você receber erros inesperados ao usar o ADO e ADO MD em um aplicativo .NET Framework Nesta páginaINTRODUÇÃOEste artigo descreve os problemas conhecidos para o ADODB Primary Interop Assembly (PIA) que acompanha o Microsoft Visual Studio 2005. Mais InformaçõesDiferenças no coletor de lixo entre o Microsoft Visual Basic 6.0 e o Microsoft Visual Basic .NETExistem diferenças principais entre coleta de lixo no Visual Basic 6.0 e no Visual Basic. NET. A principal diferença é que a coleta de lixo do Visual Basic 6.0 é mais agressiva de coleta de lixo .NET do Visual Basic. Com o Visual Basic 6.0, assim que uma instância de objeto fica fora do escopo, o objeto imediatamente é lançado. O mesmo comportamento não ocorre com o Visual Basic .NET ou com coleta de lixo .NET comum. Com coleta de lixo .NET, objetos são liberados assincronamente.Essa diferença na coleta de lixo pode ter um grande efeito sobre o código de acesso a dados quando você move do Visual Basic 6.0 para Visual Basic. NET. Por exemplo, um objeto ADODB Recordset aberto será fechado quando o objeto é recuperado pela coleta de lixo. Os desenvolvedores que têm experiência em escrever código do Visual Basic 6.0 podem depender de semântica de coleta de lixo que será alterado quando migrar o código para o Visual Basic .NET. Como coleta de lixo do .NET é assíncrona e não-determinística, você não pode ver as alterações mesmo após o teste básico ocorre. Alguns bancos de dados, como bancos de dados Microsoft SQL Server 2000, somente oferecem suporte a um único resultado ativo definido por conexão. Se você tiver um cursor firehose abrir em uma conexão ao SQL Server, que conexão está bloqueada até que o cursor seja fechado. Por padrão, provedores de banco de dados OLE abrirá conexões adicionais para executar consultas se a conexão atual não é possível executar essa consulta. Portanto, muitos usuários de ActiveX Data Objects (ADO) são insensíveis a essa limitação. Essas conexões adicionais não participam pool de conexão. As tentativas para abrir conexões adicionais quando a conexão bloqueada está participando em uma transação falharão. É recomendável que você revise seu código Visual Basic 6.0 e fechar explicitamente todos os objetos Recordset e conexões. Em seguida, testar novamente seu código depois de migrar seu código para Visual Basic. NET. Esta seção lista três exemplos desse problema e exemplos de código para cada exemplo. Exemplo 1: Abrir o conexões adicionais quando você não fechar explicitamente os objetos RecordsetQuando você executa o seguinte exemplo de código no Visual Basic 6.0, somente uma única conexão é necessária. Isso ocorre porque o objeto Recordset que criou no procedimento ExecuteQuery implicitamente está fechado quando o objeto Recordset fica fora do escopo. O exemplo de código usa a variável do SQL Server @@ SPID para representar o identificador de processo do servidor que é usado para executar a consulta. Se você executar o código, você irá notar que as consultas retornam o mesmo valor de @@ spid coluna. Esse resultado significa que as consultas foram executadas na mesma conexão ao banco de dados.Esse comportamento é diferente porque o objeto Recordset que foi criado no procedimento de ExecuteQuery não foi fechado e permanecerá aberto até que o coletor de lixo .NET limpa o objeto Recordset . Coleta de lixo no Microsoft .NET Framework ocorre de forma assíncrona. Se o objeto Recordset não foi fechado no momento em que o procedimento de ExecuteQuery é chamado novamente, o SQL Server provedor OLE DB abrirá uma nova conexão para executar a segunda consulta. Se você adicionar uma chamada para o comando rs.Close no procedimento de ExecuteQuery , você Certifique-se que as consultas são executadas na mesma conexão. Você pode dizer também explicitamente o SQL Server provedor OLE DB não para abrir conexões adicionais. Para fazer isso, adicione a seguinte linha de código imediatamente após abrir a conexão: Exemplo 2: Problemas ocorrem quando você trabalha com transações se você não fechar explicitamente os objetos RecordsetNão é possível abrir conexões adicionais quando a conexão bloqueada está participando em uma transação. Quando você executa o seguinte exemplo de código no Visual Basic 6.0, o código executa várias consultas em uma única conexão que tenha uma transação aberta. O código chama duas funções a seguir:
Não é possível criar nova conexão porque no modo de transação manual ou distribuído. Exemplo 3: Problemas ocorrem quando você cria implicitamente e, em seguida, abandonar objetos RecordsetPor padrão, o método execute dos objetos de conexão e comando implicitamente cria e retorna um novo objeto Recordset . No Visual Basic 6.0, se esse objeto Recordset não é mantido em uma variável de objeto, o objeto Recordset fica fora do escopo e é fechado imediatamente. Portanto, o exemplo de código a seguir executa com êxito no Visual Basic 6.0. No entanto, você receberá a mensagem de erro mencionada no "exemplo 2: problemas ocorrem quando você trabalha com transações se você não fechar explicitamente os objetos Recordset" seção se o código for migrado para o Visual Basic .NET.Para resolver esse problema, passe o valor adExecuteNoRecords do valor ExecuteOptionsEnum no parâmetro Opções do método execute . Quando você fizer isso, você pode indicar que o método execute não deve retornar um objeto Recordset conforme ilustrado no seguinte exemplo de código. Problema 2: Não é recomendável o PIA ADODB para cenários de cargaÉ altamente desencorajar você de usar o PIA ADODB em cenários de carga, como em componentes do Microsoft ASP.NET ou o Microsoft COM + multiusuário. Quando as equipes de teste da Microsoft testado o PIA ADODB, as equipes de teste localizado que o PIA ADODB falhar sob carga excessiva. Se o código de acesso de dados .NET deve executar confiável sob carga excessiva, é altamente recomendável que você escrever o código usando o ADO.NET.Problema 3: Não é recomendável que você usar o PIA ADODB no modo de 64 bitsÉ altamente desencorajar você de usar o PIA ADODB em aplicativos de 64 bits. O PIA ADODB não foram testado no modo de 64 bits. A maioria dos cenários de 64-bit envolvem componentes do lado do servidor de alto-estresse, tais como ASP.NET ou COM +. O PIA ADODB tem conhecidos problemas ao executar sob carga excessiva. A disponibilidade limitada de provedores OLE DB de 64 bits também torna o modo de 64 bits menos interessantes para trabalhar com o PIA ADODB.Problema 4: Falhas ocorrem quando você usar execução de consulta de ligação tardiaADODB oferece suporte a dois formulários de execução de consulta de ligação tardia. Execução de consulta de ligação tardia permite usar a ligação de IDispatch em COM para executar consultas como se as consultas foram métodos em um objeto Connection . ADODB oferece suporte a duas seguintes formas de execução de consulta de ligação tardia:
Os exemplos a seguintes ilustram esses problemas. Exemplo 1: Se você criar uma segunda consulta de ligação tardia que tem o mesmo nome, a consulta falharO exemplo de código a seguir cria duas consultas de ligação tardia que usam o mesmo valor para a propriedade Name do objeto Command .Quando o código semelhante é executado no Visual Basic. NET, o objeto de comando pode não recuperado pela coleta de lixo pelo tempo que o segundo objeto de comando está associado com o objeto Connection . Portanto, você receberá a seguinte mensagem de erro exceção: Objeto já está na coleção. Não é possível acrescentar. Exemplo 2: Se você chamar uma consulta de ligação tardia em uma segunda conexão, a consulta falharáO exemplo de código a seguir executa as seguintes tarefas na ordem em que eles são apresentados:
O compilador do Visual Basic .NET não faz essa diferenciação. Na primeira chamada para a consulta "GetCount", o compilador do Visual Basic .NET armazena a assinatura do método no caso de outra chamada é feita para um método GetCount em um objeto Connection . Quando o código chama a segunda consulta "GetCount", o Visual Basic .NET reutiliza a assinatura de método em cache para o segundo método GetCount . Como ADODB gera assinaturas de método exclusivo, a segunda consulta de ligação tardia chamada falhará. Não há solução existe para esse cenário. Problema 5: Você pode definir alguns tipos de dados Variant ADODB a seqüência tipos de dadosO modelo de objeto ADODB permite que você defina algumas propriedades com seqüências de caracteres ou a outros objetos ADODB. Por exemplo, a propriedade ActiveConnection do objeto Recordset aparece no Pesquisador de objeto Visual Basic 6.0 como um tipo de dados Variant e pode ser definida como um objeto Connection ou uma seqüência de conexão.Se você tiver criado seu próprio objeto e deseja oferecer suporte a essa funcionalidade, você deve criar acessadores de propriedade separado. Para fazer isso, use o código que é semelhante ao exemplo de código a seguir.
: 6 Uma exceção InvalidCastException ocorre quando você chamar o método Parameters.AppendO PIA de ADODB está incluído no Microsoft Visual Studio .NET 2003 e no Visual Studio 2005 tem um problema conhecido que ocorre quando você chamar o método Parameters.Append juntamente com um objeto de parâmetro que foi criado usando o construtor padrão.O exemplo de código a seguir causará uma exceção InvalidCastException . cmd Problema 7: Você enfrentar problemas de trabalhar com componentes que esperam ADO 2.8 interfacesO PIA ADODB que acompanha o Visual Studio 2005 é o mesmo componente que foi incluído no Visual Studio .NET 2003 e foi criado usando o Microsoft .NET Framework 1.1. O PIA ADODB foi criado para interagir com o ADO 2.7 interfaces e não tiver sido atualizado para trabalhar com ADO 2.8 interfaces.Portanto, tentativas para usar o PIA ADODB juntamente com componentes que expõem ADO 2,8 interfaces será falhar. Não há suporte para esse cenário com o PIA ADODB. A informação contida neste artigo aplica-se a:
Tradução automáticaIMPORTANTE: 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado. Clique aqui para ver a versão em Inglês deste artigo: 910696
(http://support.microsoft.com/kb/910696/en-us/
)
| Outros Recursos Outros Sites de Suporte
ComunidadesObtenha Ajuda AgoraTraduções deste artigo
|






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email


Voltar para o início