예제 #1
0
파일: DbSession.cs 프로젝트: Stone840824/X
        protected virtual T ExecuteScalar <T>(DbCommand cmd)
        {
            QueryTimes++;

            WriteSQL(cmd);
            try
            {
                BeginTrace();
                Object rs = cmd.ExecuteScalar();
                if (rs == null || rs == DBNull.Value)
                {
                    return(default(T));
                }
                if (rs is T)
                {
                    return((T)rs);
                }
                return((T)Reflect.ChangeType(rs, typeof(T)));
            }
            catch (DbException ex)
            {
                throw OnException(ex, cmd.CommandText);
            }
            finally
            {
                EndTrace(cmd.CommandText);

                AutoClose();
                cmd.Parameters.Clear();
            }
        }
예제 #2
0
        public virtual async Task <T> ExecuteScalarAsync <T>(DbCommand cmd)
        {
            QueryTimes++;

            WriteSQL(cmd);
            try
            {
                BeginTrace();

                var rs = await cmd.ExecuteScalarAsync();

                if (rs == null || rs == DBNull.Value)
                {
                    return(default(T));
                }
                if (rs is T)
                {
                    return((T)rs);
                }

                return((T)Reflect.ChangeType(rs, typeof(T)));
            }
            catch (DbException ex)
            {
                throw OnException(ex, cmd);
            }
            finally
            {
                EndTrace(cmd);
            }
        }
예제 #3
0
        /// <summary>取得指定键的强类型值</summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public T GetItem<T>(String key)
        {
            if (!Contain(key)) return default(T);

            var value = this[key];
            if (String.IsNullOrEmpty(value)) return default(T);

            var t = typeof(T);

            if (t.IsValueType || Type.GetTypeCode(t) == TypeCode.String || t == typeof(Object))
            {
                return (T)Reflect.ChangeType(value, t);
            }
            else if (t.IsArray || value is IEnumerable)
            {
                var data = FromXml(value);
                if (data == null) throw new XException("ExtendData无法分析数据" + value);

                var list = new List<String>();
                for (var i = 1; i < Int32.MaxValue; i++)
                {
                    if (!data.Contain("Item" + i.ToString())) break;

                    list.Add(data["Item" + i.ToString()]);
                }

                return (T)Reflect.ChangeType(list.ToArray(), t);
            }

            throw new XException("不支持的类型{0},键{1}", typeof(T), key);
        }
예제 #4
0
        /// <summary>尝试从指定数据行中读取指定名称列的数据</summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dr"></param>
        /// <param name="name">名称</param>
        /// <param name="value">数值</param>
        /// <returns></returns>
        protected static Boolean TryGetDataRowValue <T>(DataRow dr, String name, out T value)
        {
            value = default(T);
            if (dr == null || !dr.Table.Columns.Contains(name) || dr.IsNull(name))
            {
                return(false);
            }

            Object obj = dr[name];

            // 特殊处理布尔类型
            if (Type.GetTypeCode(typeof(T)) == TypeCode.Boolean && obj != null)
            {
                if (obj is Boolean)
                {
                    value = (T)obj;
                    return(true);
                }

                if ("YES".EqualIgnoreCase(obj.ToString()))
                {
                    value = (T)(Object)true;
                    return(true);
                }
                if ("NO".EqualIgnoreCase(obj.ToString()))
                {
                    value = (T)(Object)false;
                    return(true);
                }
            }

            try
            {
                if (obj is T)
                {
                    value = (T)obj;
                }
                else
                {
                    if (obj != null)
                    {
                        var tx = TypeX.Create(obj.GetType());
                        if (tx.IsInt)
                        {
                            var n = Convert.ToUInt64(obj);
                            if (n == UInt32.MaxValue && Type.GetTypeCode(typeof(T)) == TypeCode.Int32)
                            {
                                obj = -1;
                            }
                        }
                    }
                    value = (T)Reflect.ChangeType(obj, typeof(T));
                }
            }
            catch { return(false); }

            return(true);
        }
예제 #5
0
파일: DbSession.cs 프로젝트: jmy10241024/X
        /// <summary>执行插入语句并返回新增行的自动编号</summary>
        /// <param name="sql">SQL语句</param>
        /// <param name="type">命令类型,默认SQL文本</param>
        /// <param name="ps">命令参数</param>
        /// <returns>新增行的自动编号</returns>
        public virtual Int64 InsertAndGetIdentity(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps)
        {
            //return Execute(sql, type, ps);
            using var cmd = OnCreateCommand(sql, type, ps);
            //Transaction?.Check(cmd, true);

            //return ExecuteScalar<Int64>(cmd);
            return(Execute(cmd, false, cmd2 =>
            {
                var rs = cmd.ExecuteScalar();
                if (rs == null || rs == DBNull.Value)
                {
                    return 0;
                }

                return Reflect.ChangeType <Int64>(rs);
            }));
        }
예제 #6
0
파일: DbSession.cs 프로젝트: jmy10241024/X
        /// <summary>执行SQL语句,返回结果中的第一行第一列</summary>
        /// <typeparam name="T">返回类型</typeparam>
        /// <param name="sql">SQL语句</param>
        /// <param name="type">命令类型,默认SQL文本</param>
        /// <param name="ps">命令参数</param>
        /// <returns></returns>
        public virtual T ExecuteScalar <T>(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps)
        {
            using var cmd = OnCreateCommand(sql, type, ps);
            //return ExecuteScalar<T>(cmd);
            return(Execute(cmd, true, cmd2 =>
            {
                var rs = cmd.ExecuteScalar();
                if (rs == null || rs == DBNull.Value)
                {
                    return default(T);
                }
                if (rs is T)
                {
                    return (T)rs;
                }

                return (T)Reflect.ChangeType(rs, typeof(T));
            }));
        }
예제 #7
0
        protected virtual T ExecuteScalar <T>(DbCommand cmd)
        {
            Transaction?.Check(cmd, false);

            QueryTimes++;
            WriteSQL(cmd);

            var conn = Database.Pool.Get();

            try
            {
                if (cmd.Connection == null)
                {
                    cmd.Connection = conn;
                }

                BeginTrace();
                var rs = cmd.ExecuteScalar();
                if (rs == null || rs == DBNull.Value)
                {
                    return(default(T));
                }
                if (rs is T)
                {
                    return((T)rs);
                }

                return((T)Reflect.ChangeType(rs, typeof(T)));
            }
            catch (DbException ex)
            {
                throw OnException(ex, cmd);
            }
            finally
            {
                Database.Pool.Put(conn);
                EndTrace(cmd);

                //AutoClose();
                cmd.Parameters.Clear();
            }
        }
예제 #8
0
파일: UPnPAction.cs 프로젝트: zuojiashun/X
        /// <summary>XML反序列化为实体</summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static TEntity FromXml(String xml)
        {
            var doc = new XmlDocument();

            doc.LoadXml(xml);

            var entity = new TEntity();

            //TypeX tx = TypeX.Create(typeof(TEntity));
            foreach (var item in typeof(TEntity).GetProperties(true))
            {
                //if (AttributeX.GetCustomAttribute<XmlIgnoreAttribute>(item, true) != null) continue;

                var elmName = item.Name;
                var att     = item.GetCustomAttribute <XmlElementAttribute>(true);
                if (att != null && !String.IsNullOrEmpty(att.ElementName))
                {
                    elmName = att.ElementName;
                }

                var node = doc.SelectSingleNode("//" + elmName);
                if (node == null)
                {
                    continue;
                }

                //item.SetValue(entity, Convert.ChangeType(node.InnerText, item.PropertyType));
                entity.SetValue(item, Reflect.ChangeType(node.InnerText, item.PropertyType));
            }
            return(entity);

            //XmlSerializer serial = new XmlSerializer(typeof(TEntity));
            //using (StringReader reader = new StringReader(xml))
            //{
            //    return serial.Deserialize(reader) as TEntity;
            //}
        }