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_command 与 db_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,成员,方法,本地 |
可重复 |
否 |
必需的特性 |
无 |
无效的特性 |
无 |
有关属性上下文的更多信息,请参见 属性上下文。