蓝宇网络 www.py668.com

非淡泊无以明志,非宁静无以致远。

导航

自己写的一个Orm组件,开源一下

刚刚接触.NET 2.0后就听说有ORM这个组件,可以把数据库对象映射成对象实体,觉得这个非常有用,所以一直在寻找好的ORM组件,Hibernate.NET但一配置麻烦,在asp.net下使用不方便,后来找到听堂开发的SPL,但时不时都会有些小问题,后来又找到Castle.net,这个算是比较满意的,但效率真是个大问题,我读入一个有7条记录的表用了6秒钟.最后自己一边找资料,一边学着写,我的想法是开发个一功能简单,速度快的组件,一切以够用为主.这个版本中速度和扩展性还有很大的提升空间,下一个版本我打算加进Trascation功能.


下面我来介绍一个自己开发的一个组件,
类不多,只有那么几个.
TableControl,是用来记录表的名称结构和对象映射数据.
MyColumn,是字段的映射.
CacheTableMapping,用于缓存各个表映射的数据.
ObjectEntity,是实体和对象类映射
DataProvider ,为数据库和实体的转换提供方法
Condition,一个简单的自动生成sql语句和参数的类
TableMapping,表映射
ColumnMapping,字段映射
Conn,数据处理类

下载网址:https://files.cnblogs.com/lymph/Common.rar

使用方法:
在你用代码生成器,根据数据库生成对象(或者手工编写),在类和类的相关字段上加上属性,比喻:
[TableMapping("Order")]
 class Order
{
   int orderid;
   string item;
   [ColumnMapping("OrderId",true)]//设为标识列
   public int OrderId{
      get{return orderid;}
      set{orderid=value;}
   }
   [ColumnMapping("Item")]
   public string OrderItem{
      get{return item;}
      set{item=value;}
   }
}

Order order=DataProvider<Order>.FindByKey(1);
order.OrderItem="test";
order.UpdateByKey();//更新
order.Create();//新建一条记录

下面是源代码:

TableControl.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace LymSite.Common
{
    //字段
    public struct MyColumn
    {
        public MyColumn(string name, string mapname, bool isKey)
        {
            Name = name;
            MapName = mapname;
            IsKey = isKey;
        }
        public string Name;
        public bool IsKey;
        public string MapName;
    }

    public class TableControl
    {
        public string TalbeName = string.Empty;
        public string ColumnList = string.Empty;
        public MyColumn Key=new MyColumn();
        public SortedList<string, MyColumn> Column = new SortedList<string, MyColumn>();

        //构造
        public TableControl()
        {

        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="column">字段名</param>
        /// <param name="mapname">映射名</param>
        public void AddColumn(string column, string mapname)
        {
            AddColumn(column, mapname, false);
        }

        /// <summary>
        /// 添加字段
        /// </summarybj
        /// <param name="column">字段名</param>
        /// <param name="mapname">映射名</param>
        /// <param name="isKey">是否主标识</param>
        public void AddColumn(string column, string mapname, bool isKey)
        {
            MyColumn col = new MyColumn(column, mapname, isKey);
            Column.Add(column, col);
            if (isKey)
            {
                if (string.IsNullOrEmpty(r5.Name))
                    Key = col;
                else
                    throw new Exception("一个对象不能同时有多个主标识列!");
            }
            if (!isColInit) AddInList(column);
        }

        void AddInList(string name)
        {
            if (string.IsNullOrEmpty(ColumnList))
                ColumnList += name;
            else
                ColumnList += "," + name;
        }


        bool isColInit = false;

        public TableControl(string t, string c)
        {
            TalbeName = t;
            ColumnList = c;
            if (c != "")
                isColInit = true;
        }
    }

    [System.AttributeUsage(System.AttributeTargets.Class |
                       System.AttributeTargets.Struct,
                       AllowMultiple = false)  // multiuse attribute
    ]
    public class TableMapping : System.Attribute
    {
        string name;

        public TableMapping(string name)
        {
            this.name = name;
        }

        public string GetName()
        {
            return name;
        }
    }

    [System.AttributeUsage(System.AttributeTargets.Property | System.AttributeTargets.Field,
                       AllowMultiple = false)  // multiuse attribute
    ]
    public class ColumnMapping : System.Attribute
    {
        string name;
        bool isKey = false;

        public ColumnMapping(string columnName)
        {
            this.name = columnName;
        }

        /// <summary>
        /// 数据字段影射
        /// </summary>
        /// <param name="columnName">字段名</param>
        /// <param name="iskey">是否标识列</param>
        public ColumnMapping(string columnName, bool iskey)
        {
            this.name = columnName;
            isKey = iskey;
        }

        public bool IsKey
        {
            get
            {
                return isKey;
            }
            set
            {
                isKey = value;
            }
        }

        public string ColumnName
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }

        public string GetName()
        {
            return name;
        }
    }
}



ObjectMapping.cs


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Collections;
using System.Reflection;
using System.Xml;
using System.Collections.Generic;

namespace LymSite.Common
{
    /// <summary>
    /// 缓存映射数据
    /// </summary>
    sealed public class CacheTableMapping
    {
        static private Hashtable hashTable = new Hashtable();
        public static Hashtable CacheTable
        {
            get { return CacheTableMapping.hashTable; }
            set { CacheTableMapping.hashTable = value; }
        }
    }

    /// <summary>
    /// 对象与数据库表的映射
    /// </summary>
    ///
    public abstract class ObjectEntity<T> where T : new()
    {
        bool isPersistent=false;

        public bool IsPersistent
        {
            get { return isPersistent; }
            set { isPersistent = value; }
        }

        public ObjectEntity()
        {
            DataProvider<T>.InitEntity();
        }

        static ObjectEntity()
        {
            DataProvider<T>.InitEntity();
        }

        #region 静态函数

        public static int CountByProperty(string name, object value)
        {
            return DataProvider<T>.CountByProperty(name, value);
        }

        public static int CountByProperty(Condition list)
        {
            return DataProvider<T>.CountByProperty(list);
        }

        /// <summary>
        /// 查找对象
        /// </summary>
        /// <param name="list">Condition</param>
        /// <returns>相应的对象</returns>
        public static T FindByProperty(Condition list)
        {
            return DataProvider<T>.FindByProperty(list);
        }

        public static T FindByKey(object key)
        {
            return DataProvider<T>.FindByKey(key);
        }

        public static object FindScalar(string column, Condition list)
        {
            return DataProvider<T>.FindScalar(column,list);
        }

        /// <summary>
        /// 得到Distinct的字段
        /// </summary>
        /// <param name="siteid"></param>
        /// <returns>数据表</returns>
        public static DataTable GetDistinctTable(string column,Condition c)
        {
            return DataProvider<T>.GetDistinctTable(column,c);
        }

        public static int DeleteByProperty(string name, object value)
        {
            return DataProvider<T>.DeleteByProperty(name, value);
        }

        public static int DeleteByKey(object objVal)
        {
            return DataProvider<T>.DeleteByProperty(objVal);
        }

        public static int DeleteByProperty(Condition c)
        {
            return DataProvider<T>.DeleteByProperty(c);
        }


        public static DataTable GetTableByProperty(Condition c)
        {
            return DataProvider<T>.GetTableByProperty(c);
        }

        public static XmlDocument GetXml(DataTable dt)
        {
            return DataProvider<T>.GetXml(dt);
        }

        #endregion

        #region 虚拟对外函数
        virtual public int DeleteByKey()
        {
            return DataProvider<T>.DeleteByKey(this);
        }


        /// <summary>
        /// 创建记录
        /// </summary>
        /// <param name="c">参数</param>
        /// <returns>影响行数,0为更新失败</returns>
        virtual public int Create()
        {
            return DataProvider<T>.Create(this);
        }


        /// <summary>
        /// ORM自带更新数据库,自动识别数据字段,但必需有Key字段
        /// </summary>
        /// <returns>影响行数,0为更新失败</returns>
        virtual public int UpdateByKey()
        {
            return DataProvider<T>.UpdateByKey(this);
        }
        #endregion

        #region 虚拟内部函数
        /// <summary>
        /// 更新数据库
        /// </summary>
        /// <param name="upC">更新项</param>
        /// <param name="selC">条件项</param>
        /// <returns></returns>
        virtual protected int Update(Condition upC)
        {
            return DataProvider<T>.Update(upC);
        }

        /// <summary>
        /// 创建记录
        /// </summary>
        /// <param name="c">参数</param>
        /// <returns>影响行数,0为更新失败</returns>
        virtual protected int Create(Condition c)
        {
            return DataProvider<T>.Create(c,this);
        }


        //加入对象映射
        protected static void AddTable(string classname, string talbe, string column)
        {
            TableControl t = new TableControl(talbe, column);
            MappingInit(classname, talbe, t);
        }
        #endregion

    }

}



DataProvider.cs


using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data.Common;
using LymSite.Common;
using System.Xml;

namespace LymSite.Common
{
    //提供数据库objectmapping ,解决事务处理问题
    class DataProvider<T> where T : new()
    {

        public DataProvider()
        {
           
        }

        #region 静态方法
        //初始化实体
        public static void InitEntity()
        {
            if (!CacheTableMapping.CacheTable.Contains(typeof(T).Name))
            {
                Type t = typeof(T);
                object[] atts = t.GetCustomAttributes(false);
                if (atts.Length > 0)
                {
                    string tablename = "";
                    if (atts[0] is TableMapping)
                        tablename = ((TableMapping)atts[0]).GetName();

                    MappingInit(t.Name, tablename, new TableControl(tablename, ""));
                }
            }
        }

        public static int CountByProperty(string name, object value)
        {
            Condition c = new Condition(name, value);
            return CountByProperty(c);
        }

        public static int CountByProperty(Condition list)
        {
            string tablename = ((TableControl)CacheTableMapping.CacheTable[typeof(T).Name]).TalbeName;
            string queryString = list.CreateSelectSql(tablename, " count(0) ");
            return int.Parse(Conn.ExecuteScalar(queryString, list.ToParamsArray).ToString());
        }

        /// <summary>
        /// 查找对象
        /// </summary>
        /// <param name="list">Condition</param>
        /// <returns>相应的对象</returns>
        public static T FindByProperty(Condition list)
        {
            T entity = new T();
            Type o = typeof(T);
            TableControl table = (TableControl)CacheTableMapping.CacheTable[typeof(T).Name];
            string column = "";

            column = table.ColumnList;

            string queryString = list.CreateSelectSql(table.TalbeName, column);
            IDataReader dr = Conn.ExecuteReader(queryString, list.ToParamsArray);
            string colname = "";
            string typename = "";
            object tmpObject;
            if (dr.Read())
            {
                for (int i = 0; i < dr.FieldCount; i++)
                {
                    colname = dr.GetName(i);
                    if (table.Column.ContainsKey(colname))
                    {
                        typename = o.GetProperty(table.Column[colname].MapName).PropertyType.Name;
                        tmpObject = dr[colname];
                        if (tmpObject == null || tmpObject.ToString() == "")
                        {
                            if (typename == typeof(DateTime).Name)
                                o.GetProperty(table.Column[colname].MapName).SetValue(entity, default(DateTime), null);
                            else if (typename == typeof(int).Name)
                                o.GetProperty(table.Column[colname].MapName).SetValue(entity, default(int), null);
                            else
                                o.GetProperty(table.Column[colname].MapName).SetValue(entity, string.Empty, null);
                        }
                        else
                            o.GetProperty(table.Column[colname].MapName).SetValue(entity, tmpObject, null);
                    }
                }
            }
            dr.Close();
            return entity;
        }

        public static T FindByKey(object key)
        {
            MyColumn mycol = GetKeyColumn();
            Condition c = new Condition();
            c.AddWhereOrInsert(mycol.Name, key);
            return FindByProperty(c);
        }


        public static object FindScalar(string column, Condition list)
        {
            TableControl table = (TableControl)CacheTableMapping.CacheTable[typeof(T).Name];
            string sql = list.CreateSelectSql(table.TalbeName, column);
            return Conn.ExecuteScalar(sql, list.ToParamsArray);
        }

        /// <summary>
        /// 得到Distinct的字段
        /// </summary>
        /// <param name="siteid"></param>
        /// <returns>数据表</returns>
        public static DataTable GetDistinctTable(string column, Condition c)
        {
            TableControl table = (TableControl)CacheTableMapping.CacheTable[typeof(T).Name];
            return Conn.ExecuteDateSet(c.CreateSelectSql(table.TalbeName, " distinct " + column + " "), c.ToParamsArray).Tables[0];
            //return GetTableByProperty(new Condition("siteid", siteid));
        }

        public static int DeleteByProperty(string name, object value)
        {
            Condition tab = new Condition(name, value);
            return DeleteByProperty(tab);
        }

        public static int DeleteByKey(object objVal)
        {
            MyColumn mycol = GetKeyColumn();
            Condition tab = new Condition(mycol.Name, objVal);
            return DeleteByProperty(tab);
        }

        public static int DeleteByProperty(Condition tab)
        {
            string queryString = tab.CreateDeleteSql(((TableControl)CacheTableMapping.CacheTable[typeof(T).Name]).TalbeName);
            return Conn.ExecuteNonQuery(queryString, tab.ToParamsArray);
        }


        public static DataTable GetTableByProperty(Condition tab)
        {
            TableControl tc = ((TableControl)CacheTableMapping.CacheTable[typeof(T).Name]);
            string sql = tab.CreateSelectSql(tc.TalbeName, tc.ColumnList);
            return Conn.ExecuteDateSet(sql, tab.ToParamsArray).Tables[0];
        }

        public static XmlDocument GetXml(DataTable dt)
        {
            string tablename = ((TableControl)CacheTableMapping.CacheTable[typeof(T).Name]).TalbeName;
            XmlDocument xmlDoc = new XmlDocument();
            XmlDeclaration xn = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
            xmlDoc.AppendChild(xn);
            XmlElement boot = xmlDoc.CreateElement(tablename);

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                XmlElement note = xmlDoc.CreateElement("Record");

                for (int j = 0; j < dt.Columns.Count; j++)
                    note.SetAttribute(dt.Columns[j].ColumnName, dt.Rows[i][j].ToString());
                boot.AppendChild(note);
            }
            xmlDoc.AppendChild(boot);

            return xmlDoc;
        }

        static public int DeleteByKey(T obj)
        {
            MyColumn mycol = GetKeyColumn();
            Type o = typeof(T);
            object objVal = o.GetProperty(mycol.MapName).GetValue(obj, null);
            Condition tab = new Condition(mycol.Name, objVal);
            return DeleteByProperty(tab);
        }


        /// <summary>
        /// 创建记录
        /// </summary>
        /// <param name="c">参数</param>
        /// <returns>影响行数,0为更新失败</returns>
        static public int Create(object obj)
        {
            Condition c = new Condition();
            Type o = typeof(T);
            TableControl tc = (TableControl)CacheTableMapping.CacheTable[o.Name];
            object objVal;
            foreach (KeyValuePair<string, MyColumn> p in tc.Column)
            {
                if (!p.Value.IsKey)
                {
                    objVal = o.GetProperty(p.Value.MapName).GetValue(obj, null);
                    c.AddWhereOrInsert(p.Value.Name, objVal);
                }
            }
            return Conn.ExecuteNonQuery(c.CreateInsertSql(tc.TalbeName), c.ToParamsArray);
        }


        /// <summary>
        /// ORM自带更新数据库,自动识别数据字段,但必需有Key字段
        /// </summary>
        /// <returns>影响行数,0为更新失败</returns>
        static public int UpdateByKey(object obj)
        {
            Condition upC = new Condition();
            Type o = typeof(T);
            TableControl tc = (TableControl)CacheTableMapping.CacheTable[o.Name];
            bool hasKey = false;
            object objVal;
            foreach (KeyValuePair<string, MyColumn> p in tc.Column)
            {
                objVal = o.GetProperty(p.Value.MapName).GetValue(obj, null);
                if (p.Value.IsKey)
                {
                    hasKey = true;
                    upC.AddWhereOrInsert(p.Value.Name, objVal);
                }
                else
                    upC.AddUpdate(p.Value.Name, objVal);
            }
            if (hasKey)
                return Conn.ExecuteNonQuery(upC.CreateUpdateSql(tc.TalbeName), upC.ToParamsArray);
            else
                return 0;
            // WHERE ([RemoteFAQ].[FaqId] = @FaqId)";
        }


        /// <summary>
        /// 更新数据库
        /// </summary>
        /// <param name="upC">更新项</param>
        /// <param name="selC">条件项</param>
        /// <returns></returns>
        static public int Update(Condition upC)
        {
            string tablename = ((TableControl)CacheTableMapping.CacheTable[typeof(T).Name]).TalbeName;
            return Conn.ExecuteNonQuery(upC.CreateUpdateSql(tablename), upC.ToParamsArray);
            // WHERE ([RemoteFAQ].[FaqId] = @FaqId)";
        }


        /// <summary>
        /// 创建记录
        /// </summary>
        /// <param name="c">参数</param>
        /// <returns>影响行数,0为更新失败</returns>
        static public int Create(Condition c,object obj)
        {
            string tablename = ((TableControl)CacheTableMapping.CacheTable[obj.GetType().Name]).TalbeName;
            string queryString = c.CreateInsertSql(tablename);
            return Conn.ExecuteNonQuery(queryString, c.ToParamsArray);
        }
        #endregion

        private static MyColumn GetKeyColumn()
        {
            TableControl tc = (TableControl)CacheTableMapping.CacheTable[typeof(T).Name];
            return tc.Key;
            /*
            foreach (KeyValuePair<string, MyColumn> p in tc.Column)
            {
                if (p.Value.IsKey)
                    return p.Value;
            }
            throw new Exception("类中未定义标识字段!");
             */
        }

        /// <summary>
        /// 初始化字段和对象的映射
        /// </summary>
        /// <param name="classname">对象名</param>
        /// <param name="talbe">表名</param>
        /// <param name="tc">映射表</param>
        private static void MappingInit(string classname, string talbe, TableControl tc)
        {
            PropertyInfo[] aryp = typeof(T).GetProperties();
            foreach (PropertyInfo p in aryp)
            {
                object[] atts = p.GetCustomAttributes(false);
                foreach (object att in atts)
                {
                    if (att is ColumnMapping)
                    {
                        ColumnMapping a = (ColumnMapping)att;
                        string colname = a.GetName();
                        bool blkey = a.IsKey;
                        if (string.IsNullOrEmpty(colname))
                            tc.AddColumn(p.Name, p.Name);
                        else
                            tc.AddColumn(colname, p.Name, blkey);
                    }
                }
            }
            if (!CacheTableMapping.CacheTable.Contains(classname))
                CacheTableMapping.CacheTable.Add(classname, tc);
        }

    }
}


Condition.cs

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


namespace LymSite.Common
{
    /// <summary>
    /// Condition 的摘要说明
    /// </summary>
    public class Condition
    {
        //ArrayList arylist = new ArrayList();
        private TSQLParams aryUpdate = new TSQLParams();
        private TSQLParams arySelect = new TSQLParams();
        private TSQLParams arylike = new TSQLParams();

        System.Collections.Generic.List<DictionaryEntry> aryOrderby = new System.Collections.Generic.List<DictionaryEntry>();

        ArrayList aryParams = new ArrayList();

        string paramsChar = "@";
        string paramLast = "1";

        public Condition()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        /// <summary>
        /// 添加where 或insert的参数
        /// </summary>
        /// <param name="key">字段名</param>
        /// <param name="value">值</param>
        public Condition(string key, object value)
        {
            AddWhereOrInsert(key, value);
        }

        /// <summary>
        /// 添加where 或insert的参数,程序会自动把字段名转为参数名
        /// </summary>
        /// <param name="key">字段名</param>
        /// <param name="value">值</param>
        public void AddWhereOrInsert(string key, object value)
        {
            AddParams(key, value, ref arySelect);
            arySelect.Add(new DictionaryEntry(key, value));
        }
        /// <summary>
        /// 添加Like的参数,程序会自动把字段名转为参数名
        /// </summary>
        /// <param name="key">字段名</param>
        /// <param name="value">值</param>
        public void AddLike(string columnName, string value)
        {
            AddParams(columnName, value,ref arylike);
            arylike.Add(new DictionaryEntry(columnName, value));
        }

        /// <summary>
        /// 添加Update的参数,程序会自动把字段名转为参数名
        /// </summary>
        /// <param name="key">字段名</param>
        /// <param name="value">值</param>
        public void AddUpdate(string columnName, object value)
        {       
            AddParams(columnName, value,ref aryUpdate);
            aryUpdate.Add(new DictionaryEntry(columnName, value));
        }

        private bool CheckContains(string key)
        {
            for(int i=0;i<aryParams.Count;i++)
                if(((SqlParameter)aryParams[i]).ParameterName==key)
                    return true;
            return false;
        }

        public void AddOrderBy(string columnName, string orderkey)
        {
            aryOrderby.Add(new DictionaryEntry(columnName, orderkey));
        }

        public DictionaryEntry this[int index]
        {
            get
            {
                return arySelect[index];
            }
        }

        public void RemoveWhereAt(int index)
        {
            arySelect.RemoveAt(index);
        }

        public ArrayList ToParamsArray
        {
            get
            {
                return aryParams;
            }
        }
        /*
        private ArrayList CreateParams()
        {
            if (aryParams.Count == 0)
            {
                string tmpKey="";
                for (int i = 0; i < arySelect.Count; i++)
                {
                    tmpKey=arySelect[i].Key.ToString();
                    AddParams(arySelect.GetParam(tmpKey), arySelect[i].Value);
                }
                for (int i = 0; i < aryUpdate.Count; i++)
                {
                    tmpKey = aryUpdate[i].Key.ToString();
                    AddParams(aryUpdate.GetParam(tmpKey), aryUpdate[i].Value);
                }
                for (int i = 0; i < arylike.Count; i++)
                {
                    tmpKey = arylike[i].Key.ToString();
                    AddParams(arylike.GetParam(tmpKey), arylike[i].Value);
                }
            }
            return aryParams;
        }*/

        private void AddParams(string name,object value,ref TSQLParams list)
        {
            string paramname="";
            if (CheckContains(name))
                paramname = name + paramLast;
            else
                paramname = name;
            SqlParameter par = new SqlParameter(paramsChar + paramname, value);
            if (value is string) par.Size = ((string)value).Length;//控制长度
            aryParams.Add(par);
            list.SetParam(name, paramname);
        }

        public int Count
        {
            get
            {
                return arySelect.Count;
            }
        }

        public string CreateUpdateSql(string tablename)
        {
            //"UPDATE [RemoteFAQ] SET [SiteId]=@SiteId, [Type]=@Type, [question]=@Problem, [answer]=" +
            //"@Key WHERE ([RemoteFAQ].[FaqId] = @FaqId)";
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            sql.Append( "UPDATE " + tablename + " SET ");

            //更新项
            string key = aryUpdate[0].Key.ToString();
            sql.Append( "  [" + key.ToString() + "] = @" + aryUpdate.GetParam(key) + " ");

            for (int i = 1; i < aryUpdate.Count; i++)
            {
                key= aryUpdate[i].Key.ToString();
                sql.Append( "  ,[" + key + "] = @" + aryUpdate.GetParam(key) + " ");
            }
            //选择项
            sql.Append(" where ");
            for (int i = 0; i < arySelect.Count; i++)
            {
                key = arySelect[i].Key.ToString();
                if (i > 0) sql.Append(" and ");
                sql.Append( " [" + key + "] = @" + arySelect.GetParam(key) + " ");
            }
            return sql.ToString();
        }

        public string CreateSelectSql(string tablename, string column)
        {
            string queryString = "SELECT " + column + " FROM " + tablename + " WHERE 1=1 ";
            string tmpkey = "";
            //条件
            for (int i = 0; i < arySelect.Count; i++)
            {
                tmpkey = arySelect[i].Key.ToString();
                queryString += " and ([" + tmpkey + "] = @" + arySelect.GetParam(tmpkey) + ")";
            }
            //相拟
            for (int i = 0; i < arylike.Count; i++)
            {
                if (!string.IsNullOrEmpty(arylike[i].Value.ToString()))
                {
                    tmpkey = arylike[i].Key.ToString();
                    queryString += " and ([" + tmpkey + "] like '%'+@" + arylike.GetParam(tmpkey) + "+'%')";
                }
            }

            //排序
            string orderby = "";
            for (int i = 0; i < aryOrderby.Count; i++)
            {
                //参数值不为空才添加
                if (!string.IsNullOrEmpty(aryOrderby[i].Value.ToString()))
                {
                    if (!string.IsNullOrEmpty(orderby))
                        orderby += ",";
                    orderby += " " + aryOrderby[i].Key + " " + aryOrderby[i].Value;
                }
            }
            if (!string.IsNullOrEmpty(orderby))
                queryString += " order by " + orderby;
            return queryString;
        }

        public string CreateDeleteSql(string tablename)
        {
            string queryString = "DELETE FROM " + tablename + " WHERE 1=1 ";
           
            for (int i = 0; i < arySelect.Count; i++)
            {
                queryString += " and ([" + arySelect[i].Key + "] = @" + arySelect[i].Key + ")";
            }
            return queryString;
        }

        public string CreateInsertSql(string tablename)
        {
            System.Text.StringBuilder queryString = new System.Text.StringBuilder();
            queryString.Append("INSERT INTO ");

            queryString.Append(tablename + " ( " + arySelect[0].Key);
            for (int i = 1; i < arySelect.Count; i++)
                queryString.Append(" ," + arySelect[i].Key);

            queryString.Append(") VALUES (@" + arySelect[0].Key);
            for (int i = 1; i < arySelect.Count; i++)
                queryString.Append(" ,@" + arySelect[i].Key);

            queryString.Append(")");
           
            return queryString.ToString();
        }
    }

    public class TSQLParams : System.Collections.Generic.List<DictionaryEntry>
    {
       
        Hashtable hastable = new Hashtable();

        public string GetParam(string key)
        {
            return hastable[key].ToString();
        }
        /*
        public bool ContainKey(string key)
        {
            for (int i = 0; i < Count; i++)
                if (this[i].Key == key)
                    return true;
            return false;
        }
        */
        public void SetParam(string key, string value)
        {
            hastable[key] = value;
        }
    }

    sealed public class OrderbyKey
    {
        public static string Asc = "asc";
        public static string Desc = "desc";
    }
}


Conn.cs

using System;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Collections;

namespace LymSite.Common
{
    /// <summary>
    /// Conn 的摘要说明
    /// </summary>
    public class Conn
    {
        private static string connectionString = "Data Source=test;Initial Catalog=test;Persist Security Info=True;User ID=sa;Password=";

        public static string ConnectionString
        {
            get { return Conn.connectionString; }
            set { Conn.connectionString = value; }
        }
        //private static SqlConnection connection;

        public Conn()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        static Conn()
        {
            //connection = new System.Data.SqlClient.SqlConnection(connectionString);
        }

        //创建一个新的连接
        public static SqlConnection CreateDb()
        {
            return new System.Data.SqlClient.SqlConnection(connectionString);
        }

        public static IDataReader ExecuteReader(string sql, ArrayList list)
        {
            SqlCommand dbCommand = CreateSqlCommand(sql, list);
            IDataReader dr = dbCommand.ExecuteReader(CommandBehavior.CloseConnection);
            return dr;
        }

        public static IDataReader ExecuteReader(string sql)
        {
            return ExecuteReader(sql, null);
        }

        public static int ExecuteNonQuerySP(string spName, ArrayList list)
        {
            SqlCommand dbCommand = CreateSqlCommand(spName, list);
            dbCommand.CommandType = CommandType.StoredProcedure;
            int i = 0;
            try
            {
                i = dbCommand.ExecuteNonQuery();
            }
            finally
            {
                dbCommand.Connection.Close();
            }
            return i;
        }

        public static int ExecuteNonQuery(string sql, ArrayList list)
        {
            SqlCommand dbCommand = CreateSqlCommand(sql, list);
            int i = 0;
            try
            {
                i = dbCommand.ExecuteNonQuery();
            }
            finally
            {
                dbCommand.Connection.Close();
            }
            return i;
        }

        public static object ExecuteScalar(string sql)
        {
            return ExecuteScalar(sql,null);
        }

        public static object ExecuteScalar(string sql, ArrayList list)
        {
            SqlCommand dbCommand = CreateSqlCommand(sql, list);
            object obj;
            try
            {
                obj = dbCommand.ExecuteScalar();
            }
            finally
            {
                dbCommand.Connection.Close();
            }
            return obj;
        }

        public static int ExecuteNonQuery(string queryString)
        {
            return ExecuteNonQuery(queryString, null);
        }

        public static DataSet ExecuteDateSet(string sql, ArrayList paramList)
        {
            return ExecuteDataSet(sql, paramList, false);
        }

        public static DataSet ExecuteDataSet(string sql, ArrayList paramList,bool isSp)
        {
            SqlCommand cmd = CreateSqlCommand(sql, paramList);

            if (isSp)
                cmd.CommandType = CommandType.StoredProcedure;

            SqlDataAdapter sqlda = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            sqlda.Fill(ds);
            cmd.Connection.Close();
            return ds;
        }

        /// <summary>
        /// 创建一个SqlCommand,并打开数据库
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="list"></param>
        /// <returns></returns>
        private static SqlCommand CreateSqlCommand(string sql, ArrayList list)
        {
            SqlConnection dbConnection = Conn.CreateDb();
            SqlCommand dbCommand = new System.Data.SqlClient.SqlCommand(sql, dbConnection);
            if (list != null)
            {
                foreach (SqlParameter p in list)
                {
                    dbCommand.Parameters.Add(p);
                }
            }
            dbConnection.Open();
            return dbCommand;
        }
    }
}

posted on 2006-09-21 22:31  罗记  阅读(1136)  评论(4编辑  收藏  举报