天天看点

SQL那些事儿(十二)--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 GetTableProc(string procName)  
        {  
            return (GetTable(procName, null, CommandType.StoredProcedure));  
        }  
        public static DataTable GetTableProc(string procName, OracleParameter[] pas)  
        {  
            return (GetTable(procName, pas, CommandType.StoredProcedure));  
        }  
        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 getDataSetProc(string procName)  
        {  
            return (GetDataSet(procName,null,CommandType.StoredProcedure));  
        }  
        public static DataSet getDataSetProc(string procName,OracleParameter[]pas)  
        {  
            return (GetDataSet(procName, pas, CommandType.StoredProcedure));  
        }  
  
  
        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 
    */  
    }  
   }