Makale numarası: 241639 - Son Gözden Geçirme: 12 Mayıs 2003 Pazartesi - Gözden geçirme: 2.1

SORUN: Çağrılırken "Hatası oluştu" hata içeren bir SELECT deyimi'den fazla saklı yordamı

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Belirtiler

Ne zaman bir Microsoft SQL Server'ı çalıştırmak için ICommand::Execute arama Microsoft SQL Server OLE DB Provider, DB_E_ERRORSOCCURRED döndürülen yordamını kullanarak IErrorInfo açıklama bilgi depolanan "Hatası oluştu." belirtir.

Neden

En çok basit bir SELECT deyimi, saklı yordam içerir. Bir istemci tarafı imleci gereklidir.

Çözüm

Bu sorunu gidermek için istemci yanı imleçler kullanmanız gerekir. Istemci yanı imleçler kullanmanın iki yolu vardır:
  • Bir iletme yalnızca, okuma yalnızca istemci imleci için satır özelliklerini DBPROP_UPDATABILITY ve DBPROP_IRowsetChange ayarlamayın.
  • Güncelleştirilebilir bir istemci tarafı imleç kullanın.

Durum

(Microsoft daha aydınlatıcı bir hata iletisi döndürdü olup olmadığını araştırmaktadır olsa da), bu davranış tasarım gereğidir.

Daha fazla bilgi

Işte bir örnek saklı yordamın ne gibi görünebilir:
CREATE  procedure sp_Test
AS
    DECLARE @var int
    SET  @var = 1
    SELECT * FROM authors
				

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

Hata yeniden oluşturmak için <a0></a0>, bu örnek, depolanan yordamı oluşturun ve sonra aşağıdaki kodu çalıştırın:
#include <atldbcli.h>

class CTestAccessor
{
public:
	LONG m_RETURNVALUE;

BEGIN_PARAM_MAP(CTestAccessor)
	SET_PARAM_TYPE(DBPARAMIO_OUTPUT)
	COLUMN_ENTRY(1, m_RETURNVALUE)
END_PARAM_MAP()

DEFINE_COMMAND(CTestAccessor, _T("{ ? = CALL dbo.sp_Test}"))


};

class CTestCmd : public CCommand<CAccessor<CTestAccessor> >
{
public:
	HRESULT Open()
	{
		HRESULT		hr;

		hr = OpenDataSource();
		if (FAILED(hr))
			return hr;

		return OpenRowset();
	}
	HRESULT OpenDataSource()
	{
		HRESULT		hr;
		CDataSource db;
		CDBPropSet	dbinit(DBPROPSET_DBINIT);

		dbinit.AddProperty(DBPROP_AUTH_USERID, OLESTR("sa"));
		dbinit.AddProperty(DBPROP_INIT_CATALOG, OLESTR("pubs"));
		//change the name of SQL server to fit your environment
                dbinit.AddProperty(DBPROP_INIT_DATASOURCE, OLESTR("localhost"));
                dbinit.AddProperty(DBPROP_INIT_LCID, (long)1033);
		dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
		
		//Use this line if you want to use a forward only, read only client side cursor
		hr = db.Open(_T("SQLOLEDB.1"), &dbinit);
		
		//Use this line if you want to use an updateable client side cursor 
		//hr = db.OpenWithServiceComponents(_T("SQLOLEDB.1"), &dbinit); 
		
		if (FAILED(hr))
			return hr;

		return m_session.Open(db);
	}
	HRESULT OpenRowset()
	{
		// Set properties for open
		CDBPropSet	propset(DBPROPSET_ROWSET);
		
		//Remove the following properties to prevent the error with a forward only, read only client side cursor
		//Set them if you want an updateable client side cursor
		propset.AddProperty(DBPROP_IRowsetChange, true);
		propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
		
		//Set this property if you want to use an updateable client side cursor
		//propset.AddProperty(DBPROP_CLIENTCURSOR, true);

		return CCommand<CAccessor<CTestAccessor> >::Open(m_session, NULL, &propset);
	}
	CSession	m_session;
};

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

	CTestCmd rs;
	HRESULT hr=rs.Open();
	if (FAILED(hr))
            AtlTraceErrorRecords();

	rs.Close();

	return 0;
}
				

Referanslar

SQL Server Books Online'da "Satır kümeleri ve SQL Server imleçler" daha fazla bilgi için konusuna bakın.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.6
  • Microsoft Data Access Components 2.7
Anahtar Kelimeler: 
kbmt kbconsumer kbdatabase kbprb kbprovider KB241639 KbMttr
Otomatik TercümeOtomatik Tercüme
Ö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:241639  (http://support.microsoft.com/kb/241639/en-us/ )