Düzeltme: SQLOLEDB hiçbir veri AutoFetch seçeneği ile hızlı ileri imleçler kullanıldığında geri bildiriyor

Makale çevirileri Makale çevirileri
Makale numarası: 303446 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

Yerel SQL Server sağlayıcısını (SQLOLEDB), aşağıdaki koşullarda 255 karakterden daha büyük bir VARCHAR alan için veri döndürebilir:
  • Satır özelliklerini hızlı ileri imleç oluşturur.
  • (Bir sağlayıcıya özgü özellik) AutoFetch özelliği TRUE olarak ayarlandı.
  • Sorgu, boyutu 255 karakterden daha büyük bir VARCHAR alanı içeriyor.
Veri satırını getirilen IRowset->GetData() DB_S_ERRORSOCCURED (0x800040eda) verir ve sütunun DBSTATUS_E_UNAVAILABLE durumudur. Alt düzey bir NetMon izlemek oluşturmadan veya verileri istemciye doğru olarak döndürüldü "dbcc traceon" komutları gösterir. VARCHAR sütunu en çok 255 karakter veya daha az, veya imleç türü hızlı ileri Sar dışında veri beklendiği gibi satır olacaktır.

Tüm sürümlerinde SQL Server yerel sağlayıcısını sürümlerinden 2000.80.380.0 (SQL 2000/MDAC 2.6 SP1 sürümü) Bu sorun oluşur ve önceki sürümleri.

Neden

Satırkümesi sorgudan dönen, sağlayıcı için SQL Server tarafından geri gönderilen meta verilere göre düzenlendiği bir bellek içi yapısı oluşturur. Normal olarak, sağlayıcı, yönetin ve bağlamanın basitleştirin daha kolay hale getirmek için bitişik bir yapıda veriyi tutmak çalışır.

255 Karakterden daha büyük bir VARCHAR sütunu olduğunda, "satırı alınmış sütunlar" adlı SQL Server sağlayıcısını kullanır. Veri sütununun satır içi tutulur yani diğer verilerle birlikte. Bunun yerine, ayrı bir arabellek, veriyi ve yeni bir arabellek için sütun bilgisi noktalarını tahsis edilir.

Hızlı ileri imleçlerle AutoFetch seçeneğini kullanırken, sağlayıcısında bir tasarım kusur nedeniyle satırı alınmış sütunlarda arabellekleri henüz veri getirilen zaman tahsis edilmemiş. Bu sütun için veri yok ve satır, sütun için döndürülen veri inanıyorsanız sağlayıcıyı müşteri adayı.

Çözüm

Bu sorunu gidermek için <a0></a0>, SQL Server 2000, MDAC 2.6 için en son hizmet paketini veya aşağıda başvurulan düzeltme en son hizmet paketini edinin. Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
290211BILGI: en son SQL Server 2000 hizmet paketi nasıl elde edilir
Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
300635BILGI: son MDAC 2.6) nasıl elde edilir hizmet paketi

Düzeltme

Bu düzeltmenin İngilizce sürümünde aşağıdaki dosya öznitelikleri veya üstü bulunur.

MDAC 2.6
Date          Version         Size            File name     
------------------------------------------------------------
07/12/2001    2000.80.307.0   491,584 bytes   Sqloledb.dll
07/12/2001    2000.80.307.0   61,440 bytes    Sqloledb.rll
01/08/2001                     1,652 bytes    EULA.txt
				
MDAC 2.6 SP1
Date          Version         Size            File name    
-----------------------------------------------------------
08/15/2001    2000.80.434.0   495,697 bytes   Sqloledb.dll	
08/15/2001    2000.80.434.0    61,440 bytes   Sqloledb.rll	
01/08/2001                      1,652 bytes   EULA.txt       
				
MDAC 2.7
Date          Version         Size            File name    
-----------------------------------------------------------
06/11/2002    2000.81.9001.4  450,560 bytes   Sqloledb.dll
				


Pratik Çözüm

Bu sorunu, aşağıdaki şekillerde çalışabilirsiniz:
  • Hızlı ileri Sar dışında imleç türünü değiştirin.
  • AutoFetch özelliği üzerinde satır ayarlamayın.

Durum

Microsoft, bu makalenin başında listelenen Microsoft ürünlerinde bir sorun olduğunu onaylamıştır. Bu sorun ilk olarak SQL Server 2000 Service Pack 2 ve MDAC 2.6 Service Pack 2'de giderilmiştir.

Daha fazla bilgi

SQL Server 2000, ağ trafiğini en alt düzeyde bir tutarla istemcisine bir küçük resultset döndürme hızlı ve basit bir aracı olarak AutoFetch özelliği ve hızlı ileri imleçler sağlar. Hızlı ileri imleçler salt ileri, salt okunur imleçler en iyi duruma getirilmiş olur. AutoFetch seçeneği de ayarladığınızda, SQL Server, otomatik olarak ilk satırı veya satırları toplu istemciye gönderir ve resultset sonuna ulaşıldığında, imleci kapatır. Bu en iyi duruma getirmeleri resultset istemek ve imleci kapatmak için genellikle gerekli ağ döngüleri kaldırın.

Hızlı ileri imleçler ve AutoFetch seçeneği her ikisi de SQL Server 2000 Çevrimiçi Kitaplar'de belgelenmiştir.

Davranışı yeniden oluşturma adımları

  1. Aşağıdaki örnek kod yeni bir Microsoft Visual C++ konsol uygulamaya kopyalamak ve kodu derleyin. Bu değerler SQL sunucunuz için geçerli değerler başvurmak için veri kaynağı adı, kullanıcı kimliği ve parolasını değiştirmek gerekebilir. Bu kodda, bir tablo aşağıdaki sözdizimini kullanarak pubs veritabanındaki zaten oluşturulmuş varsayılmıştır:
    create table BigVarchar(ID int, BigVar varchar(1000))
    insert into BigVarchar values(1, 'A123')
    					
  2. Kod çalıştırma ve m_ID değişkeni olmasa da m_bigVarchar değişkeni boş olduğuna dikkat edin.

Örnek kod

#define DBINITCONSTANTS

#include "stdafx.h"

#include <stdio.h>
#include <windows.h>
#include <atlbase.h>
#include <iostream>

#include <comdef.h>
#include <oledb.h>
#include <oledberr.h>
#include <sqloledb.h>


#define num_rowProps 24

struct PData
{
	//status and value
	int m_ID_Status;
	int m_ID;
	int m_bigVarchar_Status;
	char m_bigVarchar[1001];
};


int main(int argc, char* argv[])
{


	HRESULT			hr = NULL;
	IUnknown *		pIUnknown = NULL;
	IUnknown*		pISession = NULL;
	IDBInitialize *		pIDBInitialize = NULL;
	IDBProperties*		pIDBProperties = NULL;
	IDBCreateSession*	pIDBCreateSession = NULL;
	IDBCreateCommand*	pIDBCreateCommand = NULL;
	ICommandText*		pICommandText = NULL;
	ICommandProperties*	pICommandProperties;
	IRowset*		pIRowset = NULL;
	DBPROPSET		dbPropSet;
	DBPROP			rowProp[num_rowProps];
	IAccessor*		pIAccessor = NULL;
	HACCESSOR		hAccessor;
	DBBINDING*		rgBindings;
	DBBINDSTATUS*		rgStatus;
	rgBindings		= new DBBINDING[2];

	CLSID			clsid;
	ULONG			i;


//	variables for fetching data
	ULONG				cRows;
	HROW				hRows[1];
	HROW*				rghRows = &hRows[0];
	LONG				cRowsAffected;




	hr = CoInitialize(NULL);

	if( FAILED(hr = CLSIDFromProgID(L"SQLOLEDB", &clsid) ) )
			return 0;

	hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
		IID_IDBInitialize, (void**)&pIDBInitialize);

	const ULONG nProps = 5;
	DBPROP InitProperties[nProps];
	DBPROPSET rgInitPropSet[1];

	for (i = 0; i < nProps; i++)
	{
		VariantInit(&InitProperties[i].vValue);
		InitProperties[i].dwOptions = DBPROPOPTIONS_REQUIRED;
		InitProperties[i].colid = DB_NULLID;
	}

	//level of prompting that will be done to complete the
	//connection process
	InitProperties[0].dwPropertyID = DBPROP_INIT_PROMPT;
	InitProperties[0].vValue.vt = VT_I2;
	InitProperties[0].vValue.iVal = DBPROMPT_NOPROMPT;

	//datasource name
	InitProperties[1].dwPropertyID = DBPROP_INIT_DATASOURCE;
	InitProperties[1].vValue.vt = VT_BSTR;
	InitProperties[1].vValue.bstrVal = SysAllocString(OLESTR("YourServer"));

	//userid
	InitProperties[2].dwPropertyID = DBPROP_AUTH_USERID;
	InitProperties[2].vValue.vt = VT_BSTR;
	InitProperties[2].vValue.bstrVal = SysAllocString(OLESTR("sa"));

	//password
	InitProperties[3].dwPropertyID = DBPROP_AUTH_PASSWORD;
	InitProperties[3].vValue.vt = VT_BSTR;
	InitProperties[3].vValue.bstrVal = SysAllocString(OLESTR(""));

	//database
	InitProperties[4].dwPropertyID = DBPROP_INIT_CATALOG;
	InitProperties[4].vValue.vt = VT_BSTR;
	InitProperties[4].vValue.bstrVal = SysAllocString(OLESTR("Pubs"));


	//assign the property structures to the property set
	rgInitPropSet[0].guidPropertySet = DBPROPSET_DBINIT;
	rgInitPropSet[0].cProperties = nProps;
	rgInitPropSet[0].rgProperties = InitProperties;

	
	//set the properties
	hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties);
	hr = pIDBProperties->SetProperties(1, rgInitPropSet);
	pIDBProperties->Release();

	hr = pIDBInitialize->Initialize();
	if (FAILED(hr))
		return 0;


	// create a session and a command, set the command text
	hr = pIDBInitialize->QueryInterface(IID_IDBCreateSession, (void **)&pIDBCreateSession);
	
	hr = pIDBCreateSession->CreateSession(NULL, IID_IDBCreateCommand, (IUnknown**)&pIDBCreateCommand);

	pIDBCreateSession->Release();

	hr = pIDBCreateCommand->CreateCommand(NULL, IID_ICommandText, (IUnknown**)&pICommandText);
	hr = pICommandText->SetCommandText(DBGUID_DBSQL, L"Select * from pubs..bigvarchar");
	hr = pICommandText->QueryInterface(IID_ICommandProperties, (void **)&pICommandProperties);

	
	// set the command/rowset properties for a Fast Forward cursor
	for (i = 0; i < num_rowProps; i++)
	{
		VariantInit(&rowProp[i].vValue);
		rowProp[i].dwOptions = DBPROPOPTIONS_REQUIRED;
		rowProp[i].colid = DB_NULLID;
	}

	
	static struct
	{
	DBPROPID    m_PropId;
	BOOL    m_Val;
	}    
	crsProps[num_rowProps] =
        {
            {DBPROP_SERVERCURSOR,       true},
            {DBPROP_DEFERRED,           false},
            {DBPROP_IRowsetChange,      false},
            {DBPROP_IRowsetLocate,      false},
            {DBPROP_IRowsetScroll,      false},
            {DBPROP_IRowsetUpdate,      false},
            {DBPROP_BOOKMARKS,          false},
            {DBPROP_CANFETCHBACKWARDS,  false},
            {DBPROP_CANSCROLLBACKWARDS, false},
            {DBPROP_CANHOLDROWS,        false},
            {DBPROP_LITERALBOOKMARKS,   false},
            {DBPROP_OTHERINSERT,        true},
            {DBPROP_OTHERUPDATEDELETE,  true},
            {DBPROP_OWNINSERT,          true},
            {DBPROP_OWNUPDATEDELETE,    true},
            {DBPROP_QUICKRESTART,       false},
            {DBPROP_IRowsetResynch,     false},
            {DBPROP_CHANGEINSERTEDROWS, false},
            {DBPROP_SERVERDATAONINSERT, false},
            {DBPROP_UNIQUEROWS,         false},
            {DBPROP_IMMOBILEROWS,       false},
            {DBPROP_IMultipleResults,   false},
            {DBPROP_ABORTPRESERVE,      true},
            {DBPROP_COMMITPRESERVE,     true}
        };

	
	for (i = 0; i < num_rowProps; i++ )
	{
	VariantInit(&rowProp[i].vValue);
        	rowProp[i].dwOptions = DBPROPOPTIONS_REQUIRED;
        	rowProp[i].colid = DB_NULLID;
        	rowProp[i].dwPropertyID = crsProps[i].m_PropId;
        	rowProp[i].vValue.vt = VT_BOOL;
        	rowProp[i].vValue.boolVal = crsProps[i].m_Val ? VARIANT_TRUE : VARIANT_FALSE;
	}


	dbPropSet.rgProperties       = rowProp;
	dbPropSet.cProperties        = num_rowProps;
	dbPropSet.guidPropertySet    = DBPROPSET_ROWSET;	
	hr = pICommandProperties->SetProperties(1, &dbPropSet);
  
	pICommandProperties->Release();
	pICommandProperties = NULL;


	// set the provider-specific AutoFetch property
	DBPROP            rowProp2[1];
	DBPROPSET         rgPropSet2;
	rgPropSet2.guidPropertySet = DBPROPSET_SQLSERVERROWSET;
	rgPropSet2.cProperties = 1;
	rgPropSet2.rgProperties = rowProp2;

	VariantInit(&rowProp2[0].vValue);
	rowProp2[0].dwOptions = DBPROPOPTIONS_REQUIRED;
	rowProp2[0].colid = DB_NULLID;
	rowProp2[0].dwPropertyID = SSPROP_CURSORAUTOFETCH;
	rowProp2[0].vValue.vt = VT_BOOL;
	rowProp2[0].vValue.boolVal = VARIANT_TRUE;

	hr = pICommandText->QueryInterface(IID_ICommandProperties, (void **)&pICommandProperties);
	hr = pICommandProperties->SetProperties(1, &rgPropSet2);
	pICommandProperties->Release();


	// set up the binding structures for fetching data
	rgBindings = new DBBINDING[2];
	rgStatus = new DBBINDSTATUS[2];

	PData * pdata = new PData;
	memset( pdata, 0, sizeof(PData) );
	
	// binding for ID field
	rgBindings[0].iOrdinal = 1;
	rgBindings[0].pTypeInfo = NULL;
	rgBindings[0].pObject = NULL;
	rgBindings[0].pBindExt = NULL;
	rgBindings[0].dwMemOwner = DBMEMOWNER_CLIENTOWNED;
	rgBindings[0].eParamIO = DBPARAMIO_OUTPUT;
	rgBindings[0].dwFlags = 0;

	rgBindings[0].dwPart = DBPART_VALUE | DBPART_STATUS;
	rgBindings[0].obStatus = offsetof(PData, m_ID_Status);
	rgBindings[0].obLength = 0;
	rgBindings[0].obValue = offsetof(PData, m_ID);
	rgBindings[0].cbMaxLen = 4;
	rgBindings[0].wType = DBTYPE_I8;
	rgBindings[0].bPrecision = 0;
	rgBindings[0].bScale = 0;


	// binding for BigVar field
	rgBindings[1].iOrdinal = 2;
	rgBindings[1].pTypeInfo = NULL;
	rgBindings[1].pObject = NULL;
	rgBindings[1].pBindExt = NULL;
	rgBindings[1].dwMemOwner = DBMEMOWNER_CLIENTOWNED;
	rgBindings[1].eParamIO = DBPARAMIO_OUTPUT;
	rgBindings[1].dwFlags = 0;

	rgBindings[1].dwPart = DBPART_VALUE | DBPART_STATUS;
	rgBindings[1].obStatus = offsetof(PData, m_bigVarchar_Status); 
	rgBindings[1].obLength = 0;
	rgBindings[1].obValue = offsetof(PData, m_bigVarchar);
	rgBindings[1].cbMaxLen = 1001;
	rgBindings[1].wType = DBTYPE_STR;
	rgBindings[1].bPrecision = 0;
	rgBindings[1].bScale = 0;




	// execute the command and create an Accessor
	hr = pICommandText->Execute(NULL,
									IID_IRowset,
									NULL,
									&cRowsAffected,
									(IUnknown**)&pIRowset);


	hr = pIRowset->QueryInterface(IID_IAccessor, (void**)&pIAccessor);
	hr = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA,
									2,
									rgBindings,
									sizeof(PData),
									&hAccessor,
									rgStatus);

	// fetch the data
	hr = pIRowset->GetNextRows(NULL, 0, 1, &cRows, &rghRows);
	hr = pIRowset->GetData(rghRows[0], hAccessor, (void*)pdata);

	printf("Returned HRESULT:  \t%#X\n", hr);
	printf("Returned values:  m_ID = %i, m_bigVarchar = %s\n", pdata->m_ID, pdata->m_bigVarchar);
	printf("\nHit any key to continue...");
	getchar();


	hr = pIRowset->ReleaseRows(1, hRows, NULL, NULL, NULL);


	pIRowset->Release();
	pIAccessor->ReleaseAccessor(hAccessor,NULL);
	pIAccessor->Release();

	pICommandText->Release();


	return 0;
}

				

Özellikler

Makale numarası: 303446 - Last Review: 24 Şubat 2014 Pazartesi - Gözden geçirme: 7.3
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Data Access Components 2.7
  • Microsoft Data Access Components 2.6
  • Microsoft Data Access Components 2.6 Service Pack 1
  • Microsoft SQL Server 2000 Standard Edition
Anahtar Kelimeler: 
kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbsqlserv2000sp3fix kbbug kbfix kbmdac260fix kbmdac260sp2fix kbsqlserv2000presp2fix kbsqlserv2000presp3fix KB303446 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:303446

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com