Oprava: Nevracení paměti v zprostředkovatele MDAC SQLOLEDB na velikost sloupce, je delších než 255 a SERVERDATAONINSERT

Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.

302995
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Příznaky
Dochází k nevracení paměti v zprostředkovatele Microsoft OLE DB pro SQL Server (SQLOLEDB) s SERVERDATAONINSERT při velikost sloupců je větší než 255.
Řešení
Tento problém vyřešíte pomocí nejnovější aktualizace service pack pro Microsoft MDAC 2.5. Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
293312INFORMACE: Jak získat nejnovější MDAC 2.5 Service Pack
Tento problém může také vyřešit získáním nejnovější aktualizace service pack pro SQL Server 2000, nejnovější aktualizace service pack pro součásti MDAC 2.6 nebo opravu hotfix uvedenou níže. Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
290211INF: Jak získat nejnovější aktualizaci Service Pack pro SQL Server 2000
Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
300635INFORMACE: Jak získat nejnovější MDAC 2.6 Service Pack

Oprava hotfix

MDAC 2.5

Anglická verze této opravy má následující atributy souborů nebo novější:
   Date         Version    Size           File name     Platform   -------------------------------------------------------------   04-Jun-2001  7.1.9.99   545,040 bytes  Sqloledb.dll  x86				
MDAC 2.6

Anglická verze této opravy má následující atributy souborů nebo novější:
   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				

Prohlášení
Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny na začátku tohoto článku. Tento problém byl poprvé opraven v aktualizaci Service Pack 3 pro MDAC 2.5.Tento problém byl poprvé opraven v SQL Server 2000 Service Pack 2 a MDAC 2.6 Service Pack 2.
Další informace

Kroky pro reprodukci chování

  1. V Microsoft SQL Server 2000 vytvořit následující tabulky:
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[STATEMIN1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table [dbo].[STATEMIN1]<BR/>GOCREATE TABLE [dbo].[STATEMIN1] (	[messagekey] [int] IDENTITY (1, 1) NOT NULL ,	[message] [varchar] (2000) NOT NULL ) ON [PRIMARY]GOALTER TABLE [dbo].[STATEMIN1] WITH NOCHECK ADD 	CONSTRAINT [PK_STATEMIN1] PRIMARY KEY  CLUSTERED 	(		[messagekey]	)  ON [PRIMARY] GO					
  2. Vložte následující kód do aplikace Microsoft Visual C++ konzoly a kompilovat kód.

    Poznámka: je nutné změnit název zdroje dat, ID uživatele a heslo.
    #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 commandconst 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;}					
  3. Spustit sledování výkonu a sledujte čítač nesdílených bajtů pro proces, během spuštění kódu.
Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
301953SQLOLEDB: Unenlisting z Active transakcí před SQL Server 7.0 způsobí předsazení a Abort trativodu

Upozornění: Tento článek byl přeložen automaticky

Vlastnosti

ID článku: 302995 - Poslední kontrola: 02/28/2014 17:05:34 - Revize: 4.1

  • 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
  • kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbmdac250sp3fix kbbug kbfix kbmdac260sp2fix kbsqlserv2000presp2fix KB302995 KbMtcs
Váš názor