Fields コレクション

適用先: Access 2013、Office 2013

Fields コレクションは、ADO に組み込まれたコレクションの 1 つです。 コレクションは、並べ替えられた項目のセットで、単位と呼ばれることもあります。

Fields コレクションには、 Recordset 内の各フィールド (列) に対応する Field オブジェクトが含まれています。 すべての ADO コレクションと同様に、 Append メソッドおよび Refresh メソッド以外に、 Count プロパティおよび Item プロパティも使用できます。 他の ADO コレクションでは使用できない、CancelUpdateDeleteResync、および Update の各メソッドも使用できます。

Fields コレクションを検査する

この章で説明したサンプル RecordsetFields コレクションについて考えてみましょう。 サンプル Recordset は、SQL ステートメントから導出されました。

 
SELECT ProductID, ProductName, UnitPrice FROM Products WHERE CategoryID = 7 

したがって、 RecordsetFields コレクションには 3 つのフィールドが含まれていることがわかります。

 
'BeginWalkFields 
 Dim objFields As ADODB.Fields 
 
 objRs.Open strSQL, strConnStr, adOpenForwardOnly, adLockReadOnly, adCmdText 
 
 Set objFields = objRs.Fields 
 
 For intLoop = 0 To (objFields.Count - 1) 
 Debug.Print objFields.Item(intLoop).Name 
 Next 
'EndWalkFields 

このコードでは、単に Count プロパティを使用して Fields コレクション内の Field オブジェクトの数を調べ、コレクション内をループし、 Field オブジェクトごとに Name プロパティの値を返します。 さらに多くの Field プロパティを使用すると、フィールドに関する情報を取得できます。 Field の照会の詳細については、「Field オブジェクト」を参照してください。

列をカウントする

Count プロパティは、名前のとおり、 Fields コレクション内にある Field オブジェクトの実際の数を返します。 コレクションのメンバーの番号はゼロから始まるため、常にゼロ番のメンバーからループを開始し、 Count プロパティの値から 1 を引いた値で終了するようにコードを記述する必要があります。 Microsoft Visual Basic を使用していて、 Count プロパティを確認せずにコレクションのメンバーをループする場合は、 ForEach..を使用します。次の コマンド。

Count プロパティがゼロの場合、コレクション内にはオブジェクトはありません。

Field にアクセスする

ADO コレクションと同様に、 Item プロパティはコレクションの既定のプロパティです。 このプロパティは、渡された名前またはインデックスで指定された個別の Field オブジェクトを返します。 したがって、次のステートメントは、サンプル Recordset と同じになります。

 
objField = objRecordset.Fields.Item("ProductID") 
objField = objRecordset.Fields("ProductID") 
objField = objRecordset.Fields.Item(0) 
objField = objRecordset.Fields(0) 

これらのメソッドが同等の場合、どのメソッドが最適でしょうか。 それは、時と場合によります。 インデックスを使用してコレクションから Field を取得する方が、文字列検索を実行しなくても Field に直接アクセスできるため、高速です。 一方、コレクション内の Fields の順序を把握しておく必要があり、順序が変わった場合、常に Field のインデックスへの参照を変更する必要があります。 若干遅くなりますが、Field の名前を使用する方が、コレクション内の Fields の順序に依存しないため、柔軟性があります。

Refresh メソッドを使用する

他の ADO コレクションとは異なり、Fields コレクションで Refresh メソッドを使用しても、目に見える効果はありません。 基になるデータベース構造から変更を取得するには、 Requery メソッドを使用するか、 Recordset オブジェクトがブックマークをサポートしていない場合は MoveFirst メソッドを使用する必要があります。これにより、コマンドがプロバイダーに対して再度実行されます。

Recordset にフィールドを追加する

Append メソッドは、 Recordset にフィールドを追加するために使用されます。

Append メソッドを使用すると、データ ソースへの接続を開かなくても、 Recordset をプログラムによって製造できます。 開いている Recordset 、または ActiveConnection プロパティが設定されている RecordsetFields コレクションで Append メソッドを呼び出すと、実行時エラーが発生します。 フィールドを追加できるのは、開いていない状態で、データ ソースにも接続されていない Recordset のみです。 ただし、新しく追加された Fields に値を指定するには、 Recordset をまず開く必要があります。

開発者は、データを一時的に保存する場所を必要とすることや、データをサーバーから発生したかのように処理して、ユーザー インターフェイスのデータ バインドに参加できるようにすることがあります。 ADO と Microsoft Cursor Service for OLE DB を組み合わせて使用すると、開発者は、列情報を指定して Open を呼び出すことにより、空の Recordset オブジェクトを作成できます。 次の例では、新しい Recordset オブジェクトに 3 つの新規フィールドが追加されます。 次に Recordset が開かれ、2 つの新規レコードが追加され、 Recordset がファイルに保存されます。 Recordset の保存の詳細については、「 5 章: データを更新し、保存する」を参照してください。

 
 'BeginFabricate 
 Dim objRs As New ADODB.Recordset 
 
 With objRs.Fields 
 .Append "StudentID", adChar, 11, adFldUpdatable 
 .Append "FullName", adVarChar, 50, adFldUpdatable 
 .Append "PhoneNmbr", adVarChar, 20, adFldUpdatable 
 End With 
 
 With objRs 
 .Open 
 
 .AddNew 
 .Fields(0) = "123-45-6789" 
 .Fields(1) = "John Doe" 
 .Fields(2) = "(425) 555-5555" 
 .Update 
 
 .AddNew 
 .Fields(0) = "123-45-6780" 
 .Fields(1) = "Jane Doe" 
 .Fields(2) = "(615) 555-1212" 
 .Update 
 End With 
 
 objRs.Save App.Path & "\FabriTest.adtg", adPersistADTG 
 
 objRs.Close 
 'EndFabricate 

FieldsAppend メソッドの使用方法は、Recordset オブジェクトと Record オブジェクトによって異なります。 Record オブジェクトの詳細については、「 10 章: レコードとストリーム」を参照してください。