通過DataReader獲取多個結果集

2022-01-12 00:14:26 字數 2216 閱讀 7117

我們知道,ado.net的datareader提供一種從資料庫讀取行的只進流的方式。通常情況下,我們都是針對乙個結果集進行處理。其實通過datareader的nextresult方法,我們可以批處理t-sql,也就是可以獲取處理兩個或者多個結果集。下面通過乙個簡單的示例,來簡單說明一下這個功能。

1、資料表

我們還是沿用這一篇裡的person表。在person表裡,我們定義了自增長的id,姓、名、身高和體重,它們對應的字段和實體裡的屬性命名是一樣的。

2、實體類

public

class

person

public

string

firstname 

public

string

lastname 

public

double

weight 

public

double

height 

//////

總記錄數

///public

long

totalcount 

}需要說明的是,totalcount屬性是我們自己根據統計需要,新增的用來統計符合條件的人的總記錄數,並不是person表的乙個實際字段。

3、資料實體轉換

**public

class

sqlhelper

intindex 

=rdr.getordinal(propinfo.name);

if(index 

>-1

&&rdr.getvalue(index) 

!=system.dbnull.value)

propinfo.setvalue(obj, rdr.getvalue(index), 

null);}

t model 

=default

(t);

model 

=obj 

ast;

listmodels.add(model);

}bool

isnext 

=rdr.nextresult();

//前進到下乙個結果集

htcolumns 

=createhashcolumnname(rdr);

//改變hashtable的對應列名

while

(rdr.read() 

&&isnext)}}

}}return

listmodels;

}private

static

hashtable createhashcolumnname(idatareader rdr)

}return

ht;}

}上面的**中,注釋寫的很清楚,通過nextresult方法後,我們再次獲取結果集的列(示例中保持在hashtable裡),利用第一次獲得結果集的方法和原理,給實體賦值。

4、前台呼叫

很簡單,通過乙個帶分號的sql語句,獲得乙個實體集合。

**//

批量sql語句 以;隔開

string

sql ="

select top 10 [id] ,[firstname],[lastname],[weight],[height] from person (nolock); select count(id) as totalcount from person (nolock) ";

ilist

<

person

>

listpersons 

=sqlhelper.select

<

person

>

(typeof

(person), sql);

//操作兩個結果集

有圖有真相:

從圖中我們可以清楚地看到,測試資料庫裡的總人數是1999918人。

最後,請教最近使用linq2sql一點困擾我的地方:很多人津津樂道的skip...take分頁(本質上據說就是二次top),好像無法直接取得總記錄數(totalcount),但是正常專案中都會通過總記錄數確定分頁效果。除了直接通過linq查詢取count之外,不知道大家有沒有其他更好的方法,比如視窗函式row number,或者就像本文所表達的那樣,批處理一次查詢就搞定的那種?

DataReader物件與資料獲取

datareader物件與資料獲取 datareader物件以 基於連線 的方式來訪問資料庫。也就是說,在訪問資料庫 執行sql操作時,datareader要求一直連在資料庫上。這將會給資料庫的連線負載帶來一定的壓力,但datareader物件的工作方式將在很大程度上減輕這種壓力。1 datarea...

DataReader方式 獲取資料的操作

獲得資料列表list datareader 使用引數的 條件 hashtable,儲存引數名及引數對應的值 list 使用方法 string str id id hashtable ht new hashtable ht.add id 10 public listgetlistusedataread...

通過environment獲取sdcard目錄

在研究拍照後突破的儲存路徑的問題,開始儲存路徑寫死為 private string folder sdcard dcim camera sd卡上拍照程式的儲存路徑 後來發現這樣寫雖然一般不會出錯,但不是很好,因為不同相機,可能路徑會出問題。較好的方法是通過environment 來獲取路徑,最後給出...