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