当前位置:数据库 > > 正文

dataset详解(DATASET 与 DATAREADER对象有什么区别)

时间:2022-01-25 00:12:59类别:数据库

dataset详解

DATASET 与 DATAREADER对象有什么区别

 DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection(俗称:非断开式连接),在线操作数据库时,任何对SqlConnection的操作都会引发DataReader的异常。因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的。由于DataReader的特殊性和高性能,所以DataReader是只进的,你读了第一条后就不能再去读取第一条了。 DataSet则是将数据一次性加载在内存中,抛弃数据库连接(俗称:断开式连接)。读取完毕即放弃数据库连接,因为DataSet将数据全部加载在内存中,所以比较消耗内存。但是确比DataReader要灵活,可以动态的添加行,列,数据,对数据库进行回传,更新操作等。

使用DataReader与DataSet都可以从数据源读取数据。DataReader本身是通过IDbCommand.ExecuteReader()方法进行构建的;而DataSet则是通过DbDataAdapter.Fill()方法进行填充。此外,两者的工作方式有明显的不同:DataReader的执行过程不能脱离数据库连接,也就是在DataReader读取数据的时候不能够使用IDbConnection.Close()方法关闭数据库连接;而在使用DataSet获取数据时,可以断开数据库的连接,因为此时DbDataAdapter已经负责将数据获取到应用服务器中了。
由于有这样的区别,所以在开发数据库相关程序时需要特别注意。例如在使用DataReader获取数据后,应该主动地关闭数据库连接,否则可能出现数据库连接池溢出的异常。

DataReader与DataSet最根本的区别就在于一个是在线处理,另一个是离线处理。在线时,得到的是数据库当前的真实数据,但总是在线的话,增加了网络的通讯负担。离线后数据拷贝在本地,可以减轻网络负担,程序处理数据更加方便,若离线时间过长,看到的数据就不一定是真实的数据了。

下面分享下自己Oracle的一个SQLHelper类,提供了两种方法获取数据,还包括存储过程等。。

  • /*xcy于11.09修改,原sqlserver的DBHelper*/ 
    using Oracle.ManagedDataAccess.Client; 
    using System; 
    using System.Collections.Generic; 
    using System.Configuration; 
    using System.Data; 
    using System.Linq; 
    using System.Web; 
    namespace JGS.Utility 
    { 
    public class SQLHelper 
    { 
    //连接字符串 
    static string strConn = ConfigurationManager.ConnectionStrings["xcyCon"].ToString(); 
    #region 执行查询,返回DataTable对象----------------------- 
    public static DataTable GetTable(string strSQL) 
    { 
    return GetTable(strSQL, null); 
    } 
    public static DataTable GetTable(string strSQL, OracleParameter[] pas) 
    { 
    return GetTable(strSQL, pas, CommandType.Text); 
    } 
    /// <summary> 
    /// 执行查询,返回DataTable对象 
    /// </summary> 
    /// <param name="strSQL">sql语句</param> 
    /// <param name="pas">参数数组</param> 
    /// <param name="cmdtype">Command类型</param> 
    /// <returns>DataTable对象</returns> 
    public static DataTable GetTable(string strSQL, OracleParameter[] pas, CommandType cmdtype) 
    { 
    DataTable dt = new DataTable(); ; 
    using (OracleConnection conn = new OracleConnection(strConn)) 
    { 
    OracleDataAdapter da = new OracleDataAdapter(strSQL, conn); 
    da.SelectCommand.CommandType = cmdtype; 
    if (pas != null) 
    { 
    da.SelectCommand.Parameters.AddRange(pas); 
    } 
    da.Fill(dt); 
    } 
    return dt; 
    } 
    #endregion 
    #region 执行查询,返回DataSet对象------------------------- 
    public static DataSet GetDataSet(string strSQL) 
    { 
    return GetDataSet(strSQL, null); 
    } 
    public static DataSet GetDataSet(string strSQL, OracleParameter[] pas) 
    { 
    return GetDataSet(strSQL, pas, CommandType.Text); 
    } 
    /// <summary> 
    /// 执行查询,返回DataSet对象 
    /// </summary> 
    /// <param name="strSQL">sql语句</param> 
    /// <param name="pas">参数数组</param> 
    /// <param name="cmdtype">Command类型</param> 
    /// <returns>DataSet对象</returns> 
    public static DataSet GetDataSet(string strSQL, OracleParameter[] pas, CommandType cmdtype) 
    { 
    DataSet dt = new DataSet(); 
    using (OracleConnection conn = new OracleConnection(strConn)) 
    { 
    OracleDataAdapter da = new OracleDataAdapter(strSQL, conn); 
    da.SelectCommand.CommandType = cmdtype; 
    if (pas != null) 
    { 
    da.SelectCommand.Parameters.AddRange(pas); 
    } 
    da.Fill(dt); 
    } 
    return dt; 
    } 
    #endregion 
    #region 执行非查询存储过程和SQL语句----------------------------- 
    public static int ExcuteProc(string ProcName) 
    { 
    return ExcuteSQL(ProcName, null, CommandType.StoredProcedure); 
    } 
    public static int ExcuteProc(string ProcName, OracleParameter[] pars) 
    { 
    return ExcuteSQL(ProcName, pars, CommandType.StoredProcedure); 
    } 
    public static int ExcuteSQL(string strSQL) 
    { 
    return ExcuteSQL(strSQL, null); 
    } 
    public static int ExcuteSQL(string strSQL, OracleParameter[] paras) 
    { 
    return ExcuteSQL(strSQL, paras, CommandType.Text); 
    } 
    /// 执行非查询存储过程和SQL语句 
    /// 增、删、改 
    /// </summary> 
    /// <param name="strSQL">要执行的SQL语句</param> 
    /// <param name="paras">参数列表,没有参数填入null</param> 
    /// <param name="cmdType">Command类型</param> 
    /// <returns>返回影响行数</returns> 
    public static int ExcuteSQL(string strSQL, OracleParameter[] paras, CommandType cmdType) 
    { 
    int i = 0; 
    using (OracleConnection conn = new OracleConnection(strConn)) 
    { 
    OracleCommand cmd = new OracleCommand(strSQL, conn); 
    cmd.CommandType = cmdType; 
    if (paras != null) 
    { 
    cmd.Parameters.AddRange(paras); 
    } 
    conn.Open(); 
    i = cmd.ExecuteNonQuery(); 
    conn.Close(); 
    } 
    return i; 
    } 
    #endregion 
    #region 执行查询返回第一行,第一列--------------------------------- 
    public static int ExcuteScalarSQL(string strSQL) 
    { 
    return ExcuteScalarSQL(strSQL, null); 
    } 
    public static int ExcuteScalarSQL(string strSQL, OracleParameter[] paras) 
    { 
    return ExcuteScalarSQL(strSQL, paras, CommandType.Text); 
    } 
    public static int ExcuteScalarProc(string strSQL, OracleParameter[] paras) 
    { 
    return ExcuteScalarSQL(strSQL, paras, CommandType.StoredProcedure); 
    } 
    /// <summary> 
    /// 执行SQL语句,返回第一行,第一列 
    /// </summary> 
    /// <param name="strSQL">要执行的SQL语句</param> 
    /// <param name="paras">参数列表,没有参数填入null</param> 
    /// <returns>返回影响行数</returns> 
    public static int ExcuteScalarSQL(string strSQL, OracleParameter[] paras, CommandType cmdType) 
    { 
    int i = 0; 
    using (OracleConnection conn = new OracleConnection(strConn)) 
    { 
    OracleCommand cmd = new OracleCommand(strSQL, conn); 
    cmd.CommandType = cmdType; 
    if (paras != null) 
    { 
    cmd.Parameters.AddRange(paras); 
    } 
    conn.Open(); 
    i = Convert.ToInt32(cmd.ExecuteScalar()); 
    conn.Close(); 
    } 
    return i; 
    } 
    #endregion 
    #region 查询获取单个值------------------------------------ 
    /// <summary> 
    /// 调用不带参数的存储过程获取单个值 
    /// </summary> 
    /// <param name="ProcName"></param> 
    /// <returns></returns> 
    public static object GetObjectByProc(string ProcName) 
    { 
    return GetObjectByProc(ProcName, null); 
    } 
    /// <summary> 
    /// 调用带参数的存储过程获取单个值 
    /// </summary> 
    /// <param name="ProcName"></param> 
    /// <param name="paras"></param> 
    /// <returns></returns> 
    public static object GetObjectByProc(string ProcName, OracleParameter[] paras) 
    { 
    return GetObject(ProcName, paras, CommandType.StoredProcedure); 
    } 
    /// <summary> 
    /// 根据sql语句获取单个值 
    /// </summary> 
    /// <param name="strSQL"></param> 
    /// <returns></returns> 
    public static object GetObject(string strSQL) 
    { 
    return GetObject(strSQL, null); 
    } 
    /// <summary> 
    /// 根据sql语句 和 参数数组获取单个值 
    /// </summary> 
    /// <param name="strSQL"></param> 
    /// <param name="paras"></param> 
    /// <returns></returns> 
    public static object GetObject(string strSQL, OracleParameter[] paras) 
    { 
    return GetObject(strSQL, paras, CommandType.Text); 
    } 
    /// <summary> 
    /// 执行SQL语句,返回首行首列 
    /// </summary> 
    /// <param name="strSQL">要执行的SQL语句</param> 
    /// <param name="paras">参数列表,没有参数填入null</param> 
    /// <returns>返回的首行首列</returns> 
    public static object GetObject(string strSQL, OracleParameter[] paras, CommandType cmdtype) 
    { 
    object o = null; 
    using (OracleConnection conn = new OracleConnection(strConn)) 
    { 
    OracleCommand cmd = new OracleCommand(strSQL, conn); 
    cmd.CommandType = cmdtype; 
    if (paras != null) 
    { 
    cmd.Parameters.AddRange(paras); 
    } 
    conn.Open(); 
    o = cmd.ExecuteScalar(); 
    conn.Close(); 
    } 
    return o; 
    } 
    #endregion 
    #region 查询获取DataReader------------------------------------ 
    /// <summary> 
    /// 调用不带参数的存储过程,返回DataReader对象 
    /// </summary> 
    /// <param name="procName">存储过程名称</param> 
    /// <returns>DataReader对象</returns> 
    public static OracleDataReader GetReaderByProc(string procName) 
    { 
    return GetReaderByProc(procName, null); 
    } 
    /// <summary> 
    /// 调用带有参数的存储过程,返回DataReader对象 
    /// </summary> 
    /// <param name="procName">存储过程名</param> 
    /// <param name="paras">参数数组</param> 
    /// <returns>DataReader对象</returns> 
    public static OracleDataReader GetReaderByProc(string procName, OracleParameter[] paras) 
    { 
    return GetReader(procName, paras, CommandType.StoredProcedure); 
    } 
    /// <summary> 
    /// 根据sql语句返回DataReader对象 
    /// </summary> 
    /// <param name="strSQL">sql语句</param> 
    /// <returns>DataReader对象</returns> 
    public static OracleDataReader GetReader(string strSQL) 
    { 
    return GetReader(strSQL, null); 
    } 
    /// <summary> 
    /// 根据sql语句和参数返回DataReader对象 
    /// </summary> 
    /// <param name="strSQL">sql语句</param> 
    /// <param name="paras">参数数组</param> 
    /// <returns>DataReader对象</returns> 
    public static OracleDataReader GetReader(string strSQL, OracleParameter[] paras) 
    { 
    return GetReader(strSQL, paras, CommandType.Text); 
    } 
    /// <summary> 
    /// 查询SQL语句获取DataReader 
    /// </summary> 
    /// <param name="strSQL">查询的SQL语句</param> 
    /// <param name="paras">参数列表,没有参数填入null</param> 
    /// <returns>查询到的DataReader(关闭该对象的时候,自动关闭连接)</returns> 
    public static OracleDataReader GetReader(string strSQL, OracleParameter[] paras, CommandType cmdtype) 
    { 
    OracleDataReader sqldr = null; 
    OracleConnection conn = new OracleConnection(strConn); 
    OracleCommand cmd = new OracleCommand(strSQL, conn); 
    cmd.CommandType = cmdtype; 
    if (paras != null) 
    { 
    cmd.Parameters.AddRange(paras); 
    } 
    conn.Open(); 
    //CommandBehavior.CloseConnection的作用是如果关联的DataReader对象关闭,则连接自动关闭 
    sqldr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
    return sqldr; 
    } 
    #endregion 
    /* 
    #region 批量插入数据--------------------------------------------- 
    /// <summary> 
    /// 往数据库中批量插入数据 
    /// </summary> 
    /// <param name="sourceDt">数据源表</param> 
    /// <param name="targetTable">服务器上目标表</param> 
    public static void BulkToDB(DataTable sourceDt, string targetTable) 
    { 
    OracleConnection conn = new OracleConnection(strConn); 
    SqlBulkCopy bulkCopy = new SqlBulkCopy(conn); //用其它源的数据有效批量加载sql server表中 
    bulkCopy.DestinationTableName = targetTable; //服务器上目标表的名称 
    bulkCopy.BatchSize = sourceDt.Rows.Count; //每一批次中的行数 
    try 
    { 
    conn.Open(); 
    if (sourceDt != null && sourceDt.Rows.Count != 0) 
    bulkCopy.WriteToServer(sourceDt); //将提供的数据源中的所有行复制到目标表中 
    } 
    catch (Exception ex) 
    { 
    throw ex; 
    } 
    finally 
    { 
    conn.Close(); 
    if (bulkCopy != null) 
    bulkCopy.Close(); 
    } 
    } 
    #endregion 
    */ 
    } 
    } 
    
  • 以上所述是小编给大家介绍的DATASET 与 DATAREADER对象有什么区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!

    上一篇下一篇

    猜您喜欢

    热门推荐