Esempio n. 1
0
/*****************************************************************************
 * SELECT系のクエリを実行します。
 * SELECTの結果はDbSqlCeDataReaderクラスを実行して取得してください。
 *****************************************************************************/
DbSqlCeDataReader* DbSqlCeClient::exetute_select(const TCHAR *query)
{
	HRESULT hr;
	LONG lRows = 0;
	IRowsetPosition *pRowsetPos = NULL;
	ICommandProperties *pICmdProps = NULL;
	DBPROPSET dbPropSet[1] = {0};
	DBPROP    dbProps[1] = {0};

	try{
		// クエリ設定
		hr = m_pCmdtext->SetCommandText( DBGUID_DBSQL, query );
		if( FAILED( hr ) )		throw(-1);

		hr = m_pCmdtext->QueryInterface(IID_ICommandProperties, (void**) &pICmdProps);
		if( FAILED( hr ) )		throw(-1);

		dbProps[0].dwPropertyID   = DBPROP_CANFETCHBACKWARDS;
		dbProps[0].dwOptions      = DBPROPOPTIONS_REQUIRED;
		dbProps[0].vValue.vt      = VT_BOOL;
		dbProps[0].vValue.boolVal = VARIANT_TRUE;

		dbPropSet[0].cProperties = 1;
		dbPropSet[0].rgProperties = dbProps;
		dbPropSet[0].guidPropertySet = DBPROPSET_ROWSET;

		hr = pICmdProps->SetProperties(ARRAYSIZE(dbPropSet), dbPropSet);
		if( FAILED( hr ) ){
			throw(-1);
		}
		else{
			pICmdProps->Release();
			pICmdProps = NULL;
		}

		// クエリ実行
		hr = m_pCmdtext->Execute( NULL, IID_IRowsetPosition, NULL, NULL, (IUnknown**)&pRowsetPos );
		if( FAILED( hr ) )		throw(-2);


		// リーダー作成。
		m_pReader = new DbSqlCeDataReader( pRowsetPos );
		if( NULL == m_pReader )	throw(-3);

		// 初期化が正常終了したか確認します。
		if( false == m_pReader->m_IsInit ){
			throw(-4);
		}
	}
	catch(...){
        if( m_pReader ){
            delete m_pReader;
            m_pReader = NULL;
        }
		if( pICmdProps )	pICmdProps->Release();
		if( pRowsetPos )	pRowsetPos->Release();

		return NULL;
	}
	

	return m_pReader;
}