Example #1
0
        public async Task QueryAllByQueue(SQueue queue, int pageSize, Func <List <SMessage>, Task <bool> > callBack)
        {
            //根据存储类型和服务器名称获取连接字符串
            var strConn = _messageQueueConnectionFactory.CreateReadForMessageQueue(queue.StoreType, queue.ServerName);

            List <SMessage> messageList = new List <SMessage>();

            await DBTransactionHelper.SqlTransactionWorkAsync(DBTypes.SqlServer, true, false, strConn, async (conn, transaction) =>
            {
                int page = 0;

                while (true)
                {
                    page++;
                    messageList.Clear();

                    SqlTransaction sqlTran = null;
                    if (transaction != null)
                    {
                        sqlTran = (SqlTransaction)transaction;
                    }

                    await using (SqlCommand commond = new SqlCommand()
                    {
                        Connection = (SqlConnection)conn,
                        CommandType = CommandType.Text,
                        Transaction = sqlTran,
                        CommandText = string.Format(@"select {0} from {1} order by [createtime]
                                                     offset ( @pagesize * (@page - 1 )) rows 
		                                             fetch next @pagesize rows only"        , StoreHelper.GetSMessageSelectFields(string.Empty), queue.Name)
                    })
                    {
                        var parameter = new SqlParameter("@pagesize", SqlDbType.Int)
                        {
                            Value = pageSize
                        };
                        commond.Parameters.Add(parameter);

                        parameter = new SqlParameter("@page", SqlDbType.Int)
                        {
                            Value = page
                        };
                        commond.Parameters.Add(parameter);


                        await commond.PrepareAsync();

                        SqlDataReader reader = null;

                        await using (reader = await commond.ExecuteReaderAsync())
                        {
                            while (await reader.ReadAsync())
                            {
                                var message = new SMessage();
                                StoreHelper.SetSMessageSelectFields(message, reader, string.Empty);
                                message.Extensions[_queueName] = queue;
                                messageList.Add(message);
                            }

                            await reader.CloseAsync();
                        }
                    }


                    var callbackResult = await callBack(messageList);


                    if (messageList.Count != pageSize || !callbackResult)
                    {
                        break;
                    }
                }
            });
        }