Sintomas
Se executar um procedimento armazenado remotamente com parâmetros de saída num servidor ligado através de um controlador ODBC para SQL Server, o controlador ODBC não consegue obter o parâmetro de saída e poderá receber a seguinte mensagem de erro:
[Microsoft] [ODBC SQL Server Controlador]Violação de atributo de tipo de dados restrito
Resolução
Está disponível uma hotfix suportada da Microsoft. No entanto, esta correção destina-se a corrigir apenas o problema descrito neste artigo. Aplique esta hotfix apenas aos sistemas que estão com este problema específico. Esta atualização poderá receber testes adicionais. Portanto, se não for afetado gravemente por este problema, recomendamos que aguarde pela próxima atualização de software que contém esta atualização.
Se a hotfix estiver disponível para transferência, existe uma secção "Transferência de ficheiros hotfix disponível" na parte superior deste artigo da Base de Dados de Conhecimento. Se esta secção não aparecer, contacte o Suporte e Suporte ao Cliente da Microsoft para obter a hotfix.
Nota Se ocorrerem problemas adicionais ou se for necessária uma remoção de problemas, poderá ter de criar um pedido de serviço separado. Os custos habituais de suporte serão aplicados a perguntas e problemas de suporte adicionais que não são qualificáveis para esta hotfix específica. Para uma lista completa dos números de telefone do Suporte ao Cliente da Microsoft ou para criar um pedido de serviço separado, visite o seguinte site da Microsoft:
http://support.microsoft.com/contactus/?ws=supportNota: o formulário "Transferência de hotfix disponível" apresenta os idiomas para os quais a hotfix está disponível. Se não vir o seu idioma, significa que não está disponível uma hotfix para esse idioma.
' A versão em inglês desta hotfix tem os atributos de ficheiro (ou posterior) listados na seguinte tabela. As datas e horas destes ficheiros são listadas em hora universal coordenada (UTC). Quando visualizar as informações dos ficheiros, estas serão convertidas na hora local. Para determinar a diferença entre a hora UTC e a hora local, utilize o separador Fuso Horário da ferramenta Data e Hora do Painel de Controlo.
MDAC 2.7 Service Pack 1
Date Time Version Size File name
----------------------------------------------------------
12-Nov-2002 02:42 2000.81.9031.12 24,576 Odbcbcp.dll
12-Nov-2002 02:41 2000.81.9031.12 385,024 Sqlsrv32.dll
MDAC 2.8
Date Time Version Size File name
---------------------------------------------------------
15-Jun-2004 00:22 2000.85.1045.0 28,672 Dbnmpntw.dll
15-Jun-2004 00:21 2.80.1045.0 147,456 Msadds.dll
15-Jun-2004 00:21 2.80.1045.0 512,000 Msado15.dll
15-Jun-2004 00:21 2.80.1045.0 163,840 Msadomd.dll
15-Jun-2004 00:21 2.80.1045.0 184,320 Msadox.dll
15-Jun-2004 00:21 2.80.1045.0 53,248 Msadrh15.dll
15-Jun-2004 00:21 2.80.1045.0 225,280 Msdaora.dll
15-Jun-2004 00:21 2.80.1045.0 147,456 Msdart.dll
15-Jun-2004 00:21 2.575.1045.0 139,264 Msorcl32.dll
15-Jun-2004 00:21 3.525.1045.0 221,184 Odbc32.dll
15-Jun-2004 00:22 2000.85.1045.0 24,576 Odbcbcp.dll
15-Jun-2004 00:21 2.80.1045.0 442,368 Oledb32.dll
15-Jun-2004 00:21 2000.85.1045.0 503,808 Sqloledb.dll
15-Jun-2004 00:21 2000.85.1045.0 401,408 Sqlsrv32.dll
15-Jun-2004 00:08 2000.85.1045.0 208,896 Sqlxmlx.dll
Nota: para ver uma lista de todos os hotfixes disponíveis para o MDAC 2.8, clique no seguinte número de artigo para ver o artigo na Base de Dados de Conhecimento Microsoft:
839801 CORREÇÃO: As correções estão disponíveis para o MDAC 2.8
Estado
A Microsoft confirmou que este problema ocorre nos produtos da Microsoft listados na secção "Aplica-se a".
Mais Informações
Passos para reproduzir o comportamento
-
Utilize o seguinte código para criar um procedimento SQL Server com parâmetros de saída num servidor ligado:
USE pubs GO CREATE PROCEDURE dbo.sample_stored_procedure @op varchar(20) output AS set @op = 'demo string' return 0 GO
Nota: não recebe a mensagem de erro listada na secção "Sintomas" se o procedimento armazenado devolver um conjunto de resultados.
-
O seguinte código de exemplo de aplicação do Microsoft Visual Basic acede ao procedimento armazenado remotamente num servidor ligado. No exemplo de código seguinte, srv1
esrv2 são os dois servidores que estão a executar o SQL Server e está a criar srv2 como um servidor ligado no srv1.Dim cn As new ADODB.Connection Dim cmd As new ADODB.Command Dim prm As ADODB.Parameter cn.Open "Driver={SQL Server};Server=srv1;UID=sa;PWD=sa_password;" cmd.ActiveConnection = cn cmd.CommandType = adCmdStoredProc cmd.CommandText = "srv2.pubs.dbo.sample_stored_procedure" Set prm = cmd.CreateParameter("op", adVarChar, adParamOutput, 20) cmd.Parameters.Append prm cmd.Execute Debug.Print prm.Value cn.Close Set cn = Nothing