예제 #1
0
        protected override bool _Insert(T data, string tran, out string message)
        {
            DboProjectionAttribute tnAttr = typeof(T).GetCustomAttribute <DboProjectionAttribute>();

            if (tnAttr == null || String.IsNullOrWhiteSpace(tnAttr.Projection))
            {
                throw new Exception(String.Format("对象{0}没有设置表映射关系", typeof(T).Name));
            }
            if (data == null)
            {
                throw new ArgumentNullException("Delete的参数data不能为空");
            }
            long          result     = -1;
            SqlCommand    sqlCmd     = new SqlCommand();
            StringBuilder strColumns = new StringBuilder();
            StringBuilder strParams  = new StringBuilder();

            foreach (PropertyInfo pi in typeof(T).GetProperties())
            {
                if (pi.GetCustomAttribute <NotColumnAttribute>() != null)
                {
                    continue;
                }
                else if (!data.GetTracer().Contains(pi.Name))
                {
                    continue;
                }
                strColumns.AppendFormat("{0},", pi.Name);
                strParams.AppendFormat("@{0},", pi.Name);
                object paramValue = pi.GetValue(data);
                sqlCmd.Parameters.Add(new SqlParameter("@" + pi.Name, paramValue == null ? DBNull.Value : paramValue));
            }
            strColumns.Remove(strColumns.Length - 1, 1);
            strParams.Remove(strParams.Length - 1, 1);
            sqlCmd.CommandText = String.Format("INSERT INTO {0}({1}) VALUES({2}) SELECT SCOPE_IDENTITY()", tnAttr.Projection, strColumns, strParams);
            SqlTransaction sqlTran = ((SqlTransaction)SqlProvider.GetTransaction(tran));

            if (sqlTran != null)
            {
                sqlCmd.Connection  = sqlTran.Connection;
                sqlCmd.Transaction = sqlTran;
                Debug(sqlCmd);
                try
                {
                    result = long.Parse(sqlCmd.ExecuteScalar().ToString());
                    if (result > 0)
                    {
                        message = "操作成功";
                    }
                    else
                    {
                        message = "操作失败";
                    }
                }
                catch (Exception ex)
                {
                    SqlProvider.CloseTransaction(tran, false);
                    message = ex.Message;
                }
                return(result > 0);
            }
            else
            {
                message = String.Format("Trans={0}不存在", tran);
                return(false);
            }
        }
예제 #2
0
        public override IList <T> Select(string tran, IList <OrderBy> orders, Limit limit, out string message, params Restrain[] restrain)
        {
            DboProjectionAttribute tnAttr = typeof(T).GetCustomAttribute <DboProjectionAttribute>();

            if (tnAttr == null || String.IsNullOrWhiteSpace(tnAttr.Projection))
            {
                throw new Exception(String.Format("对象{0}没有设置表映射关系", typeof(T).Name));
            }
            IList <T>     result     = new List <T>();
            StringBuilder restainStr = new StringBuilder();
            SqlCommand    sqlCmd     = new SqlCommand();

            foreach (Restrain rst in restrain)
            {
                if (rst == null)
                {
                    continue;
                }
                restainStr.Append(rst.SqlStr);
                foreach (KeyValuePair <string, object> kv in rst.Params)
                {
                    SqlParameter param = new SqlParameter
                    {
                        ParameterName = kv.Key.Replace("__PARAMCODE__", "@"),
                        Value         = kv.Value
                    };
                    sqlCmd.Parameters.Add(param);
                }
            }
            StringBuilder ordBy = new StringBuilder();

            PropertyInfo[]       pis     = typeof(T).GetProperties();
            IEnumerable <string> piNames = from pi in pis select pi.Name;

            ordBy.Append(" ORDER BY ");
            if (orders != null)
            {
                foreach (OrderBy order in orders)
                {
                    if (String.IsNullOrWhiteSpace(order.Field))
                    {
                        throw new ArgumentNullException();
                    }
                    if (piNames.Contains(order.Field))
                    {
                        ordBy.AppendFormat(" {0}", order.Field);
                    }
                    if (!order.Asc)
                    {
                        ordBy.Append(" DESC");
                    }
                    else
                    {
                        ordBy.Append(" ASC");
                    }
                    ordBy.Append(" ,");
                }
            }

            if (ordBy[ordBy.Length - 1] == ',')
            {
                ordBy.Remove(ordBy.Length - 1, 1);
            }
            SqlTransaction sqlTran   = null;
            bool           runInTran = !String.IsNullOrWhiteSpace(tran);

            if (runInTran)
            {
                sqlTran = (SqlTransaction)SqlProvider.GetTransaction(tran);
            }
            else
            {
                tran    = SqlProvider.CreateTransaction <T>();
                sqlTran = (SqlTransaction)SqlProvider.GetTransaction(tran);
            }
            if (sqlTran == null && runInTran)
            {
                message = String.Format("Trans={0}不存在", tran);
                return(new List <T>());
            }
            if (limit == null)
            {
                limit = new Limit();
            }
            string sql = "WITH _T_ AS ((SELECT TOP {1} ROW_NUMBER() OVER({2}) AS _AUTOID_, * FROM {3} WHERE 1 = 1 {5}))SELECT TOP {0} * FROM _T_ {6}  WHERE _AUTOID_ > {4}";

            sqlCmd.CommandText = String.Format(sql, limit.Size, limit.Size + limit.Pos, ordBy.ToString(),
                                               tnAttr.Projection, limit.Pos, restainStr, runInTran?"":"WITH(NOLOCK)")
                                 .Replace("__PARAMCODE__", "@");
            sqlCmd.Transaction = sqlTran;
            sqlCmd.Connection  = sqlTran.Connection;
            Debug(sqlCmd);
            try
            {
                SqlDataReader reader = sqlCmd.ExecuteReader();
                while (reader.Read())
                {
                    T item = new T();
                    PropertyInfo[] pList = typeof(T).GetProperties();
                    foreach (PropertyInfo pi in pList)
                    {
                        if (pi.GetCustomAttribute <NotColumnAttribute>() != null)
                        {
                            continue;
                        }
                        object val = reader[pi.Name];
                        if (val.GetType() != typeof(DBNull))
                        {
                            pi.SetValue(item, val);
                        }
                    }
                    result.Add(item);
                }
                reader.Close();
                if (!runInTran)
                {
                    SqlProvider.CloseTransaction(tran, true);
                }
                message = String.Format("列出对象{0}笔", result.Count);
            }
            catch (Exception ex)
            {
                message = ex.Message;
                SqlProvider.CloseTransaction(tran, false);
            }

            return(result);
        }
예제 #3
0
        protected override bool _Update(T data, string tran, out string message)
        {
            object key = null;
            DboProjectionAttribute tnAttr = typeof(T).GetCustomAttribute <DboProjectionAttribute>();

            if (tnAttr == null || String.IsNullOrWhiteSpace(tnAttr.Projection))
            {
                throw new Exception(String.Format("对象{0}没有设置表映射关系", typeof(T).Name));
            }
            if (data == null)
            {
                throw new ArgumentNullException("Update的参数data不能为空");
            }
            int           result      = -1;
            SqlCommand    sqlCmd      = new SqlCommand();
            StringBuilder strColumns  = new StringBuilder();
            StringBuilder strRstParam = new StringBuilder();

            foreach (PropertyInfo pi in typeof(T).GetProperties())
            {
                if (pi.GetCustomAttribute <NotColumnAttribute>() != null)
                {
                    continue;
                }
                object paramValue          = pi.GetValue(data);
                PrimaryKeyAttribute pkAttr = pi.GetCustomAttribute <PrimaryKeyAttribute>();
                if (pkAttr != null)
                {
                    strRstParam.AppendFormat(" AND {0}=@{0} ", pi.Name);
                    key = paramValue;
                }
                else if (data.GetTracer().Contains(pi.Name))
                {
                    strColumns.AppendFormat(" {0}=@{0},", pi.Name);
                }
                else
                {
                    continue;
                }

                sqlCmd.Parameters.Add(new SqlParameter("@" + pi.Name, paramValue == null ? DBNull.Value : paramValue));
            }
            if (strColumns.Length == 0)
            {
                message = "数据对象没有发生变更";
                return(true);
            }
            strColumns.Remove(strColumns.Length - 1, 1);
            sqlCmd.CommandText = String.Format("UPDATE {0} SET {1} WHERE 1=1 {2}", tnAttr.Projection, strColumns, strRstParam);
            Debug(sqlCmd);
            SqlTransaction sqlTran = ((SqlTransaction)SqlProvider.GetTransaction(tran));

            if (sqlTran != null)
            {
                sqlCmd.Connection  = sqlTran.Connection;
                sqlCmd.Transaction = sqlTran;
                try
                {
                    result = sqlCmd.ExecuteNonQuery();
                    if (result <= 0)
                    {
                        message = "不存在对象,或对象已被变更";
                    }
                    else
                    {
                        message = "成功";
                        data.ResetTracer();
                    }
                }
                catch (Exception ex)
                {
                    SqlProvider.CloseTransaction(tran, false);
                    message = ex.Message;
                }
                return(result > 0);
            }
            else
            {
                message = String.Format("Trans={0}不存在", tran);
                return(false);
            }
        }
예제 #4
0
        protected override bool _Delete(T data, string tran, out string message)
        {
            DboProjectionAttribute tnAttr = typeof(T).GetCustomAttribute <DboProjectionAttribute>();

            if (tnAttr == null || String.IsNullOrWhiteSpace(tnAttr.Projection))
            {
                throw new Exception(String.Format("对象{0}没有设置表映射关系", typeof(T).Name));
            }
            if (data == null)
            {
                throw new ArgumentNullException("Delete的参数data不能为空");
            }

            int           result    = -1;
            OracleCommand sqlCmd    = new OracleCommand();
            StringBuilder strParams = new StringBuilder();
            object        key       = null;

            foreach (PropertyInfo pi in typeof(T).GetProperties())
            {
                if (pi.GetCustomAttribute <NotColumnAttribute>() != null)
                {
                    continue;
                }
                PrimaryKeyAttribute pkAttr = pi.GetCustomAttribute <PrimaryKeyAttribute>();
                if (pkAttr != null)
                {
                    strParams.AppendFormat("AND {0}=:{0} ", pi.Name);
                    key = pi.GetValue(data);
                    sqlCmd.Parameters.Add(new OracleParameter(":" + pi.Name, key));
                }
            }
            strParams.Remove(strParams.Length - 1, 1);
            sqlCmd.CommandText = String.Format("DELETE FROM {0} WHERE 1=1 {1}", tnAttr.Projection, strParams);
            Debug(sqlCmd);
            OracleTransaction sqlTran = ((OracleTransaction)SqlProvider.GetTransaction(tran));

            if (sqlTran != null)
            {
                sqlCmd.Connection  = sqlTran.Connection;
                sqlCmd.Transaction = sqlTran;
                try
                {
                    result = sqlCmd.ExecuteNonQuery();
                    if (result <= 0)
                    {
                        message = "不存在对象,或对象已被变更";
                    }
                    else
                    {
                        message = "成功";
                    }
                }
                catch (Exception ex)
                {
                    message = ex.Message;
                    SqlProvider.CloseTransaction(tran, false);
                }
                return(result > 0);
            }
            else
            {
                message = String.Format("Trans={0}不存在", tran);
                return(false);
            }
        }