如何使用 IRow::GetColumns(或 IRow::Open)和 ISequentialStream 提取列

大型数据可使用 ISequentialStream 接口进行绑定或检索。对于绑定列,状态标志 DBSTATUS_S_TRUNCATED 表示数据被截断。

完整示例代码见文件 FetchColumns_A.cpp。您可以从 MSDN 上的 SQL Server Downloads(SQL Server 下载)页下载包含该示例的存档。

该示例是使用 Microsoft Visual C++ 2005 开发的。

以下代码创建应用程序所使用的示例表。

USE AdventureWorks2008R2;
GO

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'MyTable')
     DROP TABLE MyTable;
GO

CREATE TABLE MyTable
(
     col1  int,
     col2  varchar(50),
     col3  char(50),
     col4  datetime,
     col5  float,
     col6  money,
     col7  sql_variant,
     col8  binary(50),
     col9  text,
     col10 image
);
GO

/* Enter data. */
INSERT INTO MyTable
values
(
     10,
     'abcdefghijklmnopqrstuvwxyz',
     'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
     '11/1/1999 11:52 AM',
     3.14,
     99.95,
     CONVERT(nchar(50), N'AbCdEfGhIjKlMnOpQrStUvWxYz'),
     0x123456789,
     REPLICATE('AAAAABBBBB', 500),
     REPLICATE(0x123456789, 500)
);
GO
安全说明安全说明

请尽可能使用 Windows 身份验证。如果 Windows 身份验证不可用,请在运行时提示用户输入其凭据。不要将凭据存储在一个文件中。如果必须保存凭据,则应当用 Win32 crypto API(Win32 加密 API)进行加密。

使用 IRow::GetColumns(或 IRow::Open)和 ISequentialStream 提取列

  1. 建立与数据源的连接。

  2. 执行命令(在本例中,用 IID_IRow 调用 ICommandExecute::Execute())。

  3. 使用 IRow::Open() 或 IRow::GetColumns() 提取列数据。

    • IRow::Open() 可用于在行上打开 ISequentialStream。指定 DBGUID_STREAM,以指示列包含二进制数据流(随后可使用 IStream 或 ISequentialStream 读取列数据)。

    • 如果使用 IRow::GetColumns(),则 DBCOLUMNACCESS 结构的 pData 元素设置为指向流对象。

  4. 重复使用 ISequentialStream::Read(),将指定的字节数读入使用者缓冲区。

请参阅

其他资源