ASP.NET 一个数据访问层的封装
刚通过开通写博客的申请,向博客园的大佬致敬,由于一直以来都在网上搜索大家的思想,也有翻遍整个百度都有的找不到的时候,作为一个网民理应为互联网贡献一点东西。
下面是我工作后受一个师傅的影响对数据库访问层的封装,多年以来一直都在使用,用的特别爽,请看下面的代码:
第一步、需要编写一个通用的用于查询的数据库存储过程,这个存储过程接受“表名、查询字段、排序、页大小、页码”:
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 一个数据访问层的封装的更多相关文章
- 【原创】打造基于Dapper的数据访问层
[原创]打造基于Dapper的数据访问层 前言 闲来无事,花几天功夫将之前项目里用到的一个数据访问层整理了出来.实现单个实体的增删改查,可执行存储过程,可输出返回参数,查询结果集可根据实际情况返回 ...
- ClownFish:比手写代码还快的通用数据访问层
http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...
- 【Hades】ades是一个开源库,基于JPA和Spring构建,通过减少开发工作量显著的改进了数据访问层的实现
几乎每个应用系统都需要通过访问数据来完成工作.要想使用领域设计方法,你就需要为实体类定义和构建资源库来实现领域对象的持久化.目前开发人员经常使用JPA来实现持久化库.JPA让持久化变得非常容易,但是仍 ...
- asp.net/wingtip/创建数据访问层
一. 什么是数据访问层 在wingtip项目中,数据访问层是对以下三者的总称:1. product类等数据相关的实体类(class)2. 数据库(database),对实体类成员的存储3. 上述二者的 ...
- servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因
package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...
- 使用JDBC构建简单的数据访问层
本教程的目的是使用Java编写的分离的层去访问数据库中的表,这一层通常称为数据访问层(DAL) 使用DAL的最大好处是通过直接使用一些类似insert()和find()的方法简化了数据库的访问操作,而 ...
- 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布
在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...
- 数据访问层的改进以及测试DOM的发布
数据访问层的改进以及测试DOM的发布 在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层 ...
- 项目架构开发:数据访问层之Logger
接上文 项目架构开发:数据访问层之Cache 本章我们继续ILogger的开发 ILogger.cs public interface ILogger { void Info(object messa ...
随机推荐
- DDD - 概述 - 聚合 (三)
不要再看那些理论啦,说的云里雾里的,绕到你怀疑人生 一句话概括聚合创建:聚合的一致性决定了聚合边界的确定,决定了聚合对象的创建.所谓的一致性即事务的一致性,细化就是 立即性和原子性.
- Extjs6.2 项目学习系列(一)
1. Extjs开发准备 (1).下载ExtJS SDK GPL版 (本测试用版本 ext-6.2.0) : https://www.sencha.com/legal/gpl/ (2).下载Se ...
- 二维条码扫描模组在肯德基KFC的无纸化点餐解决方案
在如今提倡节约资源的环境下,肯德基在品牌发展中,逐渐实现无纸化点餐,不仅节约了纸质点餐单,而且还具有节约资源的示范作用.而其中二维码扫描模组是这套无纸化点餐方案的重点,在整套设备中,加入二维码扫描模组 ...
- python生成pdf报告、python实现html转换为pdf报告
1.先说下html转换为pdf:其实支持直接生成,有三个函数pdfkit.f 安装python包:pip Install pdfkit 系统安装wkhtmltopdf:参考 https://githu ...
- vue vue-resource的特点
1.vue-resource 实现 get, post, jsonp请求. 2.JSONP的是实现原理: 由于浏览器的安全性限制,不允许AJAX访问 协议不同.域名不同.端口不同的数据接口,浏览器认为 ...
- python3中列表、元组、字典的增删改查说明详解
python基础中的列表.元组.字典属于python中内置的序列数据结构.其中序列可以进行的操作包括索引.截取(切片).加.乘.成员检查等. 1.列表 列表(list)是最常用的python数据类型之 ...
- Android- APP 秒开
Android- APP 秒开 1. 启动APP 时白屏或者黑屏 现象:当启动APP 时,会有一个白屏或者黑屏一闪而过,然后才会显示出主界面. 这是因为,我们新打开一个应用,系统会为这个应用创建一个进 ...
- js中将字符串作为函数名来调用的方法
方法:eval() eg: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- Java String类的intern()方法
该方法的作用是把字符串加载到常量池中(jdk1.6常量池位于方法区,jdk1.7以后常量池位于堆) 在jdk1.6中,该方法把字符串的值复制到常量区,然后返回常量区里这个字符串的值: 在jdk1.7里 ...
- [C++一本通-图论算法] 例4-4 最小花费
题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. 输入输 ...