その他

ミリネジとインチネジ

Visual C++ 関連情報

ADOレコードセットを配列として使う方法

#code c++

#include <afx.h>
#include <comdef.h>
#import "C:\Program Files\Common Files\System\Ado\msado15.dll" rename("EOF", "adoEOF")
using namespace ADODB;	// 名前空間
#include <afxdisp.h>	// COleSafeArray
#include <afxtempl.h>	// CArray
typedef CArray< _variant_t, _variant_t& > CVariantArray;

class CSafeVariantArray : public CVariantArray { public:

	operator LPVARIANT()
	{
		VariantArrayToSafeArray();
		return (LPVARIANT)m_sa;
	}

private:

	void VariantArrayToSafeArray()
	{
		COleSafeArray sa;
		int nSize = GetSize();
		sa.CreateOneDim( VT_VARIANT, nSize );
		for ( int i = 0; i < nSize; i++ )
		{
			long lArrayIndex = (long)i;
			_variant_t vValue = GetAt(i);
			sa.PutElement( &lArrayIndex, &vValue );
		}
		m_sa = sa;
		return;
	}
	COleSafeArray	m_sa;

};

/* Sub FieldsAppendTest

   Dim rsTmp
   Set rsTmp = CreateObject("ADODB.Recordset")
   
   With rsTmp.Fields
       .Append "Field1", adVarChar, 80, adFldIsNullable
       .Append "Field2", adVarChar, 80, adFldIsNullable
   End With
   
   rsTmp.Open
   Dim vFieldList
   vFieldList = Array( "Field1", "Field2" )
   Dim vValues
   vValues = Array( "aaa", "bbb" )
   rsTmp.AddNew vFieldList, vValues
   
   vValues = Array( "CCC", "DDD" )
   rsTmp.AddNew vFieldList, vValues
   
   rsTmp.MoveFirst
   
   Dim fld
   Dim strLine
   Dim strName
   strLine = ""
   For Each fld In rsTmp.Fields
       strName = fld.Name
       strLine = strLine & strName & vbTab
   Next
   WScript.Echo strLine
   
   Dim strValue
   While Not rsTmp.BOF And Not rsTmp.EOF
       strLine = ""
       For Each fld In rsTmp.Fields
           strValue = fld.Value
           strLine = strLine & "[" & strValue & "]" & vbTab
       Next
       WScript.Echo strLine
       rsTmp.MoveNext
   Wend

End Sub

/

void FieldsAppendTest() {

	try
	{
		CoInitialize(NULL);
		ADODB::_RecordsetPtr rs;  // Recordsetオブジェクト
		// ADOオブジェクトの生成
		rs.CreateInstance( __uuidof(ADODB::Recordset) );
		rs->Fields->Append( L"Field1", adVarChar, 80, adFldIsNullable );
		rs->Fields->Append( L"Field2", adVarChar, 80, adFldIsNullable );
		rs->Open( vtMissing, vtMissing, adOpenForwardOnly, adLockOptimistic, adCmdUnknown );
		// テーブルのフィールドリスト用の配列を作成します
		CSafeVariantArray vaFieldList;
		vaFieldList.Add( _variant_t( L"Field1" ) );
		vaFieldList.Add( _variant_t( L"Field2" ) );
		CSafeVariantArray vaValues;
		vaValues.Add( _variant_t( L"aaa" ) );
		vaValues.Add( _variant_t( L"bbb" ) );
		// 1レコード目
		rs->AddNew( (LPVARIANT)vaFieldList, (LPVARIANT)vaValues );
		vaValues.RemoveAll();
		vaValues.Add( _variant_t( L"CCC" ) );
		vaValues.Add( _variant_t( L"DDD" ) );
		// 2レコード目
		rs->AddNew( (LPVARIANT)vaFieldList, (LPVARIANT)vaValues );
		rs->MoveFirst();
		long i = 0;
		long nFields = rs->GetFields()->GetCount();
		// 項目名
		for ( i = 0; i < nFields; i++ )
		{
			_bstr_t vName;
			_variant_t vValue;
			vName  = rs->GetFields()->GetItem(i)->GetName();
			_tprintf( _T("%s\t"), (LPCTSTR)vName );
		}
		_tprintf( _T("\n") );
		_tprintf( _T("-------------------------------------------------\n") );
		// レコード表示
		while ( !rs->GetBOF() && !rs->GetadoEOF() )
		{
			for ( i = 0; i < nFields; i++ )
			{
				_variant_t vValue;
				vValue = rs->GetFields()->GetItem(i)->GetValue();
				_tprintf( _T("[%s]\t"), (LPCTSTR)(_bstr_t)vValue );
			}
			_tprintf( _T("\n") );
			rs->MoveNext();
		}
		rs->Close();
	}
	catch ( _com_error& e )
	{
		_tprintf( _T("e.Description = [%s]\n"), (LPCTSTR)e.Description() );
		return;
	}
	catch ( ... )
	{
		_tprintf( _T("Fatal Error!\n") );
		return;
	}
	CoUninitialize();

}

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

	FieldsAppendTest();
	return 0;

}

#end

  • 文字列の配列として COleSafeArray を使うのが味噌らしい。

参考情報


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-27 (土) 14:18:56 (5166d)