1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Counting Records in a DataReader ppt

4 376 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Counting records in a DataReader
Tác giả Team LiB
Thể loại Presentation
Định dạng
Số trang 4
Dung lượng 24,31 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

• Use the @@ROWCOUNT function to return the number or rows in a DataReader after the DataReader has been closed.. The sample code uses a single stored procedure: SP0207_GetOrders Retur

Trang 1

[ Team LiB ]

Recipe 2.7 Counting Records in a DataReader

Problem

You want to determine how many records there are in a DataReader

Solution

Use one of the following three techniques:

• Iterate over the rows in the DataReader

• Issue a COUNT(*) query as part of a batch query Note that not all data sources

support batch queries If not, execute the statements separately one after the other for a similar result

• Use the @@ROWCOUNT function to return the number or rows in a DataReader after the DataReader has been closed This technique is SQL Server specific The sample code uses a single stored procedure:

SP0207_GetOrders

Returns a result set containing all records in the Orders table in Northwind Also, the stored procedure returns the @@ROWCOUNT value for the query in an output parameter The stored procedure is shown in Example 2-7

Example 2-7 Stored procedure: SP0207_GetOrders

ALTER PROCEDURE SP0207_GetOrders

@RowCount int output

AS

set nocount on

select * from Orders

set @RowCount = @@ROWCOUNT

RETURN

The C# code is shown in Example 2-8

Example 2-8 File: DataReaderRowCountForm.cs

Trang 2

// Namespaces, variables, and constants

using System;

using System.Configuration;

using System.Data;

using System.Data.SqlClient;

//

// Batch query to retrieve the COUNT of records and

// all of the records in the Orders table as two result sets

String sqlText = "SELECT COUNT(*) FROM Orders; " +

"SELECT * FROM Orders;";

// Create the connection

SqlConnection conn = new SqlConnection(

ConfigurationSettings.AppSettings["Sql_ConnectString"]);

SqlCommand cmd = new SqlCommand(sqlText, conn);

conn.Open( );

// Create a DataReader on the first result set

SqlDataReader dr = cmd.ExecuteReader( );

// Get the count of records from the select count(*) statement

dr.Read( );

resultTextBox.Text = "Orders table record count, using COUNT(*)= " + dr.GetInt32(0) + Environment.NewLine;

// Move to the data result set

dr.NextResult( );

int count = 0;

// Iterate over the records in the DataReader

while(dr.Read( ))

{

count++;

// Do something interesting with the data here

}

// Close the DataReader and the connection

dr.Close( );

resultTextBox.Text += "Orders table record count, " +

"iterating over result set = " + count +

Environment.NewLine;

Trang 3

// Create the stored procedure to use in the DataReader

cmd = new SqlCommand("SP0207_GetOrders", conn);

cmd.CommandType = CommandType.StoredProcedure;

// Create the output paramter to return @@ROWCOUNT

cmd.Parameters.Add("@RowCount", SqlDbType.Int).Direction =

ParameterDirection.Output;

// Create a DataReader for the result set returned by

// the stored procedure

dr = cmd.ExecuteReader( );

// Process the data in the DataReader

// Close the DataReader

dr.Close( );

// The output parameter containing the row count is now available

resultTextBox.Text += "Orders table record count, " +

"returning @@ROWCOUNT from stored procedure = " +

cmd.Parameters["@RowCount"].Value;

conn.Close( );

Discussion

The DataReader provides forward-only, read-only access to a stream of rows from a data source It is optimized for performance by reading data directly from a connection to a data source As a result, there is no way to determine the number of records in the result set for the DataReader without iterating through all of the records Additionally, because the DataReader is forward-only, you cannot move backwards in DataReader so when iterating, you must process data at the same time This technique provides the only accurate count of records in the DataReader

A second technique demonstrated in the solution counts the records using the COUNT aggregate function for the command text used to build the DataReader This technique can have discrepancies with the number of records actually in the DataReader because of the timing lag between issuing the COUNT function and creating the DataReader

The solution also demonstrates using the SQL Server @@ROWCOUNT variable, which returns the number of rows affected by the previous statement, to return the number of records in the result set used to create the DataReader The count is returned as an output parameter and is therefore not available until the DataReader is closed Although this

Trang 4

does not improve the availability of the record count, centralizing the count in the stored procedure is less prone to coding errors than the counting approach For more

information about output parameters, see Recipe 2.9

The HasRows( ) method of the DataReader was introduced in Version 1.1 of the NET Framework It returns a Boolean value indicating whether the DataReader contains at least one row

There is also no way to determine the number of result sets in a DataReader built using a batch query without iterating over the result sets using the NextResult( ) method

[ Team LiB ]

Ngày đăng: 24/12/2013, 05:15

TỪ KHÓA LIÊN QUAN

w