精华内容
下载资源
问答
  • DataReader

    2016-05-26 15:17:00
    DataReader提供了一种只读的、只向前的数据访问方法,因此在访问比较复杂的数据,或者只是想显示某些数据时,DataReader再适合不过了。  datareader对象提供只读单向数据的快速传递,单向:您只能依次读取下一条...

    含义

      使用DataReader是一个比较节省服务器资源的选择。DataReader提供了一种只读的、只向前的数据访问方法,因此在访问比较复杂的数据,或者只是想显示某些数据时,DataReader再适合不过了。

      datareader对象提供只读单向数据的快速传递,单向:您只能依次读取下一条数据;只读:DataReader中的数据是只读的,不能修改;相对地,DataSet中的数据可以任意读取和修改。

      DataReader相比于DataSet,DataReader是一个抽象类,所以不能用DataReader DR = new DataReader(),来构造函数创建对象,如果要创建一个DataReader对象,必须通过command对象的ExecuteReader方 法。

    DataReader对象访问数据的方式,只能顺序读取数据,而且不能写入数据(这点DataSet占据绝对的优势),所谓的顺序读取数据是将数据表中的 行从头至尾一次读出。DataReader被创建时,纪录指针在表的最前端,可以使用Read方法每次从表中读取一条纪录。

    DataSet存的是二维数组,而DataReader存的是一维数组。而且DataSet采用的是非连接的传输模式访问数据源,一旦用户所请求的数据读入DataSet,与数据库的连接就关闭,而DataReader则要时刻保持与数据库连接状态。

    优点

      节省服务器资源,占用内存少

      指针方式,只读、单向

    重要属性

      FieldCount: 只读,表示纪录中有多少字段
      HasMoreResults: 表示是否有多个结果,本属性和SQL Script 搭配使用。
      HasMoreRows: 只读,表示是否还有资料未读取
      IsClosed: 只读,表示DataReader 是否关闭
      Item: 只读,本对象是集合对象,以键值(Key)或索引值(Index)的方式取得纪录中某个字段的数据
      RowFetchCount: 用来设定一次取回多少笔记录,预设值为1 笔

    常用方法

      Close():关闭DataReader对象

      GetValue(col):获取序号为col的列的值

      GetValues(values):获取所有字段的值,并将字段值存放到values数组中。

        GetValues(values)方法原来我不会用,特别是对于这个values数组是哪里来的,以及如果自定义该定义为什么类型呢,后来百度就知道 了,用这个方法之前,Object[] values = new Object[sqlrd.FieldCount];这个是定义values数组的方法前提。

      Read():读取下一条纪录,返回布尔型,返回true,则表示有下一条纪录。一般这个方法与while()循环一起用。是DataReader对象最重要的一个方法。

      GetDataTypeName(col) :获取序号为col的列的来源数据类型名

      GetFieldType(col) :获取序号为col的列的数据类型,一般显示会是System.**

      GetName(col): 获取序号为col的列的字段名

      GetOrdinal(name) :获取字段名为name的列的序号

    示例

       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] + "&nbsp;" + reader[1] + "&nbsp;" + reader[2] + "</P>");
            }
            reader.Close();
          }
          catch(SqlException ex)
          {
            Response.Write(ex.Message);
          }
          finally
          {
            Conn.Close();
          }

      

      上面的代码使用的是序数索引器,还可以使用列名索引器:

      Response.Write("<P>" + reader["EmployeeID"] + "&nbsp;" + reader["LastName"] + "&nbsp;" + reader["BirthDate"] + "</P>");


      此外,还可以使用类型访问方法:

      Response.Write("<P>" + reader.GetSqlInt32(0).ToString() + "&nbsp;" + reader.GetSqlString(1).ToString() + "&nbsp;" + reader.GetSqlDateTime(2).ToString() + "</P>");

     


      三种方法最终的结果都一样,但是哪种方法性能更好,速度更快呢?

      答案是

    类型访问 > 序数索引器 > 列名索引器

      序数索引是通过列的序数来访问列值的,这种方法不必从行中查找列,而是直接跳到指定的列中进行访问,因而比较省资源,速度较快。

      列名索引是通过列的名称来访问列值的,这种方法虽然速度一般,但是它使得代码更易读,因而更易维护,降低了成本。

      类型访问和序数索引比较相像,它也包含序数,但它同时指定了数据类型,减少了额外的工作,因而使速度更快,类型更安全。

      这里要提到的是,由于我们使用的是MSDE(SQL Server 2000),而.Net Framework提供了专门为SQL Server 7.0及以上版本设计的优化类型方法,所以我们使用了GetSqlInt32、GetSqlString、GetSqlDateTime等优化方法,更为 通用的是GetInt32、GetString、GetDateTime等。

      GetSqlInt32、GetSqlString、GetSqlDateTime等方法返回的是SqlTypes对象,比 如,GetSqlInt32方法返回的是System.Data.SqlTypes.SqlInt32类型而不是System.Int32对象,后者才是 GetInt32方法返回的对象,所以我们在每个方法后再调用了ToString方法进行转换,这样才能使用"+"连接,然后输出。 

     

    转载于:https://www.cnblogs.com/panpanwelcome/p/5531271.html

    展开全文
  • DataReader实体自动映射
  • DataReader对象

    2019-10-04 17:08:32
    DataReader对象用于从数据库中获取仅向前的只读数据流,由于在内存一次只存放一行数据,因此使用DataReader对象可提高应用程序的性能,大幅度减少对内存的需求。 protectedvoidPage_Load(objectsender,EventArgse){...
    DataReader对象用于从数据库中获取仅向前的只读数据流,由于在内存一次只存放一行数据,因此使用DataReader对象可提高应用程序的性能,大幅度减少对内存的需求。
    protected   void  Page_Load( object  sender, EventArgs e)
        {
            OleDbConnection conn 
    =   new  OleDbConnection();
            conn.ConnectionString 
    =   " Provider=Microsoft.Jet.OLEDB.4.0; "   +
                
    " Data Source= "   +  Server.MapPath( " person.mdb " );
            conn.Open();
            
    string  strSQL  =   " select * from grade " ;
            OleDbCommand Comm 
    =   new  OleDbCommand(strSQL, conn);
            OleDbDataReader dr 
    =  Comm.ExecuteReader();
            
    string  html  =   " <table border=1> " ;
            html 
    +=   " <tr> " ;
            html 
    +=   " <td><b>学号</b></td> " ;
            html 
    +=   " <td><b>姓名</b></td> " ;
            html 
    +=   " <td><b>数学</b></td> " ;
            html 
    +=   " </tr> " ;
            
    try
            {
                
    while  (dr.Read())
                {
                    html 
    +=   " <tr> " ;
                    html 
    +=   " <td> "   +  dr[ " 学号 " ].ToString()  +   " </td> " ;
                    html 
    +=   " <td> "   +  dr[ " 姓名 " ].ToString()  +   " </td> " ;
                    html 
    +=   " <td> "   +  dr[ " 数学 " ].ToString()  +   " </td> " ;
                    html 
    +=   " </tr> " ;
                }
                html 
    +=   " </table> " ;
            }
            
    finally
            {
                dr.Close();
                conn.Close();
            }
            Response.Write(html);
        }

    转载于:https://www.cnblogs.com/qixin622/archive/2007/05/23/756630.html

    展开全文
  • DataReader只读

    千次阅读 2016-08-07 00:28:55
    说到DataReader只读时候,我们就会联想到这个函数经常与Command搭配使用。 Command中有三个方法:分别是ExecuteNonQuery(),ExecuteScalar(),ExecuteReader()。 则其中ExecuteReader()和DataReader搭配使用,主要...

    说到DataReader只读时候,我们就会联想到这个函数经常与Command搭配使用。
    Command中有三个方法:分别是ExecuteNonQuery(),ExecuteScalar(),ExecuteReader()。
    则其中ExecuteReader()和DataReader搭配使用,主要用来读取显示大量数据。

    1. DataReader对象提供了用顺序的、只读的方式读取Command对象获得的数据结果集。正是DataReader是以顺序的方式连续读取数据,所以DataReader会以独占的方式打开数据库连接

    2. DataReader只执行读操作,每次只在内存缓冲区里存储结果集中的读取一行数据,所以DataReader对象的效率比较高。如果只是查询大量的数据,不做任何修改的话。DataReader是个优先选择。

    3. DataReader常用的属性
      ① FieldCount属性 : 表示里面有多少列字段
      ② HasRows属性 : 表示里面是否包含有数据
      ③ IsClosed : 表示DataReader是否关闭

    4. DataReader常用的方法
      ① Close(); : 将DataReader对象关闭。
      ② GetDataTypeName(); : 获取指定列字段的数据类型
      ③ GetName(); : 获取指定获取列名称
      ④ GetOrdinal(); : 获取指定列字段名称在表中的顺序
      ⑤ GetValue(); : 获取指定当前列字段的数据
      ⑥ GetValues(); : 获取当前所有列值来填充对象数组
      Read(); : 读取下一行数据
      其中Read()比较重要,在每次使用DataReader进行输出或者赋值时都需要进行读取下一行,不然会出现异常“在没有任何数据时进行无效的读取尝试”,原因是:DataReader每次都是执行数据之上的位置,所以每次执行前都需要进行Read()。

    说这么多,我们用代码来解析这些属性和方法的用法吧。
    下面以DataGridVied数据表格控件和ListView表格控件来读取数据。
    首先链接数据库

     string strcon = "server = XQ-20160210KQLE\\SA;uid = sa;pwd = 123456;database = JYXinXi";
     SqlConnection conn = new SqlConnection(strcon);
     conn.Open();

    DataGridView读取数据,采用DataReader

                    string selec = "select * from Staff";
                    SqlCommand com = new SqlCommand(selec, conn);
                    SqlDataReader dr = com.ExecuteReader();
    
                    //HasRows; 表示里面是否包含数据
                    //GetName(int i); 表示获取列名称
                    //GetDataTypeName(int i); 表示获取列字段数据类型
                    //FieldCount; 表示里面有多少列字段
                    //GetValues(object[] values); 表示使用当前列值来填充对象数组
                    if (dr.HasRows)
                    {
                        DataTable dt = new DataTable();
                        //因为DataGridView接受的是Table类型的表,所以需要创建一个DataTable
                        dt.Columns.Add("姓名", Type.GetType("System.String"));
                        dt.Columns.Add("职业", Type.GetType("System.String"));
                        dt.Columns.Add("性别", Type.GetType("System.String"));
                        dt.Columns.Add("年龄", Type.GetType("System.Int32"));
                        dt.Columns.Add("求职网址", Type.GetType("System.String"));
                        dt.Columns.Add("民族", Type.GetType("System.String"));
    
                        while (dr.Read())//执行下一行
                        {
                            //DataReader 每次只能存储一条数据
                            object[] myobj = new object[dr.FieldCount];
                            //每次只给数组填充一行的数据
                            dr.GetValues(myobj);
                            //行数据添加到表中
                            dt.Rows.Add(myobj);
                            dataGridView1.DataSource = dt;//每次填充完毕刷新到DataGridView表格中显示
                        }
    
                        dr.Close();//关闭DataReader链接

    ListView读取数据,采用DataReader

                    //设置ListView表格属性
                    listView1.GridLines = true;//网格线
                    listView1.View = View.Details;//视图
                    listView1.FullRowSelect = true;//单击某项,是否选中所有子项
                    listView1.Scrollable = true;//滚动条
    
                    //设置Commnd和DataReader搭配使用
                    string listview = "select * from Staff";
                    SqlCommand listviewcomm = new SqlCommand(listview, conn);
                    SqlDataReader listviewdr = listviewcomm.ExecuteReader();
    
                    //创建列标题
                    //第一种
                    ColumnHeader column2 = new ColumnHeader();
                    column2.Text = listviewdr.GetName(0);
                    ColumnHeader column3 = new ColumnHeader();
                    column3.Text = listviewdr.GetName(1);
                    ColumnHeader column4 = new ColumnHeader();
                    column4.Text = listviewdr.GetName(2);
                    ColumnHeader column5 = new ColumnHeader();
                    column5.Text = listviewdr.GetName(3);
                    ColumnHeader column6 = new ColumnHeader();
                    column6.Text = listviewdr.GetName(4);
                    ColumnHeader column7 = new ColumnHeader();
                    column7.Text = listviewdr.GetName(5);
                    listView1.Columns.AddRange(new ColumnHeader[] { column2, column3, column4, column5, column6, column7 });
                    //第二种
                    //listView1.Columns.Add(listviewdr.GetName(0));
                    //listView1.Columns.Add(listviewdr.GetName(1));
                    //listView1.Columns.Add(listviewdr.GetName(2));
                    //listView1.Columns.Add(listviewdr.GetName(3));
                    //listView1.Columns.Add(listviewdr.GetName(4));
                    //listView1.Columns.Add(listviewdr.GetName(5));
    
                    //设置表格内容
                    object[] obj = new object[listviewdr.FieldCount];
                    while (listviewdr.Read())
                    {
                        ListViewItem lvi = new ListViewItem();
                        listviewdr.GetValues(obj);//DataReader里面的数据存入数组中
                        string[] listviewstr = new string[listviewdr.FieldCount];//创建数组,AddRange使用
                        for (int i = 1; i < listviewstr.Length; i++)
                        {
                            listviewstr[i] = obj[i].ToString();//把obj元素赋值给listviewstr
                        }
                        lvi.SubItems[0].Text = obj[0].ToString();//母项第一列须这样编写
                        lvi.SubItems.AddRange(listviewstr);
                        listView1.Items.Add(lvi);
                    }
                    listviewdr.Close();

    看了以上两种控件表格的显示代码后,我用DataAdapter数据适配器显示数据

                    DataSet ds = new DataSet();//创建一个DataSet
                    string strda = "select * from Staff";//sql查询语句
                    SqlDataAdapter da = new SqlDataAdapter(strda, strcon);//实例适配器
                    da.Fill(ds, "员工表");//填充表格数据
                    DataGridView1.DataSource = ds.Table[0];
    展开全文
  • datareader对象

    2009-09-02 21:39:09
    ado.net中的datareader对象使用范例
  • datareader分页

    2017-09-19 15:58:55
    项目中有对未知数据源获取数据用于展示的需求,用dapper和datareader来分页,处理起来比较方便些。c#方法: public object View(string dbLinkId, int rows = 0, int page = 0) { Models.DBC.DataLink.DataLink ...

    项目中有对未知数据源获取数据用于展示的需求,用dapper和datareader来分页,处理起来比较方便些。

    c#方法:

     public object View(string dbLinkId, int rows = 0, int page = 0)
            {
                Models.DBC.DataLink.DataLink info = Get(dbLinkId);
                Models.Integrate.DataBase dbsrc = new Integrate.DBSrcImpl().Get(info.DbsrcId) as Models.Integrate.DataBase;
    
                DynamicParameters p;
                string sql = getSql(dbLinkId, dbsrc, out p);
    
                int start = 0;
                if (page == 0)
                {
                    page = 1;
                }
                if (rows == 0)
                {
                    rows = 20;
                }
                start = (page - 1) * rows;
                int end = start + rows;
    
                int totalCount = 0;
    
                try
                {
                    using (DbConnection conn = DapperFactory.CreateConnection(dbsrc))
                    {
                        string countsql = string.Format("select count(0) from({0})t", sql);
                        int count = conn.ExecuteScalar<int>(countsql, p);
    
                        DataTable dt = new DataTable();
                        IDataReader reader = conn.ExecuteReader(sql, p);
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            dt.Columns.Add(reader.GetName(i));
                        }
    
                        while (reader.Read())
                        {
                            totalCount++;
                            if (totalCount > end)
                                break;
                            if (totalCount >= start && totalCount <= end)
                            {
                                DataRow r = dt.NewRow();
                                for (int i = 0; i < reader.FieldCount; i++)
                                {
                                    r[i] = reader[i];
                                }
                                dt.Rows.Add(r);
                            }
                        }
    
                        return Common.DataGrid(dt, count);//转成easyui datagrid数据源格式
                    }
                }
                catch (Exception e)
                {
                    throw new Exception(string.Format("查询源数据库出错<br>原因:{0}<br>sql语句:{1}", e.Message, sql));
                }
            }

    js:

      function getdata(id,r,p) {
            var rows = 50;
            var page = 1;
            if (r) rows = r;
            if (p) page = p;
    
            $.post('/dblink/ListView', { id: id, rows: rows, page: page }, function (data) {
                accecpResult(data, function () {
                    var ds = data.data.rows;
                    var columns = [[]];
                    if (ds.length > 0) {
                        for (var key in ds[0]) {
                            columns[0].push({ field: key, title: key });
                        }
                    }
    
                    tab_view.datagrid({
                        data: data.data,
                        rownumbers: true,
                        singleSelect: true,
                        striped: true,
                        fit: true,
                        border: false,
                        pagination: true,
                        pageSize: 50,
                        columns: columns
                    });
                    var p = tab_view.datagrid('getPager');
                    (p).pagination({
                        pageNumber: page,
                        beforePageText: '第',
                        afterPageText: '页    共 {pages} 页',
                        displayMsg: '共{total}条数据',
                        onSelectPage: function (pageNumber, pageSize) {
                            getdata(id, pageSize, pageNumber);
                        }
                    });
                })
            })
    
        }
    
    展开全文
  • DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection(俗称:非断开式连接),在线操作数据库时,任何对SqlConnection的操作都会引发DataReader的异常。下面同本文对dataset与datareader的区别...
  • DataReader用法

    2015-11-20 08:44:00
    DataReader相比于DataSet,DataReader是一个抽象类,所以不能用DataReader DR = new DataReader(),来构造函数创建对象,如果要创建一个DataReader对象,必须通过command对象的ExecuteReader方法。 DataReader对象...
  • DataReader使用

    2015-07-03 15:11:00
    DataReader相比于DataSet,DataReader是一个抽象类,所以不能用DataReader DR = new DataReader(),来构造函数创建对象,如果要创建一个DataReader对象,必须通过command对象的ExecuteReader方法。 DataReader对象...
  • 转载 /// <summary> /// DataReader转DataTable /// </summary> /// <param name="dataReader"></param> /// <returns></returns> ...
  • pandas-datareader

    2021-05-17 23:48:09
    pandas-datareader介绍 Pandas库提供了专门从财经网站获取金融数据的API接口,可作为量化交易股票数据获取的另一种途径,该接口在urllib3库基础上实现了以客户端身份访问网站的股票数据。需要注意的是目前模块已经...
  • datareader和dataset

    2019-09-30 13:01:18
    datareader和dataset 用DataReader、DataSet、DataAdapter和DataView ADO.NET提供两个对象用于检索关系型数据并把它存储在内存中,分别是DataSet和DataReader。DataSet提供内存中关系数据的表现--包括表和...
  • ado。 dataReader

    2013-04-27 14:38:24
    数据库的连接 对象是DataReader
  • DataReader还是DataSet?

    2021-01-02 02:42:34
     我经常听到有人问这个问题:“在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?”在很多文章以及新闻组的贴子中我经常看到这样的误解,即认为DataReader(SqlDataReader或OleDbDataReader的缩写)...
  • 使用DataReader对象读取数据参考实例
  • DataReader、JsonReader、XmlReader的构造方法,需要的朋友可以参考下。
  • pandas_datareader-0.6.0

    2018-08-01 22:19:21
    安装pandas-datareader用的,可以用pip直接安装,不会遇到任何奇怪的问题.
  • DataReader和DataSet

    2019-10-09 03:35:57
    我经常听到有人问这个问题:“在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?”在很多文章以及新闻组的贴子中我经常看到这样的误解,即认为DataReader(SqlDataReader或OleDbDataReader的缩写)比...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,787
精华内容 10,314
关键字:

datareader