Datareader對象不能關使用new關鍵字建立。但可使用ExecuteReader()方法建立。html
DataReader是一行一行的讀取記錄的。當記錄中有數據時Read()返回TRUE,當到記錄集底部時返回FALSE。sql
重要屬性:數據庫
FieldCount:獲取當前行中的列數。安全
HasRows:獲取一個值,該值指示 SqlDataReader 是否包含一行或多行。服務器
NextResul:當執行的是sql存儲程序,或是可返回多個結果集的批處理sql語句時,該方法將當前行指針移到下一個結果集ide
(該操做將當前行指針從第一行的一個行集移到下一個行集)。性能
重要方法:優化
GetInt16(),GetString(),GetDataTime()使用這些方法能夠讀取行中某列的值,並以相應的.Net類型返回。ui
GetValue():能夠讀取行中某列的值,不過返回的是object類型的值。spa
GetName():返回行中某列的列名。
示例(轉載):
來源:http://www.cnblogs.com/chengbo/articles/87671.html
當咱們鏈接到數據庫,進行了想要的查詢之後,就能夠在網頁上顯示它們。使用DataReader是一個比較節省服務器資源的選擇。DataReader提供了一種只讀的、只向前的數據訪問方法,所以在訪問比較複雜的數據,或者只是想顯示某些數據時,DataReader再適合不過了。
DataReader是一個抽象類,所以不能直接實例化,要經過Command對象的ExecuteReader方法來創建。
下面是個例子:
private void Page_Load(object sender, System.EventArgs e) { SqlConnection Conn = new SqlConnection("server=.;database=northwind;uid=sa;pwd=chengbo;"); SqlCommand Comm = new SqlCommand("SELECT EmployeeID, LastName, BirthDate FROM Employees", Conn); try { Conn.Open(); SqlDataReader reader = Comm.ExecuteReader(); while(reader.Read()) { //此處使用序數索引器 Response.Write("<P>" + reader[0] + " " + reader[1] + " " + reader[2] + "</P>"); } reader.Close(); } catch(SqlException ex) { Response.Write(ex.Message); } finally { Conn.Close(); } }
上面的代碼使用的是序數索引器,還可使用列名索引器:
Response.Write("<P>" + reader["EmployeeID"] + " " + reader["LastName"] + " " + reader["BirthDate"] + "</P>");
此外,還可使用類型訪問方法:
Response.Write("<P>" + reader.GetSqlInt32(0).ToString() + " " + reader.GetSqlString(1).ToString() + " " + reader.GetSqlDateTime(2).ToString() + "</P>");
三種方法最終的結果都同樣,可是哪一種方法性能更好,速度更快呢?
答案是
類型訪問 > 序數索引器 > 列名索引器
序數索引是經過列的序數來訪問列值的,這種方法沒必要從行中查找列,而是直接跳到指定的列中進行訪問,於是比較省資源,速度較快。
列名索引是經過列的名稱來訪問列值的,這種方法雖然速度通常,可是它使得代碼更易讀,於是更易維護,下降了成本。
類型訪問和序數索引比較相像,它也包含序數,但它同時指定了數據類型,減小了額外的工做,於是使速度更快,類型更安全。
這裏要提到的是,因爲咱們使用的是MSDE(SQL Server 2000),而.Net Framework提供了專門爲SQL Server 7.0及以上版本設計的優化類型方法,因此咱們使用了GetSqlInt3二、GetSqlString、GetSqlDateTime等優化方法,更爲通用的是GetInt3二、GetString、GetDateTime等。
GetSqlInt3二、GetSqlString、GetSqlDateTime等方法返回的是SqlTypes對象,好比,GetSqlInt32方法返回的是System.Data.SqlTypes.SqlInt32類型而不是System.Int32對象,後者纔是GetInt32方法返回的對象,因此咱們在每一個方法後再調用了ToString方法進行轉換,這樣才能使用"+"鏈接,而後輸出。
下面是System.Data.SqlTypes 命名空間爲 SQL Server 內的本機數據類型提供類。這些類提供了一種較之其餘數據類型更安全、更快捷的方法。在可能丟失精度的狀況下,在此命名空間中使用這些類有助於防止產生類型轉換錯誤。因爲其餘數據類型在幕後與 SqlTypes 進行相互轉換,因此在此命名空間內顯式建立和使用對象將會使代碼更快。
示例2:
來源:http://www.cnblogs.com/wiseman/archive/2004/11/26/69249.html
演示DataReader的各項操做 //*********************************************************** //*名稱:一個程序詳細研究DataReader,同時顯示Command用法 //*功能:演示DataReader的各項操做。 //*********************************************************** using System; using System.Data; using System.Data.SqlClient; using System.Data.OleDb; class SqlReader { const string connStr = "data source=bineon;user id=sa;password=87345587;initial catalog=contract"; SqlConnection conn; public SqlReader() { conn = new SqlConnection(connStr); } //************************************** //*演示DataReader的兩種取值方法 //************************************** public void basicReader() { string sql="select * from friend"; SqlCommand cmd; cmd = conn.CreateCommand(); cmd.CommandText = sql; conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); while(reader.Read()) { Console.WriteLine("No:{0}\tName:{1}\tPhoneNum:{2},\tAddress:{3}",reader.GetInt32(0).ToString(),reader.GetString(1),reader[2].ToString(),reader["Faddress"].ToString()); } showSplit(); reader.Close(); conn.Close(); } //************************************** //*演示帶參數查詢的操做,使用SqlCilent //************************************** public void hasParamReader() { SqlCommand cmd; cmd = conn.CreateCommand(); string sql = "select Fname,Fphone,Faddress from friend where Fid > @Fid"; cmd.CommandText = sql; SqlParameter param = new SqlParameter("@Fid",SqlDbType.Int,4); param.Value = 15; cmd.Parameters.Add(param); conn.Open(); //當關閉reader的時候同時關閉數據庫鏈接 SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); while(reader.Read()) { Console.WriteLine("Name:{0}\tPhoneNum:{1}\tAddress:{2}",reader.GetString(0),reader.GetString(1),reader.GetString(2)); } showSplit(); //無需關閉conn,系統會自動調用這個方法來關閉conn的。 reader.Close(); } //************************************** //*演示帶參數查詢的操做,使用OleDb //************************************** public void hasOledbParamReader() { SqlCommand cmd; cmd = conn.CreateCommand(); string sql = "select Fname,Fphone,Faddress from friend where Fid > ?"; string oledbConnStr = "Provider=sqloledb;" + connStr; OleDbConnection oleConn = new OleDbConnection(oledbConnStr); OleDbCommand oleCmd = new OleDbCommand(sql,oleConn); oleCmd.Parameters.Add("nothing",15); oleConn.Open(); OleDbDataReader oleReader = oleCmd.ExecuteReader(); while(oleReader.Read()) { Console.WriteLine("Name:{0}\tPhoneNum:{1}\tAddress:{2}",oleReader.GetString(0),oleReader.GetString(1),oleReader.GetString(2)); } showSplit(); oleReader.Close(); oleConn.Close(); } //************************************** //*演示存儲過程的輸出參數 //************************************** public void outParamShow() { SqlCommand cmd; cmd = conn.CreateCommand(); cmd.CommandText = "GetInfo"; cmd.CommandType = CommandType.StoredProcedure; 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; conn.Open(); cmd.ExecuteNonQuery(); string Fname = cmd.Parameters["@Fname"].Value.ToString(); string Fphone = cmd.Parameters["@Fphone"].Value.ToString(); Console.WriteLine(Fname + " " + Fphone); conn.Close(); showSplit(); } //************************************** //*演示讀取多個無關記錄集 //************************************** public void multiResult() { SqlCommand cmd; cmd = conn.CreateCommand(); string sqla = "select Fname from friend"; string sqlb = "select Fphone from friend"; cmd.CommandText = sqla + ";" + sqlb; 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()); //NextResult()移動到下一個記錄集 reader.Close(); conn.Close(); showSplit(); } //************************************** //*使用DataReader得到數據庫模式信息 //************************************** public void getSchema() { SqlCommand cmd; cmd = conn.CreateCommand(); string sql = "select Fid,Fname,Fphone from friend"; cmd.CommandText = sql; conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); DataTable SchemaTable = reader.GetSchemaTable(); 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()); } } reader.Close(); conn.Close(); showSplit(); } //************************************** //*從數據庫讀取二進制數據的代碼段 //*該代碼段只是讀取二進制的片段,不是 //*整個程序,因此不能執行,你能夠把它 //*集成到你的WinForm項目裏面。 //************************************** public void getBinary() { /* 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); */ } //添加輸出分隔 private void showSplit() { Console.WriteLine("\n********************************************************************\n"); } public static void Main(string [] args) { SqlReader sqlreader = new SqlReader(); sqlreader.basicReader(); sqlreader.hasParamReader(); sqlreader.hasOledbParamReader(); sqlreader.outParamShow(); sqlreader.multiResult(); sqlreader.getSchema(); } }