Example #1
0
 /// <summary>
 /// 获取查询信息
 /// </summary>
 /// <typeparam name="valueType">对象类型</typeparam>
 /// <typeparam name="modelType">模型类型</typeparam>
 /// <param name="sqlTool">SQL操作工具</param>
 /// <param name="connection"></param>
 /// <param name="query">查询信息</param>
 /// <param name="readValue"></param>
 /// <returns>对象集合</returns>
 internal override LeftArray <valueType> Select <valueType, modelType>(Sql.Table <valueType, modelType> sqlTool, ref DbConnection connection, ref SelectQuery <modelType> query, Func <DbDataReader, valueType> readValue)
 {
     try
     {
         if (query.Sql != null)
         {
             if (connection == null)
             {
                 connection = GetConnection();
             }
             if (connection != null)
             {
                 bool isFinally = false;
                 try
                 {
                     using (DbCommand command = getCommand(connection, query.Sql, CommandType.Text))
                         using (DbDataReader reader = command.ExecuteReader(CommandBehavior.SingleResult))
                         {
                             int skipCount = query.SkipCount;
                             while (skipCount != 0 && reader.Read())
                             {
                                 --skipCount;
                             }
                             if (skipCount == 0)
                             {
                                 LeftArray <valueType> array = new LeftArray <valueType>();
                                 while (reader.Read())
                                 {
                                     valueType value = readValue(reader);
                                     if (value != null)
                                     {
                                         array.Add(value);
                                     }
                                 }
                                 isFinally = true;
                                 return(array.NotNull());
                             }
                         }
                     isFinally = true;
                 }
                 finally
                 {
                     if (!isFinally)
                     {
                         sqlTool.Log.Add(AutoCSer.Log.LogType.Error, query.Sql);
                     }
                 }
             }
         }
     }
     finally { query.Free(); }
     return(default(LeftArray <valueType>));
 }
Example #2
0
        /// <summary>
        /// 查询对象集合
        /// </summary>
        /// <typeparam name="valueType">对象类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="createQuery"></param>
        /// <param name="query">查询信息</param>
        /// <param name="keyName">关键之名称</param>
        /// <param name="sqlStream"></param>
        private unsafe void selectKeys <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query, string keyName, CharStream sqlStream)
            where valueType : class, modelType
            where modelType : class
        {
            sqlStream.SimpleWrite("select ");
            if (query.MemberMap != null)
            {
                DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap, constantConverter);
            }
            else
            {
                sqlStream.Write('*');
            }
            sqlStream.SimpleWrite(" from[");
            sqlStream.SimpleWrite(sqlTool.TableName);
            sqlStream.Write("]with(nolock)where ");
            sqlStream.SimpleWrite(keyName);
            sqlStream.SimpleWrite(" in(select ");
            sqlStream.SimpleWrite(keyName);
            sqlStream.SimpleWrite(" from(select ");
            sqlStream.SimpleWrite(keyName);
            sqlStream.Write(",row_number()over(");
            int startIndex = sqlStream.Length;

            createQuery.WriteOrder(sqlTool, sqlStream, constantConverter, ref query);
            string fieldName, fieldSqlName;

            query.GetIndex(out fieldName, out fieldSqlName);
            int count = sqlStream.Length - startIndex;

            sqlStream.SimpleWrite(")as ");
            sqlStream.SimpleWrite(orderOverName);
            sqlStream.SimpleWrite(" from[");
            sqlStream.SimpleWrite(sqlTool.TableName);
            sqlStream.SimpleWrite("]with(nolock)");
            sqlTool.Client.GetSql(createQuery.Where.Expression, sqlStream, ref query);
            if (query.IndexFieldName == null)
            {
                query.SetIndex(fieldName, fieldSqlName);
            }
            sqlStream.SimpleWrite(")as T where ");
            sqlStream.SimpleWrite(orderOverName);
            sqlStream.SimpleWrite(" between ");
            AutoCSer.Extensions.NumberExtension.ToString(query.SkipCount, sqlStream);
            sqlStream.SimpleWrite(" and ");
            AutoCSer.Extensions.NumberExtension.ToString(query.SkipCount + createQuery.GetCount - 1, sqlStream);
            sqlStream.Write(')');
            if (count != 0)
            {
                sqlStream.Write(sqlStream.Char + startIndex, count);
            }
        }
Example #3
0
 internal void GetSelectQuery <valueType, modelType>
     (Sql.Table <valueType, modelType> sqlTool, MemberMap <modelType> memberMap, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query)
     where valueType : class, modelType
     where modelType : class
 {
     query.MemberMap = DataModel.Model <modelType> .CopyMemberMap;
     if (memberMap != null && !memberMap.IsDefault)
     {
         query.MemberMap.And(memberMap);
     }
     GetSelectQuery(sqlTool, ref createQuery, ref query);
 }
Example #4
0
        /// <summary>
        /// 更新数据
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="connection">SQL连接</param>
        /// <param name="value">匹配成员值</param>
        /// <param name="memberMap">成员位图</param>
        /// <param name="query">查询信息</param>
        /// <returns>更新是否成功</returns>
        internal override bool Update <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, ref DbConnection connection, valueType value, MemberMap <modelType> memberMap, ref UpdateQuery <modelType> query)
        {
            if (connection == null)
            {
                connection = GetConnection();
            }
            if (connection != null)
            {
                if (query.NotQuery)
                {
                    if (executeNonQuery(connection, query.UpdateSql) > 0)
                    {
                        sqlTool.CallOnUpdated(value, null, memberMap);
                        return(true);
                    }
                }
                else
                {
                    bool isFinally = false;
                    try
                    {
                        using (DbCommand command = getCommand(connection, query.Sql))
                            using (DbDataReader reader = command.ExecuteReader(CommandBehavior.SingleResult))
                            {
                                if (reader.Read())
                                {
                                    valueType oldValue = AutoCSer.Emit.Constructor <valueType> .New();

                                    DataModel.Model <modelType> .Setter.Set(reader, oldValue, query.MemberMap);

                                    if (reader.NextResult() && reader.Read())
                                    {
                                        DataModel.Model <modelType> .Setter.Set(reader, value, query.MemberMap);

                                        sqlTool.CallOnUpdated(value, oldValue, memberMap);
                                        return(isFinally = true);
                                    }
                                }
                            }
                        isFinally = true;
                    }
                    finally
                    {
                        if (!isFinally)
                        {
                            sqlTool.Log.Add(AutoCSer.Log.LogType.Error, query.Sql);
                        }
                    }
                }
            }
            return(false);
        }
Example #5
0
        /// <summary>
        /// 获取查询信息
        /// </summary>
        /// <typeparam name="valueType">对象类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="createQuery"></param>
        /// <param name="query">查询信息</param>
        /// <returns>对象集合</returns>
        internal override void GetSelectQuery <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query)
        {
            CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null);

            if (sqlStream == null)
            {
                sqlStream = new CharStream(null, 0);
            }
            byte *buffer = null;

            try
            {
                sqlStream.Reset(buffer = AutoCSer.UnmanagedPool.Default.Get(), AutoCSer.UnmanagedPool.DefaultSize);
                if ((createQuery.GetCount | query.SkipCount) != 0)
                {
                    sqlStream.WriteNotNull("select * from(");
                }
                sqlStream.WriteNotNull("select ");
                if (query.MemberMap != null)
                {
                    DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap, constantConverter);
                }
                else
                {
                    sqlStream.Write('*');
                }
                sqlStream.WriteNotNull(" from ");
                sqlStream.WriteNotNull(sqlTool.TableName);
                sqlStream.Write(' ');
                createQuery.WriteWhere(sqlTool, sqlStream, ref query);
                createQuery.WriteOrder(sqlTool, sqlStream, constantConverter, ref query);
                if ((createQuery.GetCount | query.SkipCount) != 0)
                {
                    sqlStream.WriteNotNull(")where rownum between ");
                    AutoCSer.Extension.Number.ToString(query.SkipCount, sqlStream);
                    sqlStream.WriteNotNull(" and ");
                    AutoCSer.Extension.Number.ToString(createQuery.GetCount, sqlStream);
                    sqlStream.WriteNotNull(" order by rownum asc");
                }
                query.Sql = sqlStream.ToString();
            }
            finally
            {
                if (buffer != null)
                {
                    AutoCSer.UnmanagedPool.Default.Push(buffer);
                }
                sqlStream.Dispose();
                Interlocked.Exchange(ref this.sqlStream, sqlStream);
            }
        }
Example #6
0
        /// <summary>
        /// 删除数据
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="connection">SQL连接</param>
        /// <param name="value">添加数据</param>
        /// <param name="query">添加数据查询信息</param>
        /// <returns></returns>
        internal override bool Delete <valueType, modelType>(Sql.Table <valueType, modelType> sqlTool, ref DbConnection connection, valueType value, ref InsertQuery query)
        {
            GetQuery <modelType> getQuery = new GetQuery <modelType> {
                MemberMap = sqlTool.SelectMemberMap, Sql = query.Sql
            };

            if (Get(sqlTool, ref connection, value, ref getQuery) && executeNonQuery(connection, query.InsertSql) > 0)
            {
                sqlTool.CallOnDeleted(value);
                return(true);
            }
            return(false);
        }
Example #7
0
 /// <summary>
 /// 删除数据
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <typeparam name="modelType">模型类型</typeparam>
 /// <param name="sqlTool">SQL操作工具</param>
 /// <param name="transaction">事务操作</param>
 /// <param name="value">添加数据</param>
 /// <param name="query">添加数据查询信息</param>
 /// <returns></returns>
 internal override ReturnType Delete <valueType, modelType>(Sql.Table <valueType, modelType> sqlTool, Transaction transaction, valueType value, ref InsertQuery query)
 {
     if (sqlTool.CallOnDelete(value))
     {
         if (executeNonQuery(transaction, query.Sql) > 0)
         {
             sqlTool.CallOnDeleted(transaction, value);
             return(ReturnType.Success);
         }
         return(ReturnType.NotFoundData);
     }
     return(ReturnType.EventCancel);
 }
Example #8
0
        /// <summary>
        /// 缓存计数
        /// </summary>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="getKey">缓存关键字获取器</param>
        /// <param name="group">数据分组</param>
        protected Cache(Sql.Table <valueType, modelType> sqlTool, int group, Func <modelType, keyType> getKey)
            : base(sqlTool, group)
        {
            if (getKey == null)
            {
                throw new ArgumentNullException();
            }
            GetKey     = getKey;
            dictionary = DictionaryCreator <RandomKey <keyType> > .Create <KeyValue <valueType, int> >();

            sqlTool.OnUpdated += onUpdated;
            sqlTool.OnDeleted += onDeleted;
        }
Example #9
0
 /// <summary>
 /// 执行任务
 /// </summary>
 /// <param name="connection"></param>
 internal override Threading.LinkQueueTaskNode RunLinkQueueTask(ref DbConnection connection)
 {
     Threading.LinkQueueTaskNode next = LinkNext;
     try
     {
         Sql.Table <valueType, modelType> table = countMember.table;
         table.Client.Update(table, ref connection, countMember.updateValue, countMember.memberMap, ref Query, true);
     }
     finally { countMember.check(ref connection); }
     LinkNext = null;
     Push();
     return(next);
 }
Example #10
0
 /// <summary>
 /// 更新数据
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <typeparam name="modelType">模型类型</typeparam>
 /// <param name="sqlTool">SQL操作工具</param>
 /// <param name="transaction">事务操作</param>
 /// <param name="value">匹配成员值</param>
 /// <param name="memberMap">成员位图</param>
 /// <param name="query">查询信息</param>
 /// <returns>更新是否成功</returns>
 internal override ReturnType Update <valueType, modelType>
     (Sql.Table <valueType, modelType> sqlTool, Transaction transaction, valueType value, MemberMap <modelType> memberMap, ref UpdateQuery <modelType> query)
 {
     if (sqlTool.CallOnUpdate(value, memberMap))
     {
         if (executeNonQuery(transaction, query.Sql) > 0)
         {
             sqlTool.CallOnUpdated(transaction, value, memberMap);
             return(ReturnType.Success);
         }
         return(ReturnType.NotFoundData);
     }
     return(ReturnType.EventCancel);
 }
Example #11
0
 internal bool Insert <valueType, modelType>(Sql.Table <valueType, modelType> sqlTool, valueType value, MemberMap <modelType> memberMap, ref InsertQuery query)
     where valueType : class, modelType
     where modelType : class
 {
     if (memberMap == null)
     {
         memberMap = MemberMap <modelType> .Default;
     }
     if (DataModel.Model <modelType> .Verifyer.Verify(value, memberMap, sqlTool))
     {
         insert(sqlTool, value, memberMap, ref query);
         return(true);
     }
     return(false);
 }
Example #12
0
        /// <summary>
        /// 更新数据
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="connection">SQL连接</param>
        /// <param name="value">匹配成员值</param>
        /// <param name="memberMap">成员位图</param>
        /// <param name="query">查询信息</param>
        /// <returns>更新是否成功</returns>
        internal override bool Update <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, ref DbConnection connection, valueType value, MemberMap <modelType> memberMap, ref UpdateQuery <modelType> query)
        {
            GetQuery <modelType> getQuery = new GetQuery <modelType> {
                MemberMap = query.MemberMap, Sql = query.Sql
            };
            valueType oldValue = AutoCSer.Emit.Constructor <valueType> .New();

            if (Get(sqlTool, ref connection, oldValue, ref getQuery) && executeNonQuery(connection, query.UpdateSql) > 0 && Get(sqlTool, ref connection, value, ref getQuery))
            {
                sqlTool.CallOnUpdated(value, oldValue, memberMap);
                return(true);
            }
            return(false);
        }
Example #13
0
        /// <summary>
        /// 自增ID整表数组缓存
        /// </summary>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="memberCache"></param>
        /// <param name="isValue">数据匹配器,必须保证更新数据的匹配一致性</param>
        /// <param name="baseIdentity">基础ID</param>
        /// <param name="group">数据分组</param>
        public IdentityArrayWhere(Sql.Table <valueType, modelType> sqlTool, Expression <Func <valueType, memberCacheType> > memberCache
                                  , Func <valueType, bool> isValue, int group = 0, int baseIdentity = 0)
            : base(sqlTool, memberCache, group, baseIdentity, false)
        {
            if (isValue == null)
            {
                throw new ArgumentNullException();
            }
            this.isValue = isValue;

            sqlTool.OnInserted += onInserted;
            sqlTool.OnUpdated  += onUpdated;
            sqlTool.OnDeleted  += onDeleted;

            reset(null);
        }
Example #14
0
        /// <summary>
        /// 获取查询信息
        /// </summary>
        /// <typeparam name="valueType">对象类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="createQuery"></param>
        /// <param name="query">查询信息</param>
        /// <returns>对象集合</returns>
        internal override void GetSelectQuery <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query)
        {
            CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null);

            if (sqlStream == null)
            {
                sqlStream = new CharStream(null, 0);
            }
            byte *buffer = null;

            try
            {
                sqlStream.Reset(buffer = AutoCSer.UnmanagedPool.Default.Get(), AutoCSer.UnmanagedPool.DefaultSize);
                sqlStream.SimpleWriteNotNull("select ");
                int count = query.SkipCount + createQuery.GetCount;
                if (count != 0)
                {
                    sqlStream.SimpleWriteNotNull("top ");
                    AutoCSer.Extension.Number.ToString(count, sqlStream);
                    sqlStream.Write(' ');
                }
                if (query.MemberMap != null)
                {
                    DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap);
                }
                else
                {
                    sqlStream.Write('*');
                }
                sqlStream.SimpleWriteNotNull(" from [");
                sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                sqlStream.Write(']');
                createQuery.WriteWhere(sqlTool, sqlStream, ref query);
                createQuery.WriteOrder(sqlTool, sqlStream, ref query);
                query.Sql = sqlStream.ToString();
            }
            finally
            {
                if (buffer != null)
                {
                    AutoCSer.UnmanagedPool.Default.Push(buffer);
                }
                sqlStream.Dispose();
                Interlocked.Exchange(ref this.sqlStream, sqlStream);
            }
        }
Example #15
0
        /// <summary>
        /// 获取查询信息
        /// </summary>
        /// <typeparam name="valueType">对象类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="createQuery"></param>
        /// <param name="query">查询信息</param>
        /// <returns>对象集合</returns>
        internal override void GetSelectQuery <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query)
        {
            CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null);

            if (sqlStream == null)
            {
                sqlStream = new CharStream(null, 0);
            }
            byte *buffer = null;

            try
            {
                sqlStream.Reset(buffer = AutoCSer.UnmanagedPool.Default.Get(), AutoCSer.UnmanagedPool.DefaultSize);
                if (query.SkipCount != 0 && createQuery.IsOrder)
                {
                    if (DataModel.Model <modelType> .PrimaryKeys.Length == 1)
                    {
                        selectKeys(sqlTool, ref createQuery, ref query, DataModel.Model <modelType> .PrimaryKeys[0].SqlFieldName, sqlStream);
                    }
                    else if (DataModel.Model <modelType> .Identity != null)
                    {
                        selectKeys(sqlTool, ref createQuery, ref query, DataModel.Model <modelType> .IdentitySqlName, sqlStream);
                    }
                    else
                    {
                        selectRows(sqlTool, ref createQuery, ref query, sqlStream);
                    }
                }
                else
                {
                    selectNoOrder(sqlTool, ref createQuery, ref query, sqlStream);
                }
                query.Sql = sqlStream.ToString();
            }
            finally
            {
                if (buffer != null)
                {
                    AutoCSer.UnmanagedPool.Default.Push(buffer);
                }
                sqlStream.Dispose();
                Interlocked.Exchange(ref this.sqlStream, sqlStream);
            }
        }
Example #16
0
        /// <summary>
        /// 设置真实成员位图
        /// </summary>
        /// <typeparam name="valueType"></typeparam>
        /// <typeparam name="modelType"></typeparam>
        /// <param name="sqlTool"></param>
        /// <param name="memberMap"></param>
        internal override void SetRealMemberMap <valueType, modelType>(Sql.Table <valueType, modelType> sqlTool, MemberMap <modelType> memberMap)
        {
            if (sqlTool.Attribute.IsSetRealMemberMap)
            {
                MemberMap <modelType> realMemberMap = MemberMap <modelType> .NewEmpty();

                using (DbConnection connection = GetConnection())
                    using (DbCommand command = getCommand(connection, "select top 1 * from [" + sqlTool.TableName + "]", CommandType.Text))
                        using (DataSet dataSet = getDataSet(command))
                        {
                            foreach (DataColumn dataColumn in dataSet.Tables[0].Columns)
                            {
                                realMemberMap.SetMember(dataColumn.ColumnName);
                            }
                        }
                memberMap.And(realMemberMap);
            }
        }
Example #17
0
        /// <summary>
        /// 获取查询信息
        /// </summary>
        /// <typeparam name="valueType">对象类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="createQuery"></param>
        /// <param name="query">查询信息</param>
        /// <returns>对象集合</returns>
        internal override void GetSelectQuery <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query)
        {
            CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null);

            if (sqlStream == null)
            {
                sqlStream = new CharStream(default(AutoCSer.Memory.Pointer));
            }
            AutoCSer.Memory.Pointer buffer = default(AutoCSer.Memory.Pointer);
            try
            {
                buffer = UnmanagedPool.Default.GetPointer();
                sqlStream.Reset(ref buffer);
                sqlStream.SimpleWrite("select ");
                int count = query.SkipCount + createQuery.GetCount;
                if (count != 0)
                {
                    sqlStream.SimpleWrite("top ");
                    AutoCSer.Extensions.NumberExtension.ToString(count, sqlStream);
                    sqlStream.Write(' ');
                }
                if (query.MemberMap != null)
                {
                    AutoCSer.Sql.DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap, constantConverter);
                }
                else
                {
                    sqlStream.Write('*');
                }
                sqlStream.SimpleWrite(" from [");
                sqlStream.SimpleWrite(sqlTool.TableName);
                sqlStream.Write(']');
                createQuery.WriteWhere(sqlTool, sqlStream, ref query);
                createQuery.WriteOrder(sqlTool, sqlStream, constantConverter, ref query);
                query.Sql = sqlStream.ToString();
            }
            finally
            {
                UnmanagedPool.Default.Push(ref buffer);
                sqlStream.Dispose();
                Interlocked.Exchange(ref this.sqlStream, sqlStream);
            }
        }
Example #18
0
 /// <summary>
 /// 添加数据
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <typeparam name="modelType">模型类型</typeparam>
 /// <param name="sqlTool">SQL操作工具</param>
 /// <param name="transaction">事务操作</param>
 /// <param name="array">数据数组</param>
 /// <returns></returns>
 internal override SubArray <valueType> Insert <valueType, modelType>(Sql.Table <valueType, modelType> sqlTool, Transaction transaction, ref SubArray <valueType> array)
 {
     if (sqlTool.CallOnInsert(ref array))
     {
         MemberMap <modelType> memberMap = MemberMap <modelType> .Default;
         InsertQuery           query     = new InsertQuery();
         foreach (valueType value in array)
         {
             insert(sqlTool, value, memberMap, ref query);
             if (executeNonQuery(transaction, query.InsertSql) <= 0)
             {
                 return(default(SubArray <valueType>));
             }
         }
         sqlTool.CallOnInserted(transaction, array);
         return(array);
     }
     return(default(SubArray <valueType>));
 }
Example #19
0
 /// <summary>
 /// 添加数据
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <typeparam name="modelType">模型类型</typeparam>
 /// <param name="sqlTool">SQL操作工具</param>
 /// <param name="connection">SQL连接</param>
 /// <param name="value">添加数据</param>
 /// <param name="query">添加数据查询信息</param>
 /// <returns></returns>
 internal override bool Insert <valueType, modelType>(Sql.Table <valueType, modelType> sqlTool, ref DbConnection connection, valueType value, ref InsertQuery query)
 {
     if (executeNonQuery(ref connection, query.InsertSql) > 0)
     {
         if ((DataModel.Model <modelType> .Identity != null || DataModel.Model <modelType> .PrimaryKeys.Length != 0) && !query.NotQuery)
         {
             GetQuery <modelType> getQuery = new GetQuery <modelType> {
                 MemberMap = DataModel.Model <modelType> .MemberMap, Sql = query.Sql
             };
             if (!Get(sqlTool, ref connection, value, ref getQuery))
             {
                 return(false);
             }
         }
         sqlTool.CallOnInserted(value);
         return(true);
     }
     return(false);
 }
Example #20
0
        /// <summary>
        /// 获取查询信息
        /// </summary>
        /// <typeparam name="valueType">对象类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="createQuery"></param>
        /// <param name="query">查询信息</param>
        /// <returns>对象集合</returns>
        internal override void GetSelectQuery <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query)
        {
            CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null);

            if (sqlStream == null)
            {
                sqlStream = new CharStream(default(AutoCSer.Memory.Pointer));
            }
            AutoCSer.Memory.Pointer buffer = default(AutoCSer.Memory.Pointer);
            try
            {
                buffer = UnmanagedPool.Default.GetPointer();
                sqlStream.Reset(ref buffer);
                if (query.SkipCount != 0 && createQuery.IsOrder)
                {
                    if (DataModel.Model <modelType> .PrimaryKeys.Length == 1)
                    {
                        selectKeys(sqlTool, ref createQuery, ref query, constantConverter.ConvertName(DataModel.Model <modelType> .PrimaryKeys[0].FieldInfo.Name), sqlStream);
                    }
                    else if (DataModel.Model <modelType> .Identity != null)
                    {
                        selectKeys(sqlTool, ref createQuery, ref query, constantConverter.ConvertName(DataModel.Model <modelType> .Identity.FieldInfo.Name), sqlStream);
                    }
                    else
                    {
                        selectRows(sqlTool, ref createQuery, ref query, sqlStream);
                    }
                }
                else
                {
                    selectNoOrder(sqlTool, ref createQuery, ref query, sqlStream);
                }
                query.Sql = sqlStream.ToString();
            }
            finally
            {
                UnmanagedPool.Default.Push(ref buffer);
                sqlStream.Dispose();
                Interlocked.Exchange(ref this.sqlStream, sqlStream);
            }
        }
Example #21
0
 /// <summary>
 /// 获取查询信息
 /// </summary>
 /// <typeparam name="valueType">对象类型</typeparam>
 /// <typeparam name="modelType">模型类型</typeparam>
 /// <param name="sqlTool">SQL操作工具</param>
 /// <param name="connection"></param>
 /// <param name="sql"></param>
 /// <param name="readValue"></param>
 /// <returns>对象集合</returns>
 internal virtual LeftArray <valueType> Select <valueType, modelType>(Sql.Table <valueType, modelType> sqlTool, ref DbConnection connection, string sql, Func <DbDataReader, valueType> readValue)
     where valueType : class, modelType
     where modelType : class
 {
     if (connection == null)
     {
         connection = GetConnection();
     }
     if (connection != null)
     {
         using (DbCommand command = getCommand(connection, sql))
         {
             DbDataReader reader = null;
             try
             {
                 reader = command.ExecuteReader(CommandBehavior.SingleResult);
             }
             catch (Exception error)
             {
                 sqlTool.Log.Add(AutoCSer.Log.LogType.Error, error, sql);
             }
             if (reader != null)
             {
                 using (reader)
                 {
                     LeftArray <valueType> array = new LeftArray <valueType>();
                     while (reader.Read())
                     {
                         valueType value = readValue(reader);
                         if (value != null)
                         {
                             array.Add(value);
                         }
                     }
                     return(array);
                 }
             }
         }
     }
     return(default(LeftArray <valueType>));
 }
Example #22
0
 /// <summary>
 /// 添加数据
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <typeparam name="modelType">模型类型</typeparam>
 /// <param name="sqlTool">SQL操作工具</param>
 /// <param name="connection">SQL连接</param>
 /// <param name="array">数据数组</param>
 /// <param name="isIgnoreTransaction">是否忽略应用程序事务</param>
 /// <returns></returns>
 internal SubArray <valueType> Insert <valueType, modelType>(Sql.Table <valueType, modelType> sqlTool, ref DbConnection connection, ref SubArray <valueType> array, bool isIgnoreTransaction)
     where valueType : class, modelType
     where modelType : class
 {
     if (sqlTool.CallOnInsert(ref array))
     {
         if (isIgnoreTransaction)
         {
             return(Insert(sqlTool, ref connection, ref array));
         }
         if (AutoCSer.DomainUnload.Unloader.TransactionStart(false))
         {
             try
             {
                 return(Insert(sqlTool, ref connection, ref array));
             }
             finally { AutoCSer.DomainUnload.Unloader.TransactionEnd(); }
         }
     }
     return(default(SubArray <valueType>));
 }
Example #23
0
 /// <summary>
 /// 添加数据
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <typeparam name="modelType">模型类型</typeparam>
 /// <param name="sqlTool">SQL操作工具</param>
 /// <param name="connection">SQL连接</param>
 /// <param name="value">添加数据</param>
 /// <param name="query">添加数据查询信息</param>
 /// <param name="isIgnoreTransaction">是否忽略应用程序事务</param>
 /// <returns></returns>
 internal bool Insert <valueType, modelType>(Sql.Table <valueType, modelType> sqlTool, ref DbConnection connection, valueType value, ref InsertQuery query, bool isIgnoreTransaction)
     where valueType : class, modelType
     where modelType : class
 {
     if (sqlTool.CallOnInsert(value))
     {
         if (isIgnoreTransaction)
         {
             return(Insert(sqlTool, ref connection, value, ref query));
         }
         if (AutoCSer.DomainUnload.Unloader.TransactionStart(false))
         {
             try
             {
                 return(Insert(sqlTool, ref connection, value, ref query));
             }
             finally { AutoCSer.DomainUnload.Unloader.TransactionEnd(); }
         }
     }
     return(false);
 }
Example #24
0
        /// <summary>
        /// 查询对象
        /// </summary>
        /// <typeparam name="valueType">对象类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="value">匹配成员值</param>
        /// <param name="memberMap">成员位图</param>
        /// <param name="query">查询信息</param>
        internal override void GetByIdentity <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, valueType value, MemberMap <modelType> memberMap, ref GetQuery <modelType> query)
        {
            query.MemberMap = DataModel.Model <modelType> .CopyMemberMap;
            if (memberMap != null && !memberMap.IsDefault)
            {
                query.MemberMap.And(memberMap);
            }
            CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null);

            if (sqlStream == null)
            {
                sqlStream = new CharStream(null, 0);
            }
            byte *buffer = null;

            try
            {
                sqlStream.Reset(buffer = AutoCSer.UnmanagedPool.Default.Get(), AutoCSer.UnmanagedPool.DefaultSize);
                sqlStream.SimpleWriteNotNull("select top 1 ");
                DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap);

                sqlStream.SimpleWriteNotNull(" from ");
                sqlStream.SimpleWriteNotNull(sqlTool.TableName);
                sqlStream.WriteNotNull(" where ");
                sqlStream.SimpleWriteNotNull(DataModel.Model <modelType> .IdentitySqlName);
                sqlStream.Write('=');
                AutoCSer.Extension.Number.ToString(DataModel.Model <modelType> .GetIdentity(value), sqlStream);
                query.Sql = sqlStream.ToString();
            }
            finally
            {
                if (buffer != null)
                {
                    AutoCSer.UnmanagedPool.Default.Push(buffer);
                }
                sqlStream.Dispose();
                Interlocked.Exchange(ref this.sqlStream, sqlStream);
            }
        }
Example #25
0
        /// <summary>
        /// 查询对象集合
        /// </summary>
        /// <typeparam name="valueType">对象类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="createQuery"></param>
        /// <param name="query">查询信息</param>
        /// <param name="sqlStream"></param>
        private unsafe void selectNoOrder <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query, CharStream sqlStream)
            where valueType : class, modelType
            where modelType : class
        {
            sqlStream.SimpleWriteNotNull("select ");
            int count = query.SkipCount + createQuery.GetCount;

            if (count != 0)
            {
                sqlStream.SimpleWriteNotNull("top ");
                AutoCSer.Extension.Number.ToString(count, sqlStream);
                sqlStream.Write(' ');
            }
            DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap);

            sqlStream.SimpleWriteNotNull(" from [");
            sqlStream.SimpleWriteNotNull(sqlTool.TableName);
            sqlStream.SimpleWriteNotNull("]with(nolock)");
            createQuery.WriteWhere(sqlTool, sqlStream, ref query);
            createQuery.WriteOrder(sqlTool, sqlStream, ref query);
        }
Example #26
0
 /// <summary>
 /// 更新数据
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <typeparam name="modelType">模型类型</typeparam>
 /// <param name="sqlTool">SQL操作工具</param>
 /// <param name="connection">SQL连接</param>
 /// <param name="value">匹配成员值</param>
 /// <param name="memberMap">成员位图</param>
 /// <param name="query">查询信息</param>
 /// <param name="isIgnoreTransaction">是否忽略应用程序事务</param>
 /// <returns>更新是否成功</returns>
 internal bool Update <valueType, modelType>
     (Sql.Table <valueType, modelType> sqlTool, ref DbConnection connection, valueType value, MemberMap <modelType> memberMap, ref UpdateQuery <modelType> query, bool isIgnoreTransaction)
     where valueType : class, modelType
     where modelType : class
 {
     if (sqlTool.CallOnUpdate(value, memberMap))
     {
         if (isIgnoreTransaction)
         {
             return(Update(sqlTool, ref connection, value, memberMap, ref query));
         }
         if (AutoCSer.DomainUnload.Unloader.TransactionStart(false))
         {
             try
             {
                 return(Update(sqlTool, ref connection, value, memberMap, ref query));
             }
             finally { AutoCSer.DomainUnload.Unloader.TransactionEnd(); }
         }
     }
     return(false);
 }
Example #27
0
        /// <summary>
        /// 查询对象
        /// </summary>
        /// <typeparam name="valueType">对象类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="value">匹配成员值</param>
        /// <param name="memberMap">成员位图</param>
        /// <param name="query">查询信息</param>
        internal override void GetByIdentity <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, valueType value, MemberMap <modelType> memberMap, ref GetQuery <modelType> query)
        {
            query.MemberMap = DataModel.Model <modelType> .CopyMemberMap;
            if (memberMap != null && !memberMap.IsDefault)
            {
                query.MemberMap.And(memberMap);
            }
            CharStream sqlStream = Interlocked.Exchange(ref this.sqlStream, null);

            if (sqlStream == null)
            {
                sqlStream = new CharStream(default(AutoCSer.Memory.Pointer));
            }
            AutoCSer.Memory.Pointer buffer = default(AutoCSer.Memory.Pointer);
            try
            {
                buffer = UnmanagedPool.Default.GetPointer();
                sqlStream.Reset(ref buffer);
                sqlStream.SimpleWrite("select ");
                DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap, constantConverter);

                sqlStream.SimpleWrite(" from ");
                sqlStream.SimpleWrite(sqlTool.TableName);
                sqlStream.Write(" where ");
                constantConverter.ConvertNameToSqlStream(sqlStream, DataModel.Model <modelType> .Identity.FieldInfo.Name);
                sqlStream.Write('=');
                AutoCSer.Extensions.NumberExtension.ToString(DataModel.Model <modelType> .GetIdentity(value), sqlStream);
                query.Sql = sqlStream.ToString();
            }
            finally
            {
                UnmanagedPool.Default.Push(ref buffer);
                sqlStream.Dispose();
                Interlocked.Exchange(ref this.sqlStream, sqlStream);
            }
        }
Example #28
0
        /// <summary>
        /// 查询对象集合
        /// </summary>
        /// <typeparam name="valueType">对象类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="createQuery"></param>
        /// <param name="query">查询信息</param>
        /// <param name="sqlStream"></param>
        private unsafe void selectRows <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, ref CreateSelectQuery <modelType> createQuery, ref SelectQuery <modelType> query, CharStream sqlStream)
            where valueType : class, modelType
            where modelType : class
        {
            sqlStream.WriteNotNull("select * from(select ");
            if (query.MemberMap != null)
            {
                DataModel.Model <modelType> .GetNames(sqlStream, query.MemberMap);
            }
            else
            {
                sqlStream.Write('*');
            }
            sqlStream.WriteNotNull(",row_number()over(");
            createQuery.WriteOrder(sqlTool, sqlStream, ref query);
            string fieldName, fieldSqlName;

            query.GetIndex(out fieldName, out fieldSqlName);
            sqlStream.SimpleWriteNotNull(")as ");
            sqlStream.SimpleWriteNotNull(orderOverName);
            sqlStream.SimpleWriteNotNull(" from[");
            sqlStream.SimpleWriteNotNull(sqlTool.TableName);
            sqlStream.SimpleWriteNotNull("]with(nolock)");
            sqlTool.Client.GetSql(createQuery.Where, sqlStream, ref query);
            if (query.IndexFieldName == null)
            {
                query.SetIndex(fieldName, fieldSqlName);
            }
            sqlStream.SimpleWriteNotNull(")as T where ");
            sqlStream.SimpleWriteNotNull(orderOverName);
            sqlStream.SimpleWriteNotNull(" between ");
            AutoCSer.Extension.Number.ToString(query.SkipCount, sqlStream);
            sqlStream.SimpleWriteNotNull(" and ");
            AutoCSer.Extension.Number.ToString(query.SkipCount + createQuery.GetCount - 1, sqlStream);
        }
Example #29
0
        /// <summary>
        /// SQL操作缓存
        /// </summary>
        /// <param name="table">SQL操作工具</param>
        /// <param name="group">数据分组</param>
        protected Cache(Sql.Table<valueType, modelType> table, int group) : base(table, group)
        {
            table.IsOnlyQueue = true;
            if (group == 0)
            {
#if NOJIT
                logProxyLoadedField = typeof(modelType).GetField(LogStream.Log.IsSqlLogProxyLoadedName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                if (logProxyLoadedField != null) table.OnLogMemberLoaded += onLogMemberLoaded;
#else
                FieldInfo logProxyLoadedField = typeof(modelType).GetField(LogStream.Log.IsSqlLogProxyLoadedName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                if (logProxyLoadedField != null)
                {
                    DynamicMethod dynamicMethod = new DynamicMethod("SetIsLogProxyLoaded", null, new System.Type[] { typeof(modelType) }, typeof(modelType), true);
                    ILGenerator generator = dynamicMethod.GetILGenerator();
                    generator.Emit(OpCodes.Ldarg_0);
                    generator.int32(1);
                    generator.Emit(OpCodes.Stfld, logProxyLoadedField);
                    generator.Emit(OpCodes.Ret);
                    setIsLogProxyLoaded = (Action<modelType>)dynamicMethod.CreateDelegate(typeof(Action<modelType>));
                    table.OnLogMemberLoaded += onLogMemberLoaded;
                }
#endif
            }
        }
Example #30
0
        /// <summary>
        /// 执行SQL语句并更新成员
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <typeparam name="modelType">模型类型</typeparam>
        /// <param name="sqlTool">SQL操作工具</param>
        /// <param name="connection">SQL连接</param>
        /// <param name="value">目标对象</param>
        /// <param name="query">查询信息</param>
        /// <returns>更新是否成功</returns>
        internal bool Get <valueType, modelType>
            (Sql.Table <valueType, modelType> sqlTool, ref DbConnection connection, valueType value, ref GetQuery <modelType> query)
            where valueType : class, modelType
            where modelType : class
        {
            if (connection == null)
            {
                connection = GetConnection();
            }
            if (connection != null)
            {
                bool isFinally = false;
                try
                {
                    using (DbCommand command = getCommand(connection, query.Sql))
                        using (DbDataReader reader = command.ExecuteReader(CommandBehavior.SingleResult))
                        {
                            if (reader.Read())
                            {
                                DataModel.Model <modelType> .Setter.Set(reader, value, query.MemberMap);

                                return(isFinally = true);
                            }
                        }
                    isFinally = true;
                }
                finally
                {
                    if (!isFinally)
                    {
                        sqlTool.Log.Add(AutoCSer.Log.LogType.Error, query.Sql);
                    }
                }
            }
            return(false);
        }