没有花香/没有树高

用你的激情燃烧它,明年它会更好......

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

(关注-博客园两年了不好意思,以前一直没有时间写点现在觉得应该和大家分享点东西 )
如何从SqlDataReader中read出一个datatable  基本思想是
1>根据SQL去构造一个datatable,
2>根据SQL获得read的数据类型

using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Diagnostics;
using Demo.DAL.COMM ;
namespace Demo.DAL
{
 /// <summary>
 /// DALDemo 的摘要说明。
 /// </summary>
 public class DALDemo: SQLHelper
 {
  public DALDemo()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

  public DataTable GetTable(string A_strCondition)
  {
   string  strSQL="";
   if (A_strCondition=="")
   {
      strSQL= "select top 100  UserID,UserName,Tel,PassWord,Address,Status from UserName ";
   }
   else
   {
      strSQL= "select  UserID,UserName,Tel,PassWord,Address,Status from UserName where  "+A_strCondition ;
   }
   SqlParameter[] arParams = new SqlParameter[0];
   return GetTableValue(CommandType.Text,strSQL,arParams);

  }  
         
 }
}




下面是基类




using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Diagnostics;

 

namespace Demo.DAL.COMM
{


    public abstract class SQLHelper
    {
        private string CONN_STRING = "Password= ;Persist Security Info=True;User ID=sa;Initial Catalog=Test1;Data Source=.";

        protected System.Data.SqlClient.SqlConnection Con =new SqlConnection();
        protected System.Data.SqlClient.SqlCommand Cmd =new SqlCommand();
        protected System.Data.SqlClient.SqlDataAdapter Dtapt =new SqlDataAdapter();
        protected System.Data.SqlClient.SqlTransaction sqlTran ;
        public SqlDataReader dtrValue = null;

/// <summary>
        /// 开始事务
        /// </summary>
        public void BeginTransection()
        {
            if (Con.State == ConnectionState.Closed)
            {
                //打开连接
                OpenCn();
                //开始事务
                sqlTran = Con.BeginTransaction();
                Cmd.Transaction = sqlTran;
            }
        }
        /// <summary>
        /// 提交事务
        /// </summary>
        public void CommitTransection()
        {
            sqlTran.Commit();
            CloseCn();
            sqlTran.Dispose();
            sqlTran = null;

        }

        /// <summary>
        /// 回滚事务
        /// </summary>
         public void RollbackTransection()
         {
             sqlTran.Rollback();
             CloseCn();
             sqlTran.Dispose();
             sqlTran = null;
         }

        protected System.Data.SqlClient.SqlConnection GetConnection()
        {
            string strConnectString;
            strConnectString = CONN_STRING;
            SqlConnection Con1 = new SqlConnection(strConnectString);
            return Con1;
        }
        /// <summary>
        /// 打开数据连接
        /// </summary>
        protected void OpenCn()
        {
            //判断事务是否开始
            if (sqlTran == null)
            {
                Con = GetConnection();
            }
            if (Con.State != ConnectionState.Open)
            {
                Con.Open();
            }
        }

        /// <summary>
        /// 关闭数据连接
        /// </summary>
        protected void CloseCn()
        {
            if (Con.State != ConnectionState.Closed)
            {
                Con.Close();
                Con.Dispose();
                Cmd.Dispose();
    dtrValue.Close();
            }
        }


        /// <summary>
        /// ExecuteReader
        /// </summary>
        /// <param name="objCmdType">CommandType</param>
        /// <param name="strCmdText">strSQL</param>
        /// <param name="arrparmCmdParms">SqlParameter</param>
        /// <returns></returns>
        protected SqlDataReader ExecuteReader(CommandType objCmdType,string strSQL, SqlParameter[] arrparmCmdParms)
        {
            SqlDataReader dtrRet = null;
            try
            {
                OpenCn();
                Cmd.Connection = Con;
                Cmd.CommandText = strSQL;
                Cmd.CommandType = objCmdType;

                if (arrparmCmdParms != null)
                {
                    foreach (SqlParameter objParm in arrparmCmdParms)
                        Cmd.Parameters.Add(objParm);
                }
                dtrRet = Cmd.ExecuteReader();
                Cmd.Parameters.Clear();
                return dtrRet;
            }
            catch (Exception e)
            {
                if (Con.State != ConnectionState.Closed && sqlTran==null)
                {
                    CloseCn();
                }
                Debug.Write(e.Message);
                return null;
            }
            finally
            {
                if (Con.State != ConnectionState.Closed && sqlTran == null && dtrRet==null)
                {
                    CloseCn();
                }
            }
        }
  /// <summary>
        /// 返回表数据   未测试
        /// </summary>
        /// <param name="objCmdType"></param>
        /// <param name="strSQL"></param>
        /// <param name="arrparmCmdParms"></param>
        /// <returns></returns>
        protected DataTable ExecuteDataTable(CommandType objCmdType, string strSQL, SqlParameter[] arrparmCmdParms)
        {
            DataTable dtb = new DataTable();
            try
            {
                OpenCn();
                Cmd.Connection = Con;
                Cmd.CommandText = strSQL;
                Cmd.CommandType = objCmdType;

                if (arrparmCmdParms != null)
                {
                    foreach (SqlParameter objParm in arrparmCmdParms)
                        Cmd.Parameters.Add(objParm);
                }
                SqlDataAdapter Dtapt = new SqlDataAdapter(strSQL, Con);

                DataSet dst = new DataSet();;
                Dtapt.Fill(dst);
                Cmd.Parameters.Clear();
                dtb= dst.Tables[0] ;
                return dtb;
            }
            catch (Exception e)
            {
                if (Con.State != ConnectionState.Closed && sqlTran == null)
                {
                    CloseCn();
                }
                Debug.Write(e.Message);
                return dtb;
            }

            finally
            {
                if (Con.State != ConnectionState.Closed && sqlTran == null)
                {
                    CloseCn();
                }
            }
        }

  #region  " 2006-4-14 小草 获得datatable "

  /// <summary>
  /// 1. 根据存储过程和参数值得到DataTable 值
  /// 2. 根据SQL的得到DataTable 值
  /// </summary>
  /// <param name="A_strSql">可是是SQL 也可以是存储过程</param>
  /// <param name="A_aryParm">SqlParameter参数列表</param>
  /// <returns>返回DataTable</returns>
  protected  DataTable  GetTableValue ( CommandType objCmdType, string A_strSql, SqlParameter[] A_arrparmCmdParms )
  {
   DataTable  dtb=new DataTable();

   dtrValue = ExecuteReader(objCmdType,A_strSql, A_arrparmCmdParms);
   int intColLength=dtrValue.FieldCount;

   for (int i=0 ; i <intColLength ;i++)
   {
    dtb.Columns.Add(dtrValue.GetName(i),GetColType(i));
   }
   DataRow  dr;
   if(dtrValue.HasRows)
   {
    while(dtrValue.Read())
    {
     dr=dtb.NewRow();
     
     for (int j=0;  j< intColLength ;j++)
     {  
      dr[dtrValue.GetName(j)]=GetValue(j,GetFieldType(j).ToString());
     }
     dtb.Rows.Add(dr);
    }
   }
   CloseCn();
   return dtb;
  }

  /// <summary>
  /// SQLRead根据类型得到该列数据的读取得方式
  /// </summary>
  /// <param name="i">select 出来的table的列的索引</param>
  /// <param name="A_strType">table的索引列的数据类型</param>
  /// <returns>该索引类的值</returns>
  protected Object  GetValue (int A_intIndex,string A_strType)
  {
   switch (A_strType)
   {
    case "System.Guid":
     return GetGuid1(A_intIndex);
     
    case"System.String":
     return GetString(A_intIndex);
    
    default:
     return GetString(A_intIndex);
     
   }

  }

  /// <summary>
  /// SQLRead根据类型得到该列数据的数据类型
  /// </summary>
  /// <param name="A_intIndex">select 出来的table的列的索引</param>
  /// <returns>该列数据的数据类型</returns>
  protected  System.Type   GetColType (int A_intIndex)
  {
   switch (dtrValue.GetFieldType(A_intIndex).ToString())
   {
    case "System.Guid":
     return typeof(string)  ;
     
    case"System.String":
     return typeof(string);
    
    default:
     return typeof(string);
     
   }

  }

 


  #endregion

 

        //=================================================================
        # region  "读取数据"
        //' 读取数据'

        /// <summary>
        /// String
        /// </summary>
        /// <param name="intIndex"></param>
        /// <returns></returns>
        public string GetString(int intIndex)
        {
            if (dtrValue != null && dtrValue.IsClosed == false)
            {
                if (dtrValue.IsDBNull(intIndex) == true) return null;
                else return dtrValue.GetString(intIndex).Trim();
            }
            else throw new InvalidOperationException("SQLDAL.SQLHelp中dtrValue为null");
        }

      /// <summary>
      /// Guid
      /// </summary>
      /// <param name="intIndex"></param>
      /// <returns></returns>
      public  Guid  GetGuid1(int intIndex)
      {
           if (dtrValue != null && dtrValue.IsClosed == false)
           {
                if (dtrValue.IsDBNull(intIndex) == true) return Guid.Empty ;
                else return dtrValue.GetGuid(intIndex);
           }
           else throw new InvalidOperationException("dtrValue对象为实例");
      }

 

        #endregion

    }

}

posted on 2006-04-14 19:36  小草.NET  阅读(1592)  评论(0)    收藏  举报