韩剧1988免费观看全集_久久影视三级福利片_亚洲视频在线观看免费_在线观看欧美日韩_国产亚洲激情在线_亚洲精品美女久久久_欧美国产日韩一区二区在线观看_91在线观看免费高清完整版在线观看_日韩av免费看_国产又爽又黄的激情精品视频_琪琪亚洲精品午夜在线_欧美性猛xxx_不卡毛片在线看_国产亚洲日本欧美韩国_91国内在线视频_精品国产福利视频

當前位置:蘿卜系統(tǒng)下載站 > 技術開發(fā)教程 > 詳細頁面

ADO.NET詳細研究(5)--DataReader終結篇

ADO.NET詳細研究(5)--DataReader終結篇

更新時間:2022-10-11 文章作者:未知 信息來源:網絡 閱讀次數:

這一次我們將把DataReader了結,同時我們提到的有些技巧與DataReader無關但是是很基本的也很有用的技巧。
一,參數化查詢
在上一篇文章發(fā)表以后不少網友提意見說代碼不規(guī)范,沒有對sql使用參數,這確實是很大一個漏洞,所以我在這里首先談一下參數化查詢問題。
使用參數化查詢的好處:可以防止sql注入式攻擊,提高程序執(zhí)行效率。
針對sql server .net data Provider,我們可以使用@作為前綴標記的參數。比如:
const string connStr = "Data source=bineon;user=sa;password=test;initial catalog=northwind;";
string sql = "select ProductID,ProductName from Products";
sql += " where CategoryID = @CategoryID and ProductID < @CategoryID ";
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sql,conn);
cmd.Parameters.Add("@CategoryID",CategoryIDValue);
cmd.Parameters.Add("@MaxProductID",MaxProductIDValue);
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
上面的代碼段在定義sql語句的時候使用了兩個參數@CategoryID和@CategoryID。為了是參數在執(zhí)行過程中獲得具體值,我們使用Prarmeter對象,通過它把參數添加到Command對象上,這樣就獲得參數化查詢。
當然上面使用的add方法有其他重載版本,比如我們可以自己定義Parameter對象然后再添加:
SqlParameter para = new SqlParameter("@CategoryID",CategoryIDValue);
cmd.Parameters.Add(para);
上面SqlParameter的構造函數也有多個重載版本。具體可以查看msdn。
注意:上面的參數必須使用@前綴,另外也不僅僅是查詢才能使用參數,其他更新數據庫的操作類似的都能采用參數。
上面我們給出了針對sql server參數化查詢的方法,現在我們討論在OLEDB 和ODBC中指定參數。
其實這兩種Provider都不支持指定參數的方法,但是我們可以在查詢中使用(?)作為占位符,去指定參數將出現的位置。
sql = "select ProductID,ProductName from Products";
sql += " where CategoryID =? and ProductID < ?";
接下來我們同樣應該把Parameter對象添加到Command的Parameters集合里面,但是這個時候注意參數添加的順序必須和你使用?的順序相通,這個是與上面sql server .net data Provider不同的地方。
OleDbCommand cmd = new OleDbCommand(sql,conn);
cmd.Parameters.Add(“CatID”,CategoryIDValue);
cmd.Parameters.Add(“MaxProductID”,MaxProductIDValue);
如果上面添加參數的次序弄反了,那么MaxProductIDValue將被指定到第一個?那里,那么就出錯了。另外上面的參數名CatID和MaxProductID無所謂,你怎么命名都可以,甚至是空串也行。
注意:上面參數名無所謂,但是添加參數的次序很重要,不能顛倒。同樣的其他更新數據庫的操作也支持(?)占位符。

二,使用輸出參數檢索數據
這種方法的前提是使用存儲過程。其實對支持存儲過程的DBMS比如sql server來說,其上的所有操作都應該使用存儲過程,以獲得更好的執(zhí)行效率。
比如我現在需要在我的聯系人數據庫中找出一個和指定ID相同的聯系人的姓名(關于聯系人數據庫請看我的上一篇文章),我應該怎么做呢?一個辦法是使用DataReader,但是效率如何?另外也許我們可以選擇更好的ExecuteScalar(),但是如果我想知道的是聯系人的姓名和電話呢?ExecuteScalar()的效率確實比DataReader好,但是它只能返回單個值,這個時候它也不能滿足要求。我們這里使用存儲過程輸出參數來解決這個問題。存儲過程如下:
CREATE PROCEDURE GetInfo
(
@FID int,
@Fname varchar(8) output,
@Fphone varchar(12) output
)
AS
Select @Fname = Fname,@Fphone = Fphone
from friend
where Fid = @Fid
GO
上面的關鍵字output指明參數是輸出參數。
然后我們編寫代碼:
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "GetInfo";
cmd.CommandType = CommandType.StoredProcedure;
上面的代碼新建conn對象和cmd對象,并把cmd對象的執(zhí)行命令指定為名為GetInfo的存儲過程。接下來我們需要給cmd對象的Parameters集合添加Parameter對象了。
SqlParameter param = cmd.Parameters.Add("@Fid",16);
param = cmd.Parameters.Add("@Fname",SqlDbType.VarChar,8);
param.Direction = ParameterDirection.Output;
param = cmd.Parameters.Add("@Fphone",SqlDbType.VarChar,8);
param.Direction = ParameterDirection.Output;
我們注意到了上面的@Fname和@Fphone參數添加的時候指定了參數為輸出方向,這個就是和存儲過程里面的參數方向是一致的。下面我們執(zhí)行命令同時獲得對應的值。
conn.Open();
cmd.ExecuteNonQuery();
string Fname = cmd.Parameters["@Fname"].Value.ToString();
string Fphone = cmd.Parameters["@Fphone"].Value.ToString();
conn.Close();
三,檢索多個無關的結果集
有時候我們需要對不同的表(也可能是相同的表,但是查詢內容不同)進行無關的查詢,比如我想查看所有聯系人的姓名,然后在查看所有聯系人的住址。當然這個需要我們完全可以一個sql語句搞定,也不需要所謂的多個記錄集,但是請允許我以這個需求來演示多個記錄集的操作。
多個查詢語句之間使用;分開。具體代碼如下:
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = conn.CreateCommand();
string sqla = "select Fname from friend";
string sqlb = "select Fphone from friend";
cmd.CommandText = sqla + ";" + sqlb;
然后我們可以和以往一樣獲得DataReader,但是由于是多個記錄集,我們讀取完第一個記錄集以后如果使用下一個記錄集呢?答案是NextResult()方法,該方法為bool類型,如果有下一個記錄集就返回真,否則為假。
conn.Open();
SqlDataReader reader= cmd.ExecuteReader();
int i = 1;
do
{
Console.WriteLine("第" + i.ToString() + "個記錄集內容如下:\n");
while(reader.Read())
{
Console.WriteLine(reader[0].ToString() + "\t");
}
i++;
}while(reader.NextResult());
注意:由于DataReader本身向前只讀的特性,您不能比較多個記錄集的內容,也不能在多個記錄集中來回移動。結果為多個結果集時,數據讀取器定位在第一個記錄集上,這個和數據讀取器的read()方法不同(該方法默認在記錄集之前)。
另外這個例子僅僅時演示多個無關記錄集的使用方法,所以請不要追究例子的實際意義。另外當我們需要檢索相關的記錄信息時,多表連接查詢也是一個很好的選擇,也就是使用Sql join查詢。
四,其他相關技術
檢索二進制數據
檢索二進制數據的時候我們必須把CommandBehavior.SequentialAccess枚舉值傳遞給ExecuteReader方法。另外就是要注意從 記錄集讀取信息的時候必須按照你的sql語句的順序讀取。比如:
Sql = “select pub_id,pr_info,logo from pub_info where pub_id=’0763’ “;
那么你讀取的時候必須先取得pub_id,然后才是pr_info,再接著時logo,如果你讀取了pr_info以后又想讀取pub_info,這時你將得到異常。另外需要注意的是讀取大量二進制數據的時候比較好的辦法是使用GetBytes方法。下面的代碼演示如果讀取logo的二進制數據。
System.IO.MemoryStream stream = new System.IO.MemoryStream();
System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);
int BufferSize = 1024;
byte[] Buffer = new Byte[BufferSize];
long Offset = 0;
long BytesRead = 0;
do
{
BytesRead = reader.GetBytes(2,Offset,Buffer,0,BufferSize);
writer.Writer(Buffer,0,(int)BytesRead);
writer.Flush();
Offset += BytesRead;
}
while(BytesRead == BufferSize);
其中GetBytes方法參數比較多,具體請參見msdn:
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemdatasqlclientsqldatareaderclassgetbytestopic.htm
檢索模式信息
如果我們只想取得數據庫表的模式信息,怎么辦?DataReader的GetSchemaTable方法可以滿足我們的要求。
string sql = "select Fid,Fname,Fphone from friend";
cmd.CommandText = sql;
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
DataTable SchemaTable = reader.GetSchemaTable();
然后我們可以遍歷DataTable獲得所有模式信息
DataRowCollection SchemaColumns = SchemaTable.Rows;
DataColumnCollection SchemaProps = SchemaTable.Columns;
foreach(DataRow SchemaColumn in SchemaColumns)
{
foreach(DataColumn SchemaColumnProp in SchemaProps)
{
Console.WriteLine(SchemaColumnProp.ColumnName + "=" + SchemaColumn[SchemaColumnProp.ColumnName].ToString());
}
}
但是上面的效率不高,因為我們不需要讀取數據集,但是程序實際上做了這個工作。一個可行的解決辦法是把CommandBehavior.SchemaOnly枚舉傳遞給ExecuteRader方法,另外的辦法就是構造特殊的sql命令,比如:
Sql = “select Fid,Fname,Fphone from friend where Fid = 0”

DataReader的功能基本上就介紹完了,如果需要更詳細的資料請查看msdn。下一次我們將討論DataSet的簡單功能。


溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網站地圖xml | 網站地圖html
欧美婷婷久久五月精品三区| 两个人hd高清在线观看| eeuss影院在线播放| 四虎成人精品| 欧美老女人性开放| 久久久精品国产一区二区三区| 欧美婷婷久久| 中文字幕欧美日韩一区二区| 伊人青青综合网| 欧美激情视频网址| 成人情趣视频网站| 色琪琪综合男人的天堂aⅴ视频| 日韩黄色片网站| 妺妺窝人体色www在线下载| 911精品国产一区二区在线| 99精品人妻少妇一区二区| 精品一区精品二区高清| 黄色一级大片在线免费观看| 亚洲缚视频在线观看| 国产iv一区二区三区| 厕沟全景美女厕沟精品| 国产伦精品一区二区三区四区视频| 久久久国产高清| 国产综合av在线| 久久久久国产精品厨房| 亚洲欧美自拍一区| 日韩福利一区二区三区| 免费成人看片| 欧美做a欧美| 久久久久综合一区二区三区| 最新日韩免费视频| 菠萝蜜视频在线观看一区| 欧美午夜视频在线观看| 中文字幕一区二区三区在线播放| 欧美一级二级三级九九九| 羞羞的视频在线观看| ●精品国产综合乱码久久久久| 欧美日韩亚洲天堂| 精品一区二区综合| eeuss国产一区二区三区四区| 超碰中文在线| 可以直接在线观看的av| 日韩二区三区| 国产成人精品久久久| 国产精品福利在线播放| 九色自拍麻豆| 成人小视频在线观看免费| 中文字幕av高清片| 欧美精品久久一区二区三区| 亚洲精品久久久久久无码色欲四季| 欧美日韩精品免费看| 亚洲产国偷v产偷v自拍涩爱| 又大又长粗又爽又黄少妇视频| 欧美女人交a| 亚洲一区二区三区香蕉| 18涩涩午夜精品.www| 亚洲第一香蕉网| 欧美日韩精品三区| 久久蜜桃香蕉精品一区二区三区| 天天色天天爽| 理论视频在线观看| 日韩精品免费在线播放| 18免费在线视频| 最新版天堂中文在线官网| 久久久久久久久久久99| 久草视频免费播放| 日韩精品视频在线观看网址| 蜜桃91精品入口| 91社区在线| 久久久高清一区二区三区| 日日噜噜噜夜夜爽爽狠狠| 欧美激情在线一区二区三区| 真实国产乱子伦对白视频| 日韩欧美伦理电影院| 一区二区三区四区免费视频| 99久久久无码国产精品性色戒| 性色国产成人久久久精品| 最近中文字幕免费在线观看| 阿v天堂2018| 日本人体一区二区| 91麻豆精品国产91| 欧美一级淫片a免费视频| 亚洲电影免费| 成人毛片免费| 狠狠干 狠狠操| 波多野结衣在线中文| 国产亚洲高清一区| 国产日韩视频在线| 久久久欧美精品sm网站| 欧美美女黄视频| 日韩一级黄色大片| 69xxxx欧美| 婷婷激情四射网| 欧美日韩一区二区区别是什么| 精品亚洲夜色av98在线观看| 精品国产乱码久久久久久1区2区| 高清av电影| 一区二区不卡视频在线观看| 欧美一区免费视频| 国产电影一区二区三区爱妃记| 日本免费一区二区三区最新| 国产欧美日韩专区| 日韩欧美中文字幕公布| 亚洲精品成人久久久| 久草在线在线| 噜噜噜天天躁狠狠躁夜夜精品| 久久精品91久久久久久再现| 国产欧美日韩亚洲| 国产永久免费| 99热在线播放| 亚洲精品88| 午夜精品一区二区三区视频免费看| 少妇人妻在线视频| 国产精品久久久久久久久果冻传媒| 久久三级视频| 99riav国产| 99成人在线| 国产激情欧美| 欧美电影免费播放| ...av二区三区久久精品| 天堂中文在线观看| 亚洲欧美激情精品一区二区| 免费的黄网站在线观看| 久久久免费av| 欧美精品tushy高清| 91成人网在线观看| 亚州欧美精品suv| 国产永久免费| 欧美国产高跟鞋裸体秀xxxhd| 亚洲第一综合| 国产精品熟妇一区二区三区四区| 欧美aaa一级片| 精品国产制服丝袜高跟| 欧美专区一二三| 日韩高清国产一区在线观看| www.中文字幕av| 国产真实乱子伦| 99t1这里只有精品| 欧美亚洲一级| 欧美日韩精品系列| 国产成人高潮免费观看精品| 一区二区三区欧美亚洲| 久久久久久久亚洲精品| 污污免费在线观看| 亚洲国产精品资源| 久久久国产成人精品| 欧美午夜精品电影| 麻豆成人在线视频| 天堂视频福利| 日韩久久久久久| 国产精品影片在线观看| 欧美偷拍第一页| 在线看成人av| 亚洲а∨天堂久久精品喷水| 亚洲一区二区三区自拍| av2014天堂网| 天堂精品视频| 国产高清免费在线观看| 无夜福利视频观看| 最新日韩一区| 日本婷婷久久久久久久久一区二区| 欧美激情一区二区三区四区| 特一级黄色录像| 三级毛片网站| 4444在线观看| 91直播在线观看| yjizz视频网站在线播放| 国产成人精品日本亚洲11| 麻豆免费在线观看视频| 无码人妻久久一区二区三区不卡| 日韩一区二区三区观看| 日韩小视频在线观看专区| av免费在线网址| 最色在线观看| 夫妻av一区二区| 一级做a爰片久久毛片美女图片| 激情开心成人网| 中文官网资源新版中文第二页在线观看| 91欧美激情另类亚洲| 色欲av无码一区二区三区| 中文字幕99页| blackedav金发美女大战黑人| 免费高清在线观看免费| 色婷婷综合视频在线观看| 韩国福利在线| 亚洲精品第一国产综合野草社区| 91九色国产在线| 北条麻妃高清一区| 国产精品h视频| 免费看日本黄色| 欧美精品aaaa| 丝袜亚洲精品中文字幕一区| 午夜免费久久久久| 女同视频在线观看| av成人免费| 中文字幕日韩经典| 欧洲亚洲在线| 中文av在线播放| 国产精品亚洲аv天堂网| 偷窥自拍欧美色图| 国产999精品久久久影片官网| 色综合天天综合网国产成人网| 美女网站视频在线| 亚洲黄页在线观看| 麻豆成人在线播放| 艳妇荡乳欲伦69影片| 三级欧美韩日大片在线看| 国产乱淫a∨片免费观看| 国产秀色在线www免费观看| 国产伦精品一区二区三区四区视频| 日本三级中文字幕在线观看| 三级影片在线观看欧美日韩一区二区| 在线精品高清中文字幕| 国产在线资源一区| 99re6这里有精品热视频| 99re在线视频| 99久久精品99国产精品| 最近中文字幕在线观看| 一区二区三区黄| 欧美激情在线免费观看| 一区二区蜜桃| 免费人成网ww777kkk手机| 在线播放一区二区三区| 国产精品久久久久av福利动漫| 手机在线观看国产精品| 久久9精品区-无套内射无码| www.夜夜操.com| 在线国产一级| 四虎视频在线精品免费网址| 国产精品福利av| 91免费精品国偷自产在线| 色妹子一区二区| 任你操在线观看| 成人福利视频网| 久久久久久女乱国产| 欧美日韩成人在线观看| 欧美激情一区二区三级高清视频| 国产极品精品在线观看| 在线观看国产一级片| 亚洲小说欧美另类激情| 国产一区三区三区| 精品国产亚洲AV| 色欲人妻综合网| 91青青草免费在线看| 一道本在线观看视频| 久久久久久久97| av在线一区二区| 久久精品av麻豆的观看方式| 欧美国产日韩激情| 成人在色线视频在线观看免费大全| 免费不卡视频| 国产精品v一区二区三区| 国产精品视频首页| 国产精品一区=区| 在线视频你懂得| 在线a免费观看| 欧美精品丝袜中出| 日韩乱码在线观看| 伊人色综合一区二区三区影院视频| 久久久久久久伊人| 2021av在线| 欧美国产日韩在线视频| 日本xxxx免费| av无码久久久久久不卡网站| 91免费国产视频网站| 欧美日韩国产区| 日韩精品成人在线观看| 红杏一区二区三区| se视频在线观看| 噜噜噜在线观看免费视频日韩| 国产一区二区三区精品在线观看| 欧美人狂配大交3d怪物一区| 激情五月俺来也| 韩国美女久久| 亚洲自拍第二页| 色婷婷综合久久久久久| 欧洲精品一区| 精品国产一区二区国模嫣然| 一级做a爰片性色毛片视频| 国产亚洲精品久久久久久打不开| 天天干 夜夜操| 麻豆传媒视频在线观看| www在线观看播放免费视频日本| 日本按摩中出| 中文字幕日韩久久| 亚洲自拍偷拍一区二区| 91久久久久久久久久久久| 国产小黄视频| 亚洲一区二区三区四区五区六区| 国产 中文 字幕 日韩 在线| 三区精品视频观看| 久久99精品久久久久久秒播放器| 免费黄色的网站| 一本大道久久加勒比香蕉| 国产成人鲁色资源国产91色综| 本田岬高潮一区二区三区| 日韩专区一卡二卡| 操她视频在线观看| 少妇高潮一区二区三区| www成人免费视频| 天堂资源中文在线| 亚洲色欲色欲www在线观看| 精品国产三区在线| 国产精品免费精品自在线观看| 国产女同性恋一区二区| 巨胸喷奶水www久久久免费动漫| 成人免费在线视频观看| 久久中文字幕电影| 亚洲一级片av| jizzjizzjizzjizz日本老师| 国产午夜精品美女视频明星a级| 欧美三级在线观看视频| 久久久91精品| 久久婷婷成人综合色| 亚洲国产精品综合| 日韩欧美亚洲另类制服综合在线| 欧美性三三影院| 欧美日韩亚洲综合| 可以看av的网站久久看| а√天堂www在线а√天堂视频| 手机看片久久| 99riav视频| 日韩美女在线看| 国产在线一区二区视频| 999视频精品| 高清国产mv在线观看| 欧美色就是色| 久久av资源网|