Uma fuga de memória ocorre no Microsoft OLE DB Provider para SQL Server (SQLOLEDB) com SERVERDATAONINSERT quando o tamanho da coluna for superior a 255.
Para resolver este problema, obtenha o service pack mais recente do Microsoft MDAC 2.5. Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
293312
(http://support.microsoft.com/kb/293312/EN-US/
)
INFO: Como obter o mais recente MDAC 2.5 Service Pack
Também poderá resolver este problema obtendo o service pack mais recente do SQL Server 2000, o service pack mais recente do MDAC 2.6 ou a correcção referida abaixo. Para obter informações adicionais, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
290211
(http://support.microsoft.com/kb/290211/EN-US/
)
INF: How to Obtain the Latest SQL Server 2000 Service Pack
Para obter informações adicionais, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
300635
(http://support.microsoft.com/kb/300635/EN-US/
)
INFO: Como obter o MDAC 2.6 mais recente Service Pack
Correcção
MDAC 2.5 A versão inglesa desta correcção deverá ter os seguintes atributos de ficheiro ou posteriores:
Date Version Size File name Platform
-------------------------------------------------------------
04-Jun-2001 7.1.9.99 545,040 bytes Sqloledb.dll x86
MDAC 2.6 A versão inglesa desta correcção deverá ter os seguintes atributos de ficheiro ou posteriores:
Date Version Size File name Platform
------------------------------------------------------------------
11-Jun-2001 2000.80.301.0 491,584 bytes Sqloledb.dll x86
11-Jun-2001 2000.80.301.0 61,440 bytes Sqloledb.dll x86
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no início deste artigo. Este problema foi corrigido pela primeira vez no MDAC 2.5 Service Pack 3.Este problema foi corrigido pela primeira vez no SQL Server 2000 Service Pack 2 e o MDAC 2.6 Service Pack 2.
Passos para reproduzir o comportamento
- No SQL Server 2000, crie as seguintes tabelas:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[STATEMIN1]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[STATEMIN1]<BR/>
GO
CREATE TABLE [dbo].[STATEMIN1] (
[messagekey] [int] IDENTITY (1, 1) NOT NULL ,
[message] [varchar] (2000) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[STATEMIN1] WITH NOCHECK ADD
CONSTRAINT [PK_STATEMIN1] PRIMARY KEY CLUSTERED
(
[messagekey]
) ON [PRIMARY]
GO
- Cole o seguinte código numa aplicação de consola do Microsoft Visual C++ e, em seguida, compilar o código.
Nota : É deve alterar o nome da origem de dados, ID de utilizador e palavra-passe.
#include <afx.h>
#include <assert.h>
#include <iostream>
#include <atldbcli.h>
#include <objbase.h>
const ULONG nInitProps = 4;
const ULONG nPropSet = 1;
const ULONG nParams = 3; //Number of parameters in the command
const ULONG nProps = 5;
struct StateIn
{
UINT uiMessageKey;
TCHAR pszMessage[257];
};
int main(void)
{
CCommand<CManualAccessor,CRowset,CNoMultipleResults> rs;
CDataSource m_connect;
CSession m_session;
DBPROP InitProperties[nProps];
DBPROPSET rgInitPropSet;
USES_CONVERSION;
HRESULT hr;
hr = CoInitialize(NULL);
for (ULONG i = 0; i < nProps; i++ )
{
VariantInit(&InitProperties[i].vValue);
InitProperties[i].dwOptions = DBPROPOPTIONS_REQUIRED;
InitProperties[i].colid = DB_NULLID;
}
InitProperties[0].dwPropertyID = DBPROP_INIT_PROMPT;
InitProperties[0].vValue.vt = VT_I2;
InitProperties[0].vValue.iVal = DBPROMPT_NOPROMPT;
InitProperties[1].dwPropertyID = DBPROP_INIT_DATASOURCE;
InitProperties[1].vValue.vt = VT_BSTR;
InitProperties[1].vValue.bstrVal =
SysAllocString(OLESTR("servername")); // Server Name
InitProperties[2].dwPropertyID = DBPROP_INIT_CATALOG;
InitProperties[2].vValue.vt = VT_BSTR;
InitProperties[2].vValue.bstrVal = SysAllocString(L"database"); // Database Name
InitProperties[2].dwOptions = DBPROPOPTIONS_REQUIRED;
InitProperties[2].colid = DB_NULLID;
InitProperties[3].dwPropertyID = DBPROP_AUTH_USERID;
InitProperties[3].vValue.vt = VT_BSTR;
InitProperties[3].vValue.bstrVal = SysAllocString(OLESTR("sa")); // User Id.
InitProperties[4].dwPropertyID = DBPROP_AUTH_PASSWORD;
InitProperties[4].vValue.vt = VT_BSTR;
InitProperties[4].vValue.bstrVal = SysAllocString(OLESTR("")); // Password
rgInitPropSet.guidPropertySet = DBPROPSET_DBINIT;
rgInitPropSet.cProperties = nProps;
rgInitPropSet.rgProperties = InitProperties;
char szProgID[100] = {0};
strcpy(szProgID,"SQLOLEDB");
CLSID clsid;
WCHAR wszProgId[100] = {0};
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szProgID, -1, wszProgId, 100);
hr = CLSIDFromProgID(wszProgId, &clsid);
hr = m_connect.Open(clsid,&rgInitPropSet);
hr = m_session.Open(m_connect);
SysFreeString(InitProperties[1].vValue.bstrVal);
SysFreeString(InitProperties[2].vValue.bstrVal);
SysFreeString(InitProperties[3].vValue.bstrVal);
SysFreeString(InitProperties[4].vValue.bstrVal);
DWORD dwStatus;
dwStatus = DBSTATUS_S_IGNORE;
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_IRowsetUpdate, false);
propset.AddProperty(DBPROP_UPDATABILITY,
DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
propset.AddProperty(DBPROP_SERVERDATAONINSERT,true);
StateIn rowValue_StateIn;
rs.CreateAccessor(2, &rowValue_StateIn, sizeof(rowValue_StateIn));
rs.AddBindEntry(1, DBTYPE_I4,sizeof(rowValue_StateIn.uiMessageKey),
&rowValue_StateIn.uiMessageKey,NULL,&dwStatus);
rs.AddBindEntry(2, DBTYPE_STR, sizeof(rowValue_StateIn.pszMessage),
&rowValue_StateIn.pszMessage,NULL);
TCHAR * m_strQuery = _T("select * from statemin1");
hr = rs.Create(m_session,m_strQuery);
hr = rs.Open(&propset);
dwStatus = DBSTATUS_S_IGNORE;
TCHAR szInsStr[50];
strcpy(szInsStr,"test1");
strcpy(rowValue_StateIn.pszMessage, szInsStr);
hr = rs.Insert(0,1);
for(int j = 0;j < 20000;j++)
{
strcpy(rowValue_StateIn.pszMessage, szInsStr);
hr = rs.Insert(0,1);
}
return S_OK;
}
- Iniciar o Monitor de desempenho e veja o contador Private Bytes para o processo durante a execução de código.
Para obter informações adicionais, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
301953
(http://support.microsoft.com/kb/301953/EN-US/
)
SQLOLEDB: Unenlisting a partir do Active Directory transacções com o SQL Server 7.0 causas bloqueio e Abort de drenagem
Artigo: 302995 - Última revisão: segunda-feira, 26 de Setembro de 2005 - Revisão: 4.1
A informação contida neste artigo aplica-se a:
- Microsoft Data Access Components 2.1
- Microsoft Data Access Components 2.1 Service Pack 2
- Microsoft Data Access Components 2.1 Service Pack 1
- Microsoft Data Access Components 2.1 Service Pack 2
- Microsoft Data Access Components 2.5
- Microsoft Data Access Components 2.5 Service Pack 1
- Microsoft Data Access Components 2.5 Service Pack 2
- Microsoft Data Access Components 2.6
| kbmt kbhotfixserver kbqfe kbmdac250sp3fix kbbug kbfix kbmdac260sp2fix kbsqlserv2000presp2fix KB302995 KbMtpt |
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 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:
302995
(http://support.microsoft.com/kb/302995/en-us/
)