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
    ...
    

    绑定参数块 将定义如下:

    ([bindtype**]**szVar1 [, szVar2 [, nVar3 [,…]]] )

    其中:

    ( 指示数据绑定块的开头。

    [bindtype] 下面是不区分大小写的字符串之一:

    • [db_column] 绑定每个成员变量设置为行集合中的列。

    • [bindto] (和 **[db_column]**相同)。

    • [in] 绑定成员变量作为输入参数。

    • [out] 绑定成员变量作为输出参数。

    • [in, out] 绑定成员变量作为输入/输出参数。

    SzVarX 解析为在当前范围内的成员变量。

    ) 指示数据绑定的结束块。

    如果命令字符串包含一个或多个说明符例如 [in], [out]或者 [in/out], db_command 生成参数映射。

    如果命令字符串包含一个或多个参数 ([] db_column 或 [] bindto, db_command 生成一个行集合,并对服务的访问器映射这些限制变量。 请参见 db_accessor 有关更多信息。

    备注

    [bindtype] 语法和 bindings 参数无效,在使用 db_command 在类级别时。

    这是固定参数的某些示例块。 下面的示例在 pubs 数据库中绑定 m_au_fname 和 m_au_lname 数据成员设置为 au_fname 和 au_lname 列,分别,的 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 (可选)
    具有 db_source 特性类的 CSession 变量或实例应用于它在哪些命令执行。 db_source参见。

    db_command 检查确保在 source_name 的变量是有效的,因此,该指定的变量应在函数或全局范围。

  • hresult(可选)
    标识要接收此数据库命令 HRESULT 的变量。 如果变量不存在,则将属性自动插入。

  • 绑定 (可选)
    允许从 OLE DB 命令分隔绑定参数。

    如果为 bindings指定值, db_command 将分析该关联的值,并且不分析bindtype[] 参数。 此用法允许使用 OLE DB 提供程序语法。 若要禁用分析,,没有绑定参数,请指定 Bindings= ""

    如果不为 bindings指定值, db_command 将分析固定参数块,查找 “(”,后跟 [中括号中的bindtype] ,后跟一个或多个以前声明的 C++ 成员变量,后跟 “)”。 圆括号内的所有文本从出现的命令将去除,并且,这些参数将用于构建此命令的列和参数绑定。

  • bulk_fetch(可选)
    指定要获取的整数值。

    默认值为 1,指定单个行 (获取行集合是类型 CRowset)。

    大于 1 的值指定批量取行。 批量取行是称为批量行集合的能力获取多个行句柄 (行集合是类型 CBulkRowset ,并使用指定的行数的 SetRows )。

    如果 bulk_fetch 小于一个, SetRows 将返回零。

备注

db_command 创建一 CCommand 对象, OLE DB 使用者用于执行命令。

可以使用类或函数范围的 db_command ;主要区别在于 CCommand 对象的大小。 功能范围,例如数据绑定停止在函数结束。 类和函数范围用法涉及 OLE DB 使用者模板类 CCommandAMP_LTAMP_GT,但是,模板参数为函数和类大小写不同。 在包含局部变量的功能种情况下,绑定将对 访问器 ,,而类的用法将推断出 CAccessor派生类作为参数。 在用作类特性, db_commanddb_column协同工作。

db_command 可用于执行不返回结果集的命令。

当使用者属性提供程序应用此特性应用于类,编译器将类重命名为 _TheClassNameAccessor, TheClassName 的名称就是您为该类,因此,编译器还将创建一个名为 TheClassName 的 从 _TheClassNameAccessor 派生。 在类视图中,您将看到两类。

示例

此示例定义一个选择名称从表状态列匹配 “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();
}

此示例使用在数据源类 CMySource的 db_source ,因此,在命令的 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,成员,方法,本地

可重复

必需的特性

无效的特性

有关属性上下文的更多信息,请参见 属性上下文

请参见

其他资源

OLE DB 使用者特性

独立特性

Attributes Samples