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(); } }