ADO.NET讀書筆記系列之------SqlCommander和SqlDataReader對象
2024-07-21 02:06:30
供稿:網友
一、特點介紹
⒈sqlcommand:表示要對sql server數據庫執行的一個transact-sql語句或存儲過程。
⒉sqldatareader:提供一種從數據庫讀取只進的行流的一種方式。若要創建sqldatareader,必須調用sqlcommand對象的executereader方法,而不直接使用構造函數。應該盡可能迅速的關閉sqldatareader對象。
⒊sqlparameter:表示sqlcommand的參數,也可以是它到dataset列的映射。
二、使用介紹
⒈創建sqlcommand對象:
string strconn,strsql;
strconn=”…………”;
strsql=”select customerid,companyname from customers”;
sqlconnection cn = new sqlconnection(strconn);
cn.open();
sqlcommand cmd;
cmd=new sqlcommand();
cmd.commandtext=strsql;
cmd.connection=cn;
cmd=new sqlcommand(strsql,cn);
⒉執行無返回行的查詢:
string strconn,strsql;
strconn=”……”;
strsql=”update customers set companynme=’newname’where customersid=’alfki’”;
sqlconnection cn=new sqlconnection(strconn);
cn.open();
sqlcommand cmd=new sqlcommand(strsql,cn);
int recordsaffercted=cmd.executenonquery();
if(recordsaffercted ==1)
……
else
…………
⒊用sqldatareader對象檢查查詢結果:
① 獲取結果
string strconn,strsql;
strconn=”……”;
sqlconnection cn=new sqlconnection(strconn);
cn.open();
strsql=”select customerid,companyname from customers”;
sqlcommand cmd=new sqlcommand(strsql,cn);
sqldatareader rdr=cmd.executereader();
while(rdr.read())
console.writeline(rdr[“customerid”]+rdr[“companyname”]);
rdr.close();
② 更快獲取
ⅰ使用基于序號的查找
……
sqldatareader rdr=cmd.executereader();
int customeridordinal = rdr.getordinal(“customerid”);
int companynameordinal = rdr.getordinal(“companyname”);
while(rdr.read())
console.writeline(rdr[customeridordinal]+rdr[companynameordinal]);
rdr.close();
ⅱ使用適當的類型指定get方法
……
sqldatareader rdr=cmd.executereader();
int customeridordinal = rdr.getordinal(“customerid”);
int companynameordinal = rdr.getordinal(“companynameordinal”);
while(rdr.read())
console.writeline(rdr.getstring(customeridordinal)+rdr.getstring(companynameordinal));
rdr.close();
③獲取多個結果
…
cn.open();
string strsql =”select customerid,companyname from customers;”+“select orderid,customerid from orders;”;
sqlcommand cmd=new sqlcommand(strsql,cn);
sqldatareader rdr=cmd.executereader();
do
{
while(rdr.read())
console.writeline(rdr[0]+rdr[1]);
console.writeline();
}while(rdr.nextresult());
⒋執行返回單值的查詢:
…
cn.open();
sqlcommand cmd=new sqlcommand(“select count(*) from customers",cn);
int customres = convert.toint32(cmd.executescalar());
⒌執行參數化查詢和調用存儲過程:
sqlcommand cmd = new sqlcommand("delqxry", cn);
cmd.commandtype = commandtype.storedprocedure;
sqlparameter parameterroleid = new sqlparameter("@id", sqldbtype.int, 4);
parameterroleid.value = 444;
cmd.parameters.add(parameterroleid);
cn.open();
cmd.executenonquery();
⒍ 從 輸出參數中獲取數據:
create procedure getcustomer(@companyname nvarchar(30) output,@customerid nchar(5)) as select @companyname=companyname from customers where [email protected]
…
cmd.parameters[“@companyname”].direction =parameterdirection.output;
⒎在transaction中執行查詢:
…
cn.open();
sqltransaction txn=cn.begintransaction();
string strsql=”insert into customers(…)values(…)”;
sqlcommand cmd=new sqlcommand(strsql,cn,txn);
int recordaffected = cmd.executenonquery();
if(recordaffected ==1)
{
txn.commit();
}
else
{
txn.rollback();
}
三、屬性方法事件介紹
⒈sqlcommand
ⅰ屬性
①commandtext: 要執行的 transact-sql 語句或存儲過程。默認為空字符串。
②commandtimeout: 等待命令執行的時間(以秒為單位)。默認為 30 秒。
③commandtype: commandtype 值之一。默認值為 text。
④connection: 與數據源的連接。默認值為空引用
⑤parameters: transact-sql 語句或存儲過程的參數。默認為空集合。
⑥transaction:指定用于查詢的事務處理
⑦updaterowsource:如果通過調用dataadapter對象的update方法來使用command,那么該屬性就用于控制影響當前datarow的查詢結果(默認值為both)
ⅱ方法
①cancel: 試圖取消sqlcommand的執行。如果沒有要取消的內容,則什么都不會發生。但如果有命令正在執行,而取消嘗試失敗,則不會生成異常。cancel方法還會導致command對象刪除datareader對象上所有未讀的行。
②createparameter:為查詢創建一個新參數。
③executenonquery:對連接執行transact-sql語句并返回受影響的行數。對于 update、insert 和 delete 語句,返回值為該命令所影響的行數。對于所有其他類型的語句,返回值為 -1。如果發生回滾,返回值也為 -1。
④executereader:將commandtext發送到connection并生成一個sqldatareader。
public sqldatareader executereader(commandbehavior);
⑤executescalar:執行查詢,并返回查詢所返回的結果集中第一行的第一列。忽略額外的列或行。
⑥executexmlreader:將commandtext發送到connection并生成一個xmlreader。
⑦prepare:在 sql server 的實例上創建命令的一個準備版本。在調用 prepare 之前,應指定要準備的語句中的每個參數的數據類型。
⑧resetcommandtimeout:將commandtimeout屬性設置為默認值30秒。
ⅲ事件
⒉sqldatareader
ⅰ屬性
①depth:獲取一個值,該值指示當前行的嵌套深度。最外層表的深度為零。sql server .net framework 數據提供程序不支持嵌套并總是返回零值。
②fieldcount:獲取當前行中的列數。如果未放在有效的記錄集中,則為 0;否則為當前行中的列數。默認值為 -1。執行不返回行的查詢后,fieldcount 返回 0。
③hasrows:如果sqldatareader包含一行或多行,則為true;否則為false。
④isclosed:如果sqldatareader已關閉,則為true;否則為false。
⑤item:獲取以本機格式表示的列的值。
⑥recordsaffected:已更改、插入或刪除的行數;如果沒有任何行受到影響或語句失敗,則為 0;-1 表示 select 語句。
ⅱ方法
①close:關閉sqldatareader對象。如果返回值和查詢影響的記錄的數量不重要,則可以在調用close方法前調用關聯的sqlcommand對象的cancel方法,從而減少關閉sqldatareader所需要的時間。
②getname:獲取指定列的名稱。
③getordinal:在給定列名稱的情況下獲取列序號。
④getvalue:獲取以本機格式表示的指定列的值。
⑤getvalues:獲取當前行的集合中的所有屬性列。
⑥isdbnull:獲取一個值,該值指示列中是否包含不存在的或缺少的值。如果指定的列值與dbnull等效,則為true;否則為false。
⑦nextresult:當讀取批處理 transact-sql 語句的結果時,使數據讀取器前進到下一個結果。如果存在多個結果集,則為 true;否則為 false。
⑧read:使sqldatareader前進到下一條記錄,如果存在多個行,則為true;否則為false。必須調用read來開始訪問任何數據。在某一時間,每個關聯的sqlconnection只能打開一個sqldatareader,在上一個關閉之前,打開另一個的任何嘗試都將失敗。
ⅲ事件
⒊sqlparameter
ⅰ屬性
①dbtype:獲取或設置參數的dbtype。默認值為string。
②direction:獲取或設置一個值,該值指示參數是只可輸入、只可輸出、雙向還是存儲過程返回值參數。默認值為 input。
③isnullable:獲取或設置一個值,該值指示參數是否接受空值。如果接受空值,則為 true;否則為 false。默認為 false。
④parametername:獲取或設置 sqlparameter 的名稱。
⑤size:獲取或設置列中數據的最大大?。ㄒ宰止潪閱挝唬?。默認值是從參數值推導出的。
⑥sqldbtype:獲取或設置參數的sqldbtype。默認為nvarchar。sqldbtype和dbtype是相互連接的。設置dbtype會將sqldbtype更改為支持的sqldbtype。
⑦value:獲取或設置該參數的值。默認為空。
ⅱ方法
ⅲ事件