刚通过开通写博客的申请,向博客园的大佬致敬,由于一直以来都在网上搜索大家的思想,也有翻遍整个百度都有的找不到的时候,作为一个网民理应为互联网贡献一点东西。

下面是我工作后受一个师傅的影响对数据库访问层的封装,多年以来一直都在使用,用的特别爽,请看下面的代码:

第一步、需要编写一个通用的用于查询的数据库存储过程,这个存储过程接受“表名、查询字段、排序、页大小、页码”:

CREATE PROCEDURE [dbo].[P_Pagination]
@tblName varchar(5000), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@strWhere varchar(1500) = '', -- 查询条件(注意: 不要加 where)
@OrderSql varchar(255) = '', -- 排序语句(注意: 不要加 order by)
@PageSize int = 0, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0 -- 返回记录总数,非 0 值则返回
AS
BEGIN
declare @strSQL varchar(5000) -- 主语句 if @doCount <> 0
begin
if @strWhere <> ''
set @strSQL = 'select count(*) as Total from ' + @tblName + ' where ' + @strWhere
else
set @strSQL = 'select count(*) as Total from ' + @tblName + ''
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
else
begin
if @PageSize = 0 --返回所有记录集
begin
if @strWhere <> ''
set @strSQL = 'select ' + @strGetFields + ' from ' + @tblName + ' where ' + @strWhere + ' order by ' + @OrderSql
else
set @strSQL = 'select ' + @strGetFields + ' from ' + @tblName + ' order by ' + @OrderSql
end
else
begin
if @PageIndex = 1
begin
if @strWhere <> ''
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @strGetFields + ' from ' + @tblName + ' where ' + @strWhere + ' order by ' + @OrderSql
else
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @strGetFields + ' from ' + @tblName + ' order by ' + @OrderSql
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
if @strWhere = ''
set @strSQL = 'select top ' + str(@PageSize) + ' tblTmp.* from '
+ '(select ROW_NUMBER() OVER(order by ' + @OrderSql + ') AS RowNum,' + @strGetFields + ' from ' + @tblName + ') tblTmp where tblTmp.[RowNum] > '
+ '(select max([RowNum]) from '
+ '(select top ' + str((@PageIndex - 1) * @PageSize) + ' ROW_NUMBER() OVER(order by ' + @OrderSql + ') AS RowNum from ' + @tblName + ') as tblTmp1)'
else
set @strSQL = 'select top ' + str(@PageSize) + ' tblTmp.* from '
+ '(select ROW_NUMBER() OVER(order by ' + @OrderSql + ') AS RowNum,' + @strGetFields + ' from ' + @tblName + ' where ' + @strWhere + ') tblTmp where tblTmp.[RowNum] > '
+ '(select max([RowNum]) from '
+ '(select top ' + str((@PageIndex - 1) * @PageSize) + ' ROW_NUMBER() OVER(order by ' + @OrderSql + ') AS RowNum from ' + @tblName + ' where ' + @strWhere + ') as tblTmp1)'
end
end
end
exec (@strSQL);
END

第二步、封装数据库访问层,该层实现执行存储过程或SQL语句返回 DataTable、SqlDataReader、受影响行数:

namespace Ant.DAL
{
/// <summary>
/// 存储过程返回值
/// </summary>
public class ProcResultValue
{
/// <summary>
/// @Result 字符串返回值
/// </summary>
public string ResultValueStr { get; set; } /// <summary>
/// Return 任意类型返回值
/// </summary>
public int ReturnValueInt { get; set; } /// <summary>
/// 存储过程异常实体信息返回
/// </summary>
public string ReturnValue
{
get
{
if (ReturnValueInt <= )
return ResultValueStr;
else
return "";
}
}
} /// <summary>
/// 数据库基础操作类
/// </summary>
public class Database
{
// 测试用Sql连接字符串
private static string SqlConn_Debug = System.Configuration.ConfigurationManager.ConnectionStrings["ConnDB"].ToString();/// <summary>
/// 数据库基础操作类 构造函数
/// </summary>
public Database()
{
} /// <summary>
/// 获得数据库连接数据
/// </summary>
/// <returns>数据库连接信息</returns>
protected SqlConnection GetConn()
{
SqlConnection ConnDB = new SqlConnection(SqlConn_Debug);
ConnDB.StateChange += new StateChangeEventHandler(ConnDB_StateChange);
ConnDB.Open();
return ConnDB;
} /// <summary>
/// 数据库链接状态改变事件
/// </summary>
protected void ConnDB_StateChange(object sender, StateChangeEventArgs e)
{
if (e.CurrentState == ConnectionState.Closed)
{
((SqlConnection)sender).Dispose(); // 释放资源
GC.Collect(); // 释放资源
}
} /// <summary>
/// 获得对应表序列的新ID
/// </summary>
/// <param name="TableName">表名</param>
/// <param name="TableCol">表ID列名</param>
/// <param name="TableWhere">查询条件(注意:不添加'where')</param>
/// <returns>返回:序列的新ID</returns>
protected int GetSequence(string TableName, string TableCol, string tableWhere = "")
{
DataParameters DP = new DataParameters();
DP.Add("@TableName", SqlDbType.VarChar, TableName);
DP.Add("@TableCol", SqlDbType.VarChar, TableCol);
DP.Add("@tableWhere", SqlDbType.VarChar, tableWhere);
return ExeProc("P_Sequence", DP, false).ReturnValueInt;
} /// <summary>
/// 通过存储过程,获得数据集 DataReader
/// </summary>
/// <param name="tblName">要查询的表名</param>
/// <param name="strGetFields">要查询的字段</param>
/// <param name="strWhere">查询条件(注意:不要加 "where")</param>
/// <param name="OrderSql">排序规则(注意:不要加 "order by",且不能为空)</param>
/// <param name="PageSize">页大小 为0时,则不分页</param>
/// <param name="PageIndex">页索引</param>
/// <returns>返回:记录集 SqlDataReader</returns>
protected SqlDataReader GetDataReader(string tblName, string strGetFields, string strWhere, string OrderSql, int PageSize, int PageIndex)
{
SqlCommand Cmd = new SqlCommand("P_Pagination", GetConn());
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add("@tblName", SqlDbType.VarChar).Value = tblName;
Cmd.Parameters.Add("@strGetFields", SqlDbType.VarChar).Value = strGetFields;
Cmd.Parameters.Add("@strWhere", SqlDbType.VarChar).Value = strWhere;
Cmd.Parameters.Add("@OrderSql", SqlDbType.VarChar).Value = OrderSql;
Cmd.Parameters.Add("@PageSize", SqlDbType.Int).Value = PageSize;
Cmd.Parameters.Add("@PageIndex", SqlDbType.Int).Value = PageIndex;
Cmd.Parameters.Add("@doCount", SqlDbType.Bit).Value = false;
return Cmd.ExecuteReader(CommandBehavior.CloseConnection);
} /// <summary>
/// 通过存储过程及自定义参数,获得数据集 DataReader
/// </summary>
/// <param name="ProcName">存储过程名</param>
/// <param name="DataParas">存储过程参数集</param>
/// <returns>返回:记录集 SqlDataReader</returns>
protected SqlDataReader GetDataReader(string ProcName, DataParameters DataParas)
{
SqlCommand Cmd = new SqlCommand(ProcName, GetConn());
Cmd.CommandType = CommandType.StoredProcedure; // 遍历 存储过程参数集
foreach (System.Collections.DictionaryEntry obj in DataParas.Parameters)
{
Cmd.Parameters.Add(obj.Key.ToString(), (SqlDbType)((object[])obj.Value)[]).Value = ((object[])obj.Value)[];
}
return Cmd.ExecuteReader(CommandBehavior.CloseConnection);
} /// <summary>
/// 通过存储过程,获得数据集 DataTable
/// </summary>
/// <param name="tblName">要查询的表名</param>
/// <param name="strGetFields">要查询的字段</param>
/// <param name="strWhere">查询条件(注意:不要加 "where")</param>
/// <param name="OrderSql">排序规则(注意:不要加 "order by",且不能为空)</param>
/// <param name="PageSize">页大小 为0时,则不分页</param>
/// <param name="PageIndex">页索引</param>
/// <returns>返回:记录集 DataTable</returns>
protected DataTable GetDataTable(string tblName, string strGetFields, string strWhere, string OrderSql, int PageSize, int PageIndex)
{
SqlCommand Cmd = new SqlCommand("P_Pagination", GetConn());
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add("@tblName", SqlDbType.VarChar).Value = tblName;
Cmd.Parameters.Add("@strGetFields", SqlDbType.VarChar).Value = strGetFields;
Cmd.Parameters.Add("@strWhere", SqlDbType.VarChar).Value = strWhere;
Cmd.Parameters.Add("@OrderSql", SqlDbType.VarChar).Value = OrderSql;
Cmd.Parameters.Add("@PageSize", SqlDbType.Int).Value = PageSize;
Cmd.Parameters.Add("@PageIndex", SqlDbType.Int).Value = PageIndex;
Cmd.Parameters.Add("@doCount", SqlDbType.Bit).Value = false;
SqlDataAdapter DA = new SqlDataAdapter(Cmd);
DataTable DT = new DataTable();
DA.Fill(DT);
Cmd.Connection.Close();
return DT;
} /// <summary>
/// 通过指定的存储过程名称,获取数据集 DataTable
/// </summary>
/// <param name="ProcName">存储过程名</param>
/// <param name="DataParas">存储过程参数集</param>
/// <returns>返回:记录集 DataTable</returns>
protected DataTable GetDataTable(string ProcName, DataParameters DataParas = null)
{
SqlCommand Cmd = new SqlCommand(ProcName, GetConn());
Cmd.CommandType = CommandType.StoredProcedure; // 遍历 存储过程参数集
if(DataParas != null)
{
foreach (System.Collections.DictionaryEntry obj in DataParas.Parameters)
{
Cmd.Parameters.Add(obj.Key.ToString(), (SqlDbType)((object[])obj.Value)[]).Value = ((object[])obj.Value)[];
}
}
SqlDataAdapter DA = new SqlDataAdapter(Cmd);
DataTable DT = new DataTable();
DA.Fill(DT);
Cmd.Connection.Close();
return DT;
} /// <summary>
/// 执行SQL查询语句,获取数据集 DataReader
/// </summary>
/// <param name="sqlTxt">要执行的SQL语句</param>
/// <returns>返回:记录集 DataReader</returns>
protected SqlDataReader GetDataReader(string sqlTxt)
{
SqlCommand Cmd = new SqlCommand(sqlTxt, GetConn());
Cmd.CommandType = CommandType.Text;
return Cmd.ExecuteReader(CommandBehavior.CloseConnection);
} /// <summary>
/// 执行SQL查询语句,获取数据集 DataTable
/// </summary>
/// <param name="sqlTxt">要执行的SQL语句</param>
/// <returns>返回:记录集 DataTable</returns>
protected DataTable GetDataTable(string sqlTxt)
{
SqlCommand Cmd = new SqlCommand(sqlTxt, GetConn());
Cmd.CommandType = CommandType.Text;
SqlDataAdapter DA = new SqlDataAdapter(Cmd);
DataTable DT = new DataTable();
DA.Fill(DT);
Cmd.Connection.Close();
return DT;
} /// <summary>
/// 通过存储过程,获得数据集 总数
/// </summary>
/// <param name="tblName">要查询的表名</param>
/// <param name="strWhere">查询条件</param>
/// <returns>返回:记录集数量</returns>
protected int GetDataCount(string tblName, string strWhere = "")
{
SqlCommand Cmd = new SqlCommand("P_Pagination", GetConn());
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add("@tblName", SqlDbType.VarChar).Value = tblName;
Cmd.Parameters.Add("@strGetFields", SqlDbType.VarChar).Value = "*";
Cmd.Parameters.Add("@strWhere", SqlDbType.VarChar).Value = strWhere;
Cmd.Parameters.Add("@OrderSql", SqlDbType.VarChar).Value = "";
Cmd.Parameters.Add("@PageSize", SqlDbType.Int).Value = ;
Cmd.Parameters.Add("@PageIndex", SqlDbType.Int).Value = ;
Cmd.Parameters.Add("@doCount", SqlDbType.Bit).Value = true;
int Result = (int)Cmd.ExecuteScalar();
Cmd.Connection.Close();
return Result;
} /// <summary>
/// 执行SQL查询语句,并返回数据集长度
/// </summary>
/// <param name="sqlTxt">要执行的SQL语句</param>
/// <returns>返回:数据集长度</returns>
protected int GetDataCount(string sqlTxt)
{
SqlCommand Cmd = new SqlCommand(sqlTxt, GetConn());
Cmd.CommandType = CommandType.Text;
SqlDataAdapter DA = new SqlDataAdapter(Cmd);
DataTable DT = new DataTable();
DA.Fill(DT);
Cmd.Connection.Close();
return DT.Rows.Count;
} /// <summary>
/// 执行查询语句,并返回第一行第一列数据
/// </summary>
/// <param name="SelectTxt">要执行的查询语句</param>
/// <returns>返回查询结果集的第一行第一列数据</returns>
protected object GetOnlyData(string SelectTxt)
{
SqlCommand Cmd = new SqlCommand(SelectTxt, GetConn());
object Result = Cmd.ExecuteScalar();
Cmd.Connection.Close();
return Result;
} /// <summary>
/// 执行语句,并返回受影响的行数
/// </summary>
/// <param name="CmdTxt">要执行的 增、删、改 语句</param>
/// <returns>返回受影响的行数</returns>
protected int RunSqlCommand(string CmdTxt)
{
SqlCommand Cmd = new SqlCommand(CmdTxt, GetConn());
int ExecuteCount = Cmd.ExecuteNonQuery();
Cmd.Connection.Close();
Cmd.Dispose();
return ExecuteCount;
} /// <summary>
/// 执行存储过程,并返回存储过程执行结果(字符串)
/// </summary>
/// <param name="ProcName">存储过程名称</param>
/// <param name="DataParas">存储过程参数集</param>
/// <param name="HasResult">该存储过程是否有返回值</param>
/// <returns>存储过程返回值</returns>
protected ProcResultValue ExeProc(string ProcName, DataParameters DataParas, bool HasResult)
{
// 此处预留异常处理Try catch, 由Application获取并跳转异常页面。
// 返回值
ProcResultValue Result = new ProcResultValue(); // 创建 Command
SqlCommand Cmd = new SqlCommand(ProcName, GetConn());
Cmd.CommandType = CommandType.StoredProcedure; // 遍历 存储过程参数集
foreach (System.Collections.DictionaryEntry obj in DataParas.Parameters)
{
Cmd.Parameters.Add(obj.Key.ToString(), (SqlDbType)((object[])obj.Value)[]).Value = ((object[])obj.Value)[];
} // 创建返回参数
if (HasResult)
{
Cmd.Parameters.Add("@Result", SqlDbType.NVarChar, -);
Cmd.Parameters["@Result"].Direction = ParameterDirection.Output;
} //存储过程默认返回值 存储过程:Return
Cmd.Parameters.Add("@Return", SqlDbType.Int);
Cmd.Parameters["@Return"].Direction = ParameterDirection.ReturnValue; // 执行存储过程
Cmd.ExecuteNonQuery(); // 获得返回值
if (HasResult)
Result.ResultValueStr = Cmd.Parameters["@Result"].Value.ToString();
Result.ReturnValueInt = (Cmd.Parameters["@Return"].Value is int ? (int)Cmd.Parameters["@Return"].Value : -); // 关闭数据库链接
Cmd.Connection.Close(); // 在这里执行一些存储过程catch异常的操作
if(Result.ReturnValueInt == -)
{ } // 返回执行结果
return Result;
} /// <summary>
/// 执行函数,并返回函数执行结果
/// </summary>
/// <param name="FuncName">函数名称</param>
/// <param name="DataParas">函数参数集</param>
/// <param name="ResultType">返回值类型</param>
/// <returns>存储过程返回值</returns>
protected object ExeFunc(string FuncName, DataParameters DataParas, SqlDbType ResultType)
{
// 返回值
object Result = null; // 创建 Command
SqlCommand Cmd = new SqlCommand(FuncName, GetConn());
Cmd.CommandType = CommandType.StoredProcedure; // 遍历 存储过程参数集
foreach (System.Collections.DictionaryEntry obj in DataParas.Parameters)
{
Cmd.Parameters.Add(obj.Key.ToString(), (SqlDbType)((object[])obj.Value)[]).Value = ((object[])obj.Value)[];
} // 创建返回参数
Cmd.Parameters.Add("@Return", ResultType, -);
Cmd.Parameters["@Return"].Direction = ParameterDirection.ReturnValue; // 执行存储过程
Cmd.ExecuteScalar(); // 获得返回值
Result = Cmd.Parameters["@Return"].Value; // 关闭数据库链接
Cmd.Connection.Close(); // 返回执行结果
return Result;
}
}
}

第三步、上面对数据库访问封装方法有一个DataParameters传参对象,你没有想错,这个对象是自己封装的类,调用起来更加方便,请看下面代码

namespace Ant.DAL
{
/// <summary>
/// 数据库[存储过程、函数]参数类
/// </summary>
public class DataParameters
{
private Hashtable HT = new Hashtable(); // 存储过程参数表 /// <summary>
/// 数据库[存储过程、函数]参数类 构造函数
/// </summary>
public DataParameters()
{
} /// <summary>
/// 数据库[存储过程、函数] 参数表
/// </summary>
public Hashtable Parameters
{
get
{
return HT;
}
} /// <summary>
/// 添加数据库[存储过程、函数]的参数
/// </summary>
/// <param name="ParaName">参数名称</param>
/// <param name="ParaType">参数类型</param>
/// <param name="ParaValue">参数值</param>
public void Add(string ParaName, SqlDbType ParaType, object ParaValue)
{
HT.Add(ParaName, new object[] { ParaType, ParaValue });
}
}
}

第四步、调用

        /// <summary>
/// (查询调用)根据条件查询系统操作对象数据
/// </summary>
/// <param name="sqlField">查询字段</param>
/// <param name="sqlWhere">查询条件 注:不要加 Where</param>
/// <param name="orderBy">排序 注:不要加 Order By</param>
/// <param name="pageSize">页大小 大于等于 0</param>
/// <param name="pageIndex">页码 大于等于 1</param>
/// <returns>返回:SqlDataReader</returns>
public SqlDataReader GetData(string sqlField, string sqlWhere, string orderBy, int pageSize, int pageIndex)
{
return base.GetDataReader("Base_Action", sqlField, sqlWhere, orderBy, pageSize, pageIndex);
} /// <summary>
/// (存储过程增删改调用)设置单条系统操作对象
/// </summary>
/// <param name="editSign">操作标识</param>
/// <param name="ID">主键ID</param>
/// <param name="Menu">类型ID(系统菜单ID、公共页面对象ID)</param>
/// <param name="Name">名称:按钮/链接ID</param>
/// <param name="Text">描述:按钮/连接名称</param>
/// <returns>返回:操作结果 空/异常信息</returns>
public ProcResultValue SetActionInfo(SetActionInfo_EditSign editSign, long ID, long Menu, string Name, string Text)
{
DataParameters DP = new DataParameters();
DP.Add("@EditSign", System.Data.SqlDbType.Int, (int)editSign);
DP.Add("@ID", System.Data.SqlDbType.BigInt, ID);
DP.Add("@Menu", System.Data.SqlDbType.BigInt, Menu);
DP.Add("@Name", System.Data.SqlDbType.VarChar, Name);
DP.Add("@Text", System.Data.SqlDbType.NVarChar, Text);
return base.ExeProc("P_Base_Action", DP, true);
}

ASP.NET 一个数据访问层的封装的更多相关文章

  1. 【原创】打造基于Dapper的数据访问层

    [原创]打造基于Dapper的数据访问层   前言 闲来无事,花几天功夫将之前项目里用到的一个数据访问层整理了出来.实现单个实体的增删改查,可执行存储过程,可输出返回参数,查询结果集可根据实际情况返回 ...

  2. ClownFish:比手写代码还快的通用数据访问层

    http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...

  3. 【Hades】ades是一个开源库,基于JPA和Spring构建,通过减少开发工作量显著的改进了数据访问层的实现

    几乎每个应用系统都需要通过访问数据来完成工作.要想使用领域设计方法,你就需要为实体类定义和构建资源库来实现领域对象的持久化.目前开发人员经常使用JPA来实现持久化库.JPA让持久化变得非常容易,但是仍 ...

  4. asp.net/wingtip/创建数据访问层

    一. 什么是数据访问层 在wingtip项目中,数据访问层是对以下三者的总称:1. product类等数据相关的实体类(class)2. 数据库(database),对实体类成员的存储3. 上述二者的 ...

  5. servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因

    package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...

  6. 使用JDBC构建简单的数据访问层

    本教程的目的是使用Java编写的分离的层去访问数据库中的表,这一层通常称为数据访问层(DAL) 使用DAL的最大好处是通过直接使用一些类似insert()和find()的方法简化了数据库的访问操作,而 ...

  7. 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布

    在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...

  8. 数据访问层的改进以及测试DOM的发布

    数据访问层的改进以及测试DOM的发布 在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层 ...

  9. 项目架构开发:数据访问层之Logger

    接上文 项目架构开发:数据访问层之Cache 本章我们继续ILogger的开发 ILogger.cs public interface ILogger { void Info(object messa ...

随机推荐

  1. 【lamba】java 8的新特性

    看到lamba表达式用起来还不错,找了几篇文章学习下: 所以结合之前两个反编译的结果可以看到,lamdba表达式运行整体思路大致如下: 1. lamdba表达式被编译生成当前类的一个私有静态方法 2. ...

  2. EF Core 2.2 对多个 DbContext 多个数据库的情况进行迁移的示例

    目录 场景 创建新项目 创建第一个模型 创建第二个模型 使用依赖注入注册上下文 创建数据库 场景 在一个项目中,使用了多个 DbContext 且每个 DbContext 对应一个数据库的情况 创建新 ...

  3. javamail 发送、读取邮件

    概述 1.邮件相关的标准 厂商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: SMTP(Simple Mail Transfer Protocol) :即简单邮 ...

  4. 在SSL / https下托管SignalR

    https://weblog.west-wind.com/posts/2013/Sep/23/Hosting-SignalR-under-SSLhttps  2013年9月23日•来自毛伊岛,HI• ...

  5. SQL注入绕WAF总结

    0x00 前言 在服务器客户端领域,曾经出现过一款360主机卫士,目前已停止更新和维护,官网都打不开了,但服务器中依然经常可以看到它的身影.从半年前的测试虚拟机里面,翻出了360主机卫士Apache版 ...

  6. c语言博客作业--结构体&文件

    1.本章学习总结 1.1思维导图 1.2.本章学习体会 本章学到了结构体如何构建,用typedef进行重定义结构体,结构指针,访问结构体的方式等. 文件:文件的读取,文件读写的几个函数,基本了解了文本 ...

  7. 微信小程序1

    本次项目主要了解及使用微信小程序,以及更好的理解微信动画,wxss,JavaScript,ajax,xml等技术: 借助的平台是java后端设计语言以及微信小程序界面,设计 该系统分为1,个人用户端: ...

  8. [CF893F] Subtree Minimum Query

    Description: 给定一棵树,每次询问某点子树中到其不超过k的所有点的最小点权 强制在线 Hint: \(n,m\le 10^5\) Solution: 看到题目第一反应是以深度为下标,dfs ...

  9. ubuntu 14.04 安装 rabbitmq

    1. sudo apt-get update 安装rabbitmq 2. sudo apt-get install rabbitmq-server 添加用户 3. sudo rabbitmqctl a ...

  10. 使用PIA查找组件的PeopleSoft导航

    导航到企业组件>查找对象导航. 使用组件名称 使用页面名称 使用辅助页面名称 使用内容参考名称 只需输入对象名称,然后单击“搜索”即可.在这个例子中.我们知道组件名称即'PRCSDEFN',我们 ...