共用方式為


db_command

建立 OLE DB 命令一樣。

[ db_command(  
   command,  
   name,  
   source_name,  
   hresult,  
   bindings,  
   bulk_fetch) 
]

參數

  • command
    命令字串,包含 OLE DB 命令的文字。 就是一個簡單的例子:

     [ db_command ( command = "Select * from Products" ) ]
    

    命令語法如下:

    binding parameter block 1
       OLE DB command
    binding parameter block 2
       continuation of OLE DB command
    binding parameter block 3
    ...
    

    A 繫結的參數區塊定義如下:

    ([bindtype szVar1, szVar2, nVar3 [, ...]]])

    其中:

    ( 標記資料繫結區塊的開頭。

    bindtype 是下列不區分大小寫的字串之一:

    • **[db_column]**會將每個成員變數繫結至資料列集中的資料行。

    • [bindto] (相同的 [db_column])。

    • [in會繫結做為輸入參數的成員變數。

    • **[out]**成員變數當做輸出參數會繫結。

    • **[in,out]**成員變數做為輸入/輸出參數會繫結。

    SzVarX 會解析為目前的範圍內的成員變數。

    ) 資料繫結區塊的結束標記。

    如果命令字串中包含一或多個規範例如 [in] 比較中,[淡],或 [/ 輸出], db_command 建置參數對應。

    如果命令字串中包含一或多個參數,例如 [db_column] 或 [bindto], db_command 會產生一個資料列集和服務這些繫結的變數的存取子對應。 請參閱 db_accessor 如需詳細資訊。

    注意事項注意事項

    bindtype 語法和bindings參數不正確,當使用 db_command 類別層級。

    以下是一些範例之間的繫結參數區塊。 下列範例會繫結m_au_fname和m_au_lname資料成員,以au_fname和au_lname資料行,分別的 pubs 資料庫中 authors 資料表:

    TCHAR m_au_fname[21];
    TCHAR m_au_lname[41];
    TCHAR m_state[3] = 'CA';
    
    [db_command (
       command = "SELECT au_fname([bindto]m_au_fname), au_lname([bindto]m_au_lname) " \
       "FROM dbo.authors " \
       "WHERE state = ?([in]m_state)")
    

    ]

  • 名稱 (可省略)
    您用來處理與資料列集的控制代碼的名稱。 如果您指定名稱db_command 會產生具有指定的類別名稱,它可以用來周遊資料列集,或執行多個巨集指令查詢。 如果您未指定名稱,它將不可能將一個以上的資料列的結果傳回給使用者。

  • source_name (可省略)
    CSession變數或具有類別的執行個體db_source屬性套用至它執行的命令。 請參閱 db_source

    db_command 檢查,以確保用來將變數 source_name 時設定無效,所以指定的變數必須是函式或全域範圍中。

  • hresult (選擇項)
    識別要接收之變數HRESULT的這個資料庫] 指令。 如果變數不存在,它會自動插入屬性。

  • 繫結 (可省略)
    可讓您與 OLE DB 命令區隔的繫結參數。

    如果您指定的值bindings, db_command 會剖析相關聯的值並不會將剖析 bindtype 參數。 這種用法,可讓您使用 OLE DB 提供者的語法。 若要停用的剖析時,不包含繫結的參數,指定繫結 =""

    如果您未指定的值bindings, db_command 會將剖析繫結參數區塊中,尋找 '(',後面緊接著 bindtype 在方括號,後面跟著一或多個先前宣告 C++ 成員變數,後面跟著一個 ')'。 括號之間的所有文字都會被都抽出從所得的命令和這些參數會用來建構資料行和參數的繫結,對這個命令。

  • bulk_fetch(可省略)
    整數值,指定要擷取資料列數目。

    預設值為 1,這會指定單一資料列擷取 (資料列集即為型別 CRowset)。

    大於 1 則表示大量資料列擷取的值。 大量資料列擷取大量資料列集的能力,以擷取多個資料列控制代碼是指 (資料列集即為型別 CBulkRowset ,並將呼叫SetRows與指定的資料列數)。

    如果 bulk_fetch 為小於 1, SetRows會傳回零。

備註

db_command 會建立 CCommand 物件,它由 OLE DB 消費者執行命令。

您可以使用 db_command 與類別或函式的範圍。 主要差異是範圍CCommand物件。 函式範圍與資料繫結之類終止函式的結尾。 類別和函式的範圍使用方式涉及 OLE DB 消費者樣板類別 CCommand < >,但不同之函式和類別的實例的樣板引數。 在函式的情況下,將會進行繫結至存取子 ,組成時類別使用方式將推斷的區域變數, CAccessor-衍生的類別,做為引數。 做為 class 屬性,當 db_command 與搭配 db_column

db_command 可用來執行不傳回結果集的命令。

當消費者屬性提供者會將這個屬性套用至類別時,編譯器將類別重新指定成 _YourClassName存取子,其中 YourClassName 是類別的名稱,而且編譯器也會建立一個名為 YourClassName, 衍生 _YourClassName存取子。 在 [類別檢視] 中,您會看到這兩個類別。

範例

本範例會定義其中的 state 資料行必須符合 'CA' 的表格中選取的第一個和最後一個名稱的命令。 db_command 建立並讀取資料列集,您就可以呼叫精靈所產生的函式類似 OpenAll 和 CloseAll,以及CRowset成員函式類似 MoveNext

請注意這段程式碼會要求您提供您自己連接至 pubs 資料庫的連接字串。 有關如何在開發環境中執行這項操作,請參閱如何:從伺服器總管連接至資料庫How to: Add New Data Connections in Server Explorer/Database Explorer

// db_command.h
#include <atlbase.h>
#include <atlplus.h>
#include <atldbcli.h>

#pragma once

[  db_source(L"your connection string"),
   db_command(L" \
      SELECT au_lname, au_fname \
      FROM dbo.authors \
      WHERE state = 'CA'")  ]

struct CAuthors {
   // In order to fix several issues with some providers, the code below may bind
   // columns in a different order than reported by the provider

   DBSTATUS m_dwau_lnameStatus;
   DBSTATUS m_dwau_fnameStatus;
   DBLENGTH m_dwau_lnameLength;
   DBLENGTH m_dwau_fnameLength;

   [ db_column("au_lname", status="m_dwau_lnameStatus", length="m_dwau_lnameLength") ] TCHAR m_au_lname[41];
   [ db_column("au_fname", status="m_dwau_fnameStatus", length="m_dwau_fnameLength") ] TCHAR m_au_fname[21];

   [ db_param("7", paramtype="DBPARAMIO_INPUT") ] TCHAR m_state[3];
   

   void GetRowsetProperties(CDBPropSet* pPropSet) {
      pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
      pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
   }
};

// db_command.cpp
// compile with: /c
#include "db_command.h"

int main(int argc, _TCHAR* argv[]) {
   HRESULT hr = CoInitialize(NULL);

   // Instantiate rowset
   CAuthors rs;

   // Open rowset and move to first row
   strcpy_s(rs.m_state, sizeof(rs.m_state), _T("CA"));
   hr = rs.OpenAll();
   hr = rs.MoveFirst();
   
   // Iterate through the rowset
   while( SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET ) {
      // Print out the column information for each row
      printf("First Name: %s, Last Name: %s\n", rs.m_au_fname, rs.m_au_lname);
      hr = rs.MoveNext();
   }

   rs.CloseAll();
   CoUninitialize();
}

這個範例使用db_source在資料來源類別是CMySource,和db_command指令的類別上CCommand1和CCommand2。

// db_command_2.cpp
// compile with: /c
#include <atlbase.h>
#include <atlplus.h>
#include <atldbcli.h>
// class usage for both db_source and db_command

[  db_source(L"your connection string"),
   db_command(L" \
      SELECT au_lname, au_fname \
      FROM dbo.authors \
      WHERE state = 'CA'")  ]
struct CMySource {
   HRESULT OpenDataSource() {
      return S_OK;
   }
};

[db_command(command = "SELECT * FROM Products")]
class CCommand1 {};

[db_command(command = "SELECT FNAME, LNAME FROM Customers")]
class CCommand2 {};

int main() {
   CMySource s;
   HRESULT hr = s.OpenDataSource();
   if (SUCCEEDED(hr)) {
      CCommand1 c1;
      hr = c1.Open(s);

      CCommand2 c2;
      hr = c2.Open(s);
   }

   s.CloseDataSource();
}

需求

屬性內容

適用於

類別, struct,成員、 方法、 本機

可重複

必要的屬性

None

無效的屬性

None

如需有關屬性內容的詳細資訊,請參閱屬性內容

請參閱

其他資源

OLE DB 消費者屬性

獨立屬性

Attributes Samples