COleSafeArray クラス

任意の型および次元の配列を扱うクラスです。

構文

class COleSafeArray : public tagVARIANT

メンバー

パブリック コンストラクター

名前 説明
COleセーフArray::COleセーフArray COleSafeArray オブジェクトを構築します。

パブリック メソッド

名前 説明
COleセーフArray::AccessData 配列データへのポインターを取得します。
COleセーフArray::AllocData 配列のメモリを割り当てます。
COleセーフArray::AllocDescriptor セーフ配列記述子のメモリを割り当てます。
COleセーフArray::Attach オブジェクトに既存 VARIANT の配列 COleSafeArray を制御します。
COleセーフArray::Clear 基になる VARIANTデータをすべて解放します。
COleセーフArray::Copy 既存の配列のコピーを作成します。
COleセーフArray::Create 安全な配列を作成します。
COleセーフArray::CreateOneDim 1 次元 COleSafeArray オブジェクトを作成します。
COleセーフArray::D estroy 既存の配列を破棄します。
COleセーフArray::D estroyData セーフ配列内のデータを破棄します。
COleセーフArray::D estroyDescriptor セーフ配列の記述子を破棄します。
COleセーフArray::D etach オブジェクトから VARIANT 配列を COleSafeArray デタッチします (データが解放されないようにします)。
COleセーフArray::GetByteArray セーフ配列の内容を CByteArrayコピーします。
COleセーフArray::GetDim 配列内の次元数を返します。
COleセーフArray::GetElement セーフ配列の 1 つの要素を取得します。
COleセーフArray::GetElemSize セーフ配列内の 1 つの要素のサイズをバイト単位で返します。
COleセーフArray::GetLBound セーフ配列の次元の下限を返します。
COleセーフArray::GetOneDimSize 1 次元 COleSafeArray オブジェクト内の要素の数を返します。
COleセーフArray::GetUBound セーフ配列の次元の上限を返します。
COleセーフArray::Lock 配列のロックカウントをインクリメントし、配列記述子内の配列データへのポインターを配置します。
COleセーフArray::P trOfIndex インデックス付き要素へのポインターを返します。
COleセーフArray::P utElement 1 つの要素を配列に割り当てます。
COleセーフArray::Redim セーフ配列の最下位 (右端) の境界を変更します。
COleセーフArray::ResizeOneDim 1 次元 COleSafeArray オブジェクト内の要素の数を変更します。
COleセーフArray::UnaccessData 配列のロック数をデクリメントし、によって AccessData取得されたポインターを無効にします。
COleセーフArray::Unlock 解放またはサイズ変更できるように、配列のロック数をデクリメントします。

パブリック演算子

名前 説明
COleセーフArray::operator LPCVARIANT オブジェクトの基になる VARIANT 構造体に COleSafeArray アクセスします。
COleセーフArray::operator LPVARIANT オブジェクトの基になる VARIANT 構造体に COleSafeArray アクセスします。
COleセーフArray::operator = COleSafeArrayをオブジェクト (SAFEARRAYVARIANTCOleVariantまたはCOleSafeArray配列) にコピーします。
COleセーフArray::operator == 2 つのバリアント配列 (SAFEARRAY、、、VARIANTCOleVariantまたはCOleSafeArray配列) を比較します。
COleSafeArray::operator << オブジェクトの内容を COleSafeArray ダンプ コンテキストに出力します。

解説

COleSafeArray は OLE VARIANT 構造体から派生します。 OLE SAFEARRAY メンバー関数は、バイトの 1 次元配列用に特別に設計されたメンバー関数のセットと同様に使用できます COleSafeArray

継承階層

tagVARIANT

COleSafeArray

要件

ヘッダー : afxdisp.h

COleセーフArray::AccessData

配列データへのポインターを取得します。

void AccessData(void** ppvData);

パラメーター

ppvData
配列データへのポインターへのポインター。

解説

エラーが発生すると、関数は CMemoryException または COleException をスローします。

void CMainFrame::Sort(VARIANT* vArray)
{
   COleSafeArray sa;
   BSTR* pbstr;
   TCHAR buf[1024];
   LONG cElements, lLBound, lUBound;

   //needed for OLE2T macro below, include afxpriv.h
   USES_CONVERSION;

   // Type check VARIANT parameter. It should contain a BSTR array
   // passed by reference. The array must be passed by reference it is
   // an in-out-parameter.
   if (V_VT(vArray) != (VT_ARRAY | VT_BSTR))
   {
      AfxThrowOleDispatchException(1001,
         _T("Type Mismatch in Parameter. Pass a string array by reference"));
   }

   // clears data in sa and copies the variant data into sa
   sa.Attach(*vArray);

   // Check that array is 1 dimensional
   if (sa.GetDim() != 1)
   {
      AfxThrowOleDispatchException(1002,
         _T("Type Mismatch in Parameter. Pass a one-dimensional array"));
   }

   try
   {
      // Get array bounds.
      sa.GetLBound(1, &lLBound);
      sa.GetUBound(1, &lUBound);

      // Get a pointer to the elements of the array
      // and increments the lock count on the array
      sa.AccessData((LPVOID*)& pbstr);

      //get no. of elements in array
      cElements = lUBound - lLBound + 1;
      for (int i = 0; i < cElements; i++)
      {
         //output the elements of the array
         _stprintf_s(buf, 1024, _T("[%s]\n"), OLE2T(pbstr[i]));
         OutputDebugString(buf);
      }

      //decrement lock count
      sa.UnaccessData();
   }
   catch (COleException* pEx)
   {
      AfxThrowOleDispatchException(1003,
         _T("Unexpected Failure in FastSort method"));
      pEx->Delete();
   }
}

COleセーフArray::AllocData

セーフ配列のメモリを割り当てます。

void AllocData();

解説

エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleセーフArray::AllocDescriptor

セーフ配列の記述子にメモリを割り当てます。

void AllocDescriptor(DWORD dwDims);

パラメーター

dwDims
セーフ配列内の次元の数。

解説

エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleセーフArray::Attach

既存 VARIANT の配列内のデータをオブジェクトに COleSafeArray 制御します。

void Attach(VARIANT& varSrc);

パラメーター

varSrc
VARIANT オブジェクト。 varSrc パラメーターには VARTYPE VT_ARRAYが必要です

解説

ソース VARIANTの型はVT_EMPTYに設定されます。 この関数は、現在の配列データ (存在する場合) をクリアします。

COleセーフArray::AccessData の例を参照してください。

COleセーフArray::Clear

セーフ配列をクリアします。

void Clear();

解説

この関数は、オブジェクトの値をVT_EMPTYに設定 VARTYPE することで、安全な配列をクリアします。 現在の内容が解放され、配列が解放されます。

COleセーフArray::COleセーフArray

COleSafeArray オブジェクトを構築します。

COleSafeArray();

COleSafeArray(
    const SAFEARRAY& saSrc,
    VARTYPE vtSrc);

COleSafeArray(
    LPCSAFEARRAY pSrc,
    VARTYPE vtSrc);

COleSafeArray(const COleSafeArray& saSrc);
COleSafeArray(const VARIANT& varSrc);
COleSafeArray(LPCVARIANT pSrc);
COleSafeArray(const COleVariant& varSrc);

パラメーター

saSrc
既存 COleSafeArray のオブジェクト、または SAFEARRAY 新しい COleSafeArray オブジェクトにコピーするオブジェクト。

vtSrc
新しい COleSafeArray オブジェクトの VARTYPE。

psaSrc
新しいCOleSafeArrayオブジェクトにコピーする a SAFEARRAY へのポインター。

varSrc
新しい COleSafeArray オブジェクトにコピーする既存の VARIANT または COleVariant オブジェクト。

pSrc
新しいCOleSafeArrayオブジェクトにVARIANTコピーするオブジェクトへのポインター。

解説

これらのコンストラクターはすべて、新しい COleSafeArray オブジェクトを作成します。 パラメーターがない場合は、空 COleSafeArray のオブジェクトが作成されます (VT_EMPTY)。 COleSafeArray VARTYPE が暗黙的に認識されている別の配列 (aCOleSafeArrayCOleVariantまたはVARIANT) からコピーされた場合、ソース配列の VARTYPE は保持され、指定する必要はありません。 COleSafeArray VARTYPE が不明SAFEARRAYな () 別の配列からコピーされる場合は、vtSrc パラメーターに VARTYPE を指定する必要があります。

エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleセーフArray::Copy

既存のセーフ配列のコピーを作成します。

void Copy(LPSAFEARRAY* ppsa);

パラメーター

ppsa
新しい配列記述子を返す場所へのポインター。

解説

エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleセーフArray::Create

配列のデータを割り当てて初期化します。

void Create(
    VARTYPE vtSrc,
    DWORD dwDims,
    DWORD* rgElements);

void Create(
    VARTYPE vtSrc,
    DWORD dwDims,
    SAFEARRAYBOUND* rgsabounds);

パラメーター

vtSrc
配列の基本型 (つまり、配列の各要素の VARTYPE)。 VARTYPE は、バリアント型のサブセットに制限されます。 VT_ARRAYもVT_BYREFフラグも設定できません。 VT_EMPTYとVT_NULLは、配列の有効な基本型ではありません。 その他の種類はすべて有効です。

dwDims
配列内の次元の数。 これは、Redim を使用して配列を作成した後で変更できます。

rgElements
配列内の各次元の要素数の配列へのポインター。

rgsabounds
配列に割り当てる境界のベクトル (次元ごとに 1 つ) へのポインター。

解説

この関数は、必要に応じて現在の配列データをクリアします。 エラーが発生すると、関数は CMemoryException をスロー します

COleSafeArray saMatrix;
DWORD numElements[] = { 10, 5 };

// creates a 2 dimensional safearray of type VT_I2 
// with size 10x5 elements, with all indices starting at 0(default)
saMatrix.Create(VT_I2, 2, numElements);

ASSERT(saMatrix.GetDim() == 2);

COleSafeArray saVector;
SAFEARRAYBOUND rgsabounds[] = { {5, 2} };

// creates a 1 dimensional safearray of type VT_I1 
// with size 5 elements, with the index starting at 2
saVector.Create(VT_I1, 1, rgsabounds);

ASSERT(saVector.GetDim() == 1);

COleセーフArray::CreateOneDim

新しい 1 次元 COleSafeArray オブジェクトを作成します。

void CreateOneDim(
    VARTYPE vtSrc,
    DWORD dwElements,
    const void* pvSrcData = NULL,
    long nLBound = 0);

パラメーター

vtSrc
配列の基本型 (つまり、配列の各要素の VARTYPE)。

dwElements
配列内の要素の数。 これは、ResizeOneDim を使用して配列を作成した後で変更できます。

pvSrcData
配列にコピーするデータへのポインター。

nLBound
配列の下限。

解説

ポインター pvSrcData が NULL でない場合、この関数は配列のデータを割り当てて初期化し、指定されたデータをコピーします。

エラーが発生すると、関数は CMemoryException をスロー します

VARIANT varColInfo[3];

//initialize VARIANTs
for (int i = 0; i < 3; i++)
   VariantInit(&varColInfo[i]);

// Column Name
varColInfo[0].vt = VT_BSTR;
varColInfo[0].bstrVal = ::SysAllocString(L"Name");

// Column Type
varColInfo[1].vt = VT_UI4;
varColInfo[1].lVal = 1;

COleSafeArray sa;
//create a 1 dimensional safearray of VARIANTs
//& initialize it with varColInfo VARIANT array
sa.CreateOneDim(VT_VARIANT, 2, varColInfo);

//check that the dimension is 2
ASSERT(sa.GetOneDimSize() == 2);

//increase safearray size by 1
sa.ResizeOneDim(3);

// populate the last element of the safearray, (Column Size)
varColInfo[2].vt = VT_I4;
varColInfo[2].lVal = 30;
long el = 2;
sa.PutElement(&el, &varColInfo[2]);

COleセーフArray::D estroy

既存の配列記述子と配列内のすべてのデータを破棄します。

void Destroy();

解説

オブジェクトが配列に格納されている場合、各オブジェクトは解放されます。 エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleセーフArray::D estroyData

セーフ配列内のすべてのデータを破棄します。

void DestroyData();

解説

オブジェクトが配列に格納されている場合、各オブジェクトは解放されます。 エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleセーフArray::D estroyDescriptor

セーフ配列の記述子を破棄します。

void DestroyDescriptor();

解説

エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleセーフArray::D etach

オブジェクトからデータをVARIANTCOleSafeArrayデタッチします。

VARIANT Detach();

戻り値

オブジェクト内のCOleSafeArray基になるVARIANT値。

解説

この関数は、オブジェクトの VARTYPE を VT_EMPTYに設定することで、セーフ配列内のデータをデタッチします。 Windows 関数 VariantClear を呼び出して配列を解放するのは呼び出し元の責任です

エラーが発生すると、関数は COleException を スローします

COleセーフArray::P utElement の例を参照してください。

COleセーフArray::GetByteArray

セーフ配列 CByteArrayの内容をコピーします。

void GetByteArray(CByteArray& bytes);

パラメーター

bytes
CByteArray オブジェクトへの参照。

COleセーフArray::GetDim

オブジェクト内の寸法の数を COleSafeArray 返します。

DWORD GetDim();

戻り値

セーフ配列内の次元の数。

COleSafeArray saMatrix;
DWORD numElements[] = { 10, 5 };

// creates a 2 dimensional safearray of type VT_I2 
// with size 10x5 elements, with all indices starting at 0(default)
saMatrix.Create(VT_I2, 2, numElements);

ASSERT(saMatrix.GetDim() == 2);

COleSafeArray saVector;
SAFEARRAYBOUND rgsabounds[] = { {5, 2} };

// creates a 1 dimensional safearray of type VT_I1 
// with size 5 elements, with the index starting at 2
saVector.Create(VT_I1, 1, rgsabounds);

ASSERT(saVector.GetDim() == 1);

COleセーフArray::GetElement

セーフ配列の 1 つの要素を取得します。

void GetElement(
    long* rgIndices,
    void* pvData);

パラメーター

rgIndices
インデックスの配列へのポインター (配列の次元ごと)。

pvData
配列の要素を配置する場所へのポインター。

解説

この関数は、要素を取得する前とSafeArrayUnlock後に、Windows 関数SafeArrayLockを自動的に呼び出します。 データ要素が文字列、オブジェクト、またはバリアントの場合、関数は正しい方法で要素をコピーします。 パラメーター pvData は、要素を格納するのに十分な大きさのバッファーを指す必要があります。

エラーが発生すると、関数は CMemoryException または COleException をスローします。

//sa is of type COleSafeArray with 2 dimensions

//Determine upper bounds for both dimensions
long lNumRows;
long lNumCols;
sa.GetUBound(1, &lNumRows);
sa.GetUBound(2, &lNumCols);

//Display the elements in the SAFEARRAY.
long index[2];
VARIANT val;

//Determine lower bounds for both dimensions
long lowRow, lowCol;
sa.GetLBound(1, &lowRow);
sa.GetLBound(2, &lowCol);

for (long r = lowRow; r <= lNumRows; r++)
{
   for (long c = lowCol; c <= lNumCols; c++)
   {
      index[0] = r;
      index[1] = c;

      //retrieve each element of the safearray
      sa.GetElement(index, &val);

      switch (val.vt)
      {
      case VT_R8:
         TRACE(_T("%1.2f\n"), val.dblVal);
         break;

      case VT_BSTR:
         TRACE(_T("%s\n"), (CString)val.bstrVal);
         break;

         // other cases omitted

      case VT_EMPTY:
         TRACE(_T("<empty>\n"));
         break;
      }
   }
}

COleセーフArray::GetElemSize

オブジェクト内の要素のサイズを COleSafeArray 取得します。

DWORD GetElemSize();

戻り値

セーフ配列の要素のサイズ (バイト単位)。

COleセーフArray::GetLBound

オブジェクトの次元の下限を COleSafeArray 返します。

void GetLBound(
    DWORD dwDim,
    long* pLBound);

パラメーター

dwDim
下限を取得する対象の配列の次元。

pLBound
下限を返す場所へのポインター。

解説

エラーが発生すると、関数は COleException を スローします

COleSafeArray saMatrix;
DWORD numElements[] = { 10, 5 };

// creates a 2 dimensional safearray of type VT_I2 
// with size 10x5 elements, with all indices starting at 0(default)
saMatrix.Create(VT_I2, 2, numElements);

long lLBound;

//get lower bound for 1st dimension
saMatrix.GetLBound(1, &lLBound);

ASSERT(lLBound == 0);

//get lower for 2nd dimension
saMatrix.GetLBound(2, &lLBound);

ASSERT(lLBound == 0);

COleSafeArray saVector;
SAFEARRAYBOUND rgsabounds[] = { {5, 1} };

// creates a 1 dimensional safearray of type VT_I1 
// with size 5 elements, with the index starting at 1
saVector.Create(VT_I1, 1, rgsabounds);

//get lower bound for 1st dimension
saVector.GetLBound(1, &lLBound);

ASSERT(lLBound == 1);

COleセーフArray::GetOneDimSize

1 次元 COleSafeArray オブジェクト内の要素の数を返します。

DWORD GetOneDimSize();

戻り値

1 次元セーフ配列内の要素の数。

COleセーフArray::CreateOneDim の例を参照してください。

COleセーフArray::GetUBound

セーフ配列の次元の上限を返します。

void GetUBound(
    DWORD dwDim,
    long* pUBound);

パラメーター

dwDim
上限を取得する対象の配列の次元。

pUBound
上限を返す場所へのポインター。

解説

エラーが発生すると、関数は COleException を スローします

COleSafeArray saMatrix;
DWORD numElements[] = { 10, 5 };

// creates a 2 dimensional safearray of type VT_I2 
// with size 10x5 elements, with all indices starting at 0(default)
saMatrix.Create(VT_I2, 2, numElements);

long lUBound;
ASSERT(saMatrix.GetDim() == 2);

//get upper bound for 1st dimension
saMatrix.GetUBound(1, &lUBound);

ASSERT(lUBound == 9);

//get upper bound for 2nd dimension
saMatrix.GetUBound(2, &lUBound);

ASSERT(lUBound == 4);

COleSafeArray saVector;
SAFEARRAYBOUND rgsabounds[] = { {5, 1} };

// creates a 1 dimensional safearray of type VT_I1 
// with size 5 elements, with the index starting at 1
saVector.Create(VT_I1, 1, rgsabounds);

//get upper bound for 1st dimension
saVector.GetUBound(1, &lUBound);

ASSERT(lUBound == 5);

COleセーフArray::Lock

配列のロックカウントをインクリメントし、配列記述子内の配列データへのポインターを配置します。

void Lock();

解説

エラーが発生すると、COleException がスロー されます

配列記述子内のポインターは、呼び出されるまで Unlock 有効です。 呼び出しは Lock 入れ子にすることができます。同じ数の呼び出し Unlock が必要です。

ロックされている間は、配列を削除できません。

COleセーフArray::operator LPCVARIANT

この COleSafeArray オブジェクトの基になる VARIANT 構造体にアクセスするには、このキャスト演算子を呼び出します。

operator LPCVARIANT() const;

COleセーフArray::operator LPVARIANT

この COleSafeArray オブジェクトの基になる VARIANT 構造体にアクセスするには、このキャスト演算子を呼び出します。

operator LPVARIANT();

解説

この関数によって返されるポインターによってアクセスされる構造体の VARIANT 値を変更すると、この COleSafeArray オブジェクトの値が変更されることに注意してください。

COleセーフArray::operator =

これらのオーバーロードされた代入演算子を使うと、ソース値をこの COleSafeArray オブジェクトにコピーすることができます。

COleSafeArray& operator=(const COleSafeArray& saSrc);
COleSafeArray& operator=(const VARIANT& varSrc);
COleSafeArray& operator=(LPCVARIANT pSrc);
COleSafeArray& operator=(const COleVariant& varSrc);

注釈

各演算子の簡単な説明を次に示します。

  • operator =(saSrc) このオブジェクトに既存 COleSafeArray のオブジェクトをコピーします。

  • operator =(varSrc) このオブジェクトに既存 VARIANT または COleVariant 配列をコピーします。

  • operator =(pSrc) pSrc によってアクセスされた配列オブジェクトをこのオブジェクトにコピーVARIANTします。

COleセーフArray::operator ==

この演算子は、2 つの配列 (SAFEARRAY、またはCOleSafeArray配列) を比較し、VARIANTCOleVariant等しい場合は 0 以外の値を返します。それ以外の場合は 0 を返します。

BOOL operator==(const SAFEARRAY& saSrc) const;  BOOL operator==(LPCSAFEARRAY pSrc) const;

BOOL operator==(const COleSafeArray& saSrc) const;  BOOL operator==(const VARIANT& varSrc) const;

BOOL operator==(LPCVARIANT pSrc) const;  BOOL operator==(const COleVariant& varSrc) const;

解説

2 つの配列は、等しい次元数、各次元のサイズが等しい場合、および等しい要素値を持つ場合に等しくなります。

COleSafeArray::operator <<

挿入 (<<) 演算子はCOleSafeArray、アーカイブへのオブジェクトのCOleSafeArray診断ダンプと格納をサポートします。

CDumpContext& AFXAPI operator<<(
    CDumpContext& dc,
    COleSafeArray& saSrc);

COleセーフArray::P trOfIndex

インデックス値で指定された要素へのポインターを返します。

void PtrOfIndex(
    long* rgIndices,
    void** ppvData);

パラメーター

rgIndices
配列の要素を識別するインデックス値の配列。 要素のすべてのインデックスを指定する必要があります。

ppvData
返された場合、rgIndicesの値によって識別される要素へのポインター。

COleセーフArray::P utElement

1 つの要素を配列に割り当てます。

void PutElement(
    long* rgIndices,
    void* pvData);

パラメーター

rgIndices
インデックスの配列へのポインター (配列の次元ごと)。

pvData
配列に割り当てるデータへのポインター。 VT_DISPATCH、VT_UNKNOWN、およびVT_BSTRバリアント型はポインターであり、別のレベルの間接参照は必要ありません。

解説

この関数は、要素の割り当て前と割り当て後に Windows 関数 セーフArrayLockセーフArrayUnlock を自動的に呼び出します。 データ要素が文字列、オブジェクト、バリアントの場合は、関数によって適切にコピーされ、既存の要素が文字列、オブジェクト、バリアントの場合は、関数によって適切にクリアされます。

配列は多重にロックできるため、配列が別の操作によってロックされている間に要素を配列に配置できることに注意してください。

エラーが発生すると、関数は CMemoryException または COleException をスローします。

VARIANT retVariantArray()
{
   COleSafeArray saRet;
   DWORD numElements[] = { 10, 10 }; // 10x10

   // Create the 2 dimensional safe-array of type VT_R8 with size 10x10
   saRet.Create(VT_R8, 2, numElements);

   // Initialize safearray  with values...
   long index[2];
   for (index[0] = 0; index[0] < 10; index[0]++)
   {
      for (index[1] = 0; index[1] < 10; index[1]++)
      {
         double val = index[0] + index[1] * 10;
         //populate the safearray elements with double values
         saRet.PutElement(index, &val);
      }
   }
   // Return the safe-array encapsulated in a VARIANT...
   return saRet.Detach();
}

COleセーフArray::Redim

セーフ配列の最下位 (右端) の境界を変更します。

void Redim(SAFEARRAYBOUND* psaboundNew);

パラメーター

psboundNew
新しい配列バインドを含む、新しい安全な配列バインド構造体へのポインター。 変更できるのは、配列の最下位次元だけです。

解説

エラーが発生すると、関数は COleException を スローします

COleセーフArray::ResizeOneDim

1 次元 COleSafeArray オブジェクト内の要素の数を変更します。

void ResizeOneDim(DWORD dwElements);

パラメーター

dwElements
1 次元セーフ配列内の要素の数。

解説

エラーが発生すると、関数は COleException を スローします

COleセーフArray::CreateOneDim の例を参照してください。

COleセーフArray::UnaccessData

配列のロック数をデクリメントし、によって AccessData取得されたポインターを無効にします。

void UnaccessData();

解説

エラーが発生すると、関数は COleException を スローします

COleセーフArray::AccessData の例を参照してください。

COleセーフArray::Unlock

解放またはサイズ変更できるように、配列のロック数をデクリメントします。

void Unlock();

解説

この関数は、配列内のデータへのアクセスが完了した後に呼び出されます。 エラーが発生すると、COleException がスロー されます

関連項目

階層図
COleVariant クラス
CRecordset クラス
CDatabase クラス