Bagikan melalui


Anggota Data Status Bidang di Aksesor yang Dihasilkan Wizard

Wizard Konsumen ATL OLE DB tidak tersedia di Visual Studio 2019 dan yang lebih baru. Anda masih dapat menambahkan fungsionalitas secara manual. Untuk informasi selengkapnya, lihat Membuat Konsumen Tanpa Menggunakan Wizard.

Saat Anda menggunakan Wizard Konsumen ATL OLE DB untuk membuat konsumen, wizard menghasilkan anggota data di kelas rekaman pengguna untuk setiap bidang yang Anda tentukan di peta kolom Anda. Setiap anggota data berjenis DWORD dan berisi nilai status yang sesuai dengan bidangnya masing-masing.

Misalnya, untuk anggota data m_OwnerID, wizard menghasilkan anggota data tambahan untuk status bidang (dwOwnerIDStatus) dan satu lagi untuk panjang bidang (dwOwnerIDLength). Ini juga menghasilkan peta kolom dengan entri COLUMN_ENTRY_LENGTH_STATUS.

Hal ini ditunjukkan dalam segmen kode berikut:

class CAuthorsAccessor
{
public:
   LONG m_AuID;
   TCHAR m_Author[53];
   LONG m_YearBorn;

   DBSTATUS m_dwAuIDStatus;
   DBSTATUS m_dwAuthorStatus;
   DBSTATUS m_dwYearBornStatus;

   DBLENGTH m_dwAuIDLength;
   DBLENGTH m_dwAuthorLength;
   DBLENGTH m_dwYearBornLength;

   DEFINE_COMMAND_EX(CAuthorsAccessor, L" \
   SELECT \
      AuID, \
      Author, \
      YearBorn \
      FROM dbo.Authors")

   BEGIN_COLUMN_MAP(CAuthorsAccessor)
      COLUMN_ENTRY_LENGTH_STATUS(1, m_AuID, dwAuIDLength, dwAuIDStatus)
      COLUMN_ENTRY_LENGTH_STATUS(2, m_Author, dwAuthorLength, dwAuthorStatus)
      COLUMN_ENTRY_LENGTH_STATUS(3, m_YearBorn, dwYearBornLength, dwYearBornStatus)
   END_COLUMN_MAP()
...

Catatan

Jika Anda mengubah kelas rekaman pengguna atau menulis konsumen Anda sendiri, variabel data harus datang sebelum variabel status dan panjang.

Anda dapat menggunakan nilai status untuk tujuan penelusuran kesalahan. Jika kode yang dihasilkan oleh Wizard Konsumen ATL OLE DB menghasilkan kesalahan kompilasi seperti DB_S_ERRORSOCCURRED atau DB_E_ERRORSOCCURRED, Anda harus terlebih dahulu melihat nilai anggota data status bidang saat ini. Mereka yang memiliki nilai bukan nol sesuai dengan kolom yang menyinggung.

Anda juga dapat menggunakan nilai status untuk mengatur nilai NULL untuk bidang tertentu. Melakukannya membantu Anda dalam kasus di mana Anda ingin membedakan nilai bidang sebagai NULL daripada nol. Terserah Anda untuk memutuskan apakah NULL adalah nilai yang valid atau nilai khusus dan memutuskan bagaimana aplikasi Anda harus menanganinya. OLE DB mendefinisikan DBSTATUS_S_ISNULL sebagai cara yang benar untuk menentukan nilai NULL generik. Jika konsumen membaca data dan nilainya null, bidang status diatur ke DBSTATUS_S_ISNULL. Jika konsumen ingin menetapkan nilai NULL, konsumen menetapkan nilai status ke DBSTATUS_S_ISNULL sebelum memanggil penyedia.

Selanjutnya, buka Oledb.h dan cari DBSTATUSENUM. Anda kemudian dapat mencocokkan nilai numerik status bukan nol dengan nilai enumerasi DBSTATUSENUM. Jika nama enumerasi tidak cukup untuk memberi tahu Anda apa yang salah, lihat topik Status di bagian Nilai Data Pengikatan dari Panduan Programmer OLE DB. Topik ini berisi tabel nilai status yang digunakan saat mendapatkan atau mengatur data. Untuk informasi tentang nilai panjang, lihat topik Panjang di bagian yang sama.

Mengambil Panjang atau Status Kolom

Anda dapat mengambil panjang kolom panjang variabel atau status kolom (untuk memeriksa DBSTATUS_S_ISNULL, misalnya):

  • Untuk mendapatkan panjangnya, gunakan makro COLUMN_ENTRY_LENGTH.

  • Untuk mendapatkan status, gunakan makro COLUMN_ENTRY_STATUS.

  • Untuk mendapatkan keduanya, gunakan COLUMN_ENTRY_LENGTH_STATUS, seperti yang ditunjukkan:

    class CProducts
    {
    public:
       char      szName[40];
       long      nNameLength;
       DBSTATUS   nNameStatus;
    
    BEGIN_COLUMN_MAP(CProducts)
    // Bind the column to CProducts.m_ProductName.
    // nOrdinal is zero-based, so the column number of m_ProductName is 1.
       COLUMN_ENTRY_LENGTH_STATUS(1, szName, nNameLength, nNameStatus)
    END_COLUMN_MAP()
    };
    
  • Kemudian, akses panjang dan/atau status seperti yang ditunjukkan:

    CTable<CAccessor<CProducts >> product;
    CSession session;
    
    product.Open(session, "Product");
    
    while (product.MoveNext() == S_OK)
    {
       // Check the product name isn't NULL before tracing it
       if (product.nNameStatus == DBSTATUS_S_OK)
          ATLTRACE("%s is %d characters\n", product.szName, product.nNameLength);
    }
    

Saat Anda menggunakan CDynamicAccessor, panjang dan status terikat untuk Anda secara otomatis. Untuk mengambil nilai panjang dan status, gunakan GetLength fungsi anggota dan GetStatus .

Baca juga

Bekerja dengan Templat Konsumen OLE DB