その他ミリネジとインチネジ
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
参考情報
|