你目前正处于脱机状态,正在等待 Internet 重新连接

在 MDAC SQLOLEDB 提供程序上 SERVERDATAONINSERT 和大于 255 的列大小的 FIX: 内存泄漏

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 302995
本文已归档。它按“原样”提供,并且不再更新。
症状
内存泄漏时发生 Microsoft OLE DB 提供程序中为 SQL Server (SQLOLEDB) 与 SERVERDATAONINSERT 列大小大于 255。
解决方案
若要解决此问题,获得最新的 service pack,对于 Microsoft MDAC 2.5。有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
293312信息: 如何获取最新 MDAC 2.5 服务包
您还可能通过获取最新的 service pack,SQL Server 2000、 最新的 service pack 的 MDAC 2.6 或下面提到的修补程序解决此问题。 有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
290211INF: 如何获取最新的 SQL Server 2000 Service Pack
有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
300635信息: 如何获取最新 MDAC 2.6 服务包

修补程序

2.5 MDAC

此修复程序的英文版应具有以下文件属性或更高版本:
   Date         Version    Size           File name     Platform   -------------------------------------------------------------   04-Jun-2001  7.1.9.99   545,040 bytes  Sqloledb.dll  x86				
MDAC 2.6

此修复程序的英文版应具有以下文件属性或更高版本:
   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				

状态
Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中的问题。Microsoft MDAC 2.5 Service Pack 3 中,第一次已得到纠正此问题。首先,此问题已更正 SQL Server 2000 Service Pack 2 和 $ MDAC 2.6 Service Pack 2 中。
更多信息

重现行为的步骤

  1. 在 Microsoft SQL Server 2000,创建下表:
    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. 将以下代码粘贴到 Microsoft Visual c + + 控制台应用程序,然后编译代码。

    注意: 您必须更改数据源名称、 用户 id,和密码
    #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. 启动性能监视器和运行代码时监视进程的专用字节数计数器。
有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
301953从免受 SQL Server 7.0 导致挂起和 $ 排水管中止的活动事务 Unenlisting SQLOLEDB:

警告:本文已自动翻译

属性

文章 ID:302995 - 上次审阅时间:02/26/2014 20:53:13 - 修订版本: 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 KbMtzh
反馈