.net 通用数据库概念
一: asp.net通用数据库访问层源码之公用属性
公共属性
公共属性在CBaseConfig类别中,可以在程序中可以直接以CBaseConfig.appRoot取得)
1. appRoot
string, 应用程序物理路径(格式:c:\myDir\)
2. VirtualPath
string,应用程序虚拟路径(格式:/myWeb/)
3. EncryptKey
string,用于加密资料的密钥
4. IsCache
bool, true/false(default)从数据库中取的数据是否使用cache。
5. SqlCacheDependPath
string, 从数据库中取的数据cache依的目录(格式:c:\myDir\)
6. SmtpServer
string, 发送e-mail的SMTP服务器名称或IP地址
7. AllViewCount
int, 访问系统的总人次数。
8. DayViewCount
int, 访问系统的当日人次数。
9. AppVersion
String, WEB应用程序当前版本,格式:V版本号.年月日.时分,如V3.20050820.1403,表示版本号是3,最后更新日期是2005/8/20 14:03
10. EnablePageCache
bool, true(default)/false使用/不使用页面catch
11. PageCacheExpiresInSeconds
int, 页面catch过期时长(秒,default 3600)
12. EnableSsl
bool, true/false(default)是否使用SSL加密传送数据
二: asp.net通用数据库访问层源码之公共函数
公共函数
公共方法在CBaseConfig类别中,在程序中直接以CBaseConfig.ReadStting()调用。
1. OnApplicationStart
OnApplicationStart (stringprojectDLL)---初始化CbaseConfig类,必须在Global.asax.cs的Application_Start(Objectsender, EventArgs e)中执行
projectDLL=WEB程序主DLL文件(不含路径),该DLL在每次修改时都要变,一般是WEB项目名的DLL(用于版本计算)
2. OnApplicationEnd
OnApplicationEnd()—系统结束时,调用该函数,清除所有资源
3. AddViewCount
AddViewCount(string countKey)-- 累加计数值(访问系统的人数)。
返回累加后的总计数值(AllViewCount=总的计数值,DayViewCount=当日计数值)
countKey=在系统设定文件(AppSetting.xml)中的计数值的key。
4. RemoveAllCache
RemoveAllCache()--清除所有Cache(不清除系统使用的cache(以'PSYS_'开头))
5. ReadWebConfig
ReadWebConfig(string key, stringdefaultValue)—从WEB.Config文件中的<appSettings>中取参数值
key=web.config文件中<appkey=’’>中的key值,
defaultValue=默认值,如果没有设定则用该值。
6. ReadAppConfig
ReadAppConfig(string key, objectdefaultValue)—从系统配置文件(WebFrame.config)中读取参数值
key=<app key=’’>中的key值,defaultValue=默认值,如果没有设定则用该值
7. ReadSetting
ReadSetting(string key, objectdefaultValue)—从系统设定文件(AppSetting.xml)中读取参数值
key=<app key=’’>中的key值,defaultValue=默认值,如果没有设定则用该值
8. WriteSetting
WriteSetting(string key, stringsetting)—将key加入系统配置文件(AppSetting.xml)中(如果没有该key则生成)。(存入后,格式为:<appkey=’’ value=’’/>),成功返回true,失败返回false
key=<app key=’’>中的key值,defaultValue=默认值,如果没有设定则用该值
9. SaveSetting
SaveSetting()—WriteSetting()并没有保存加入的key,当所有key加完后,调用该函数来保存。成功返回true,失败返回false.
10. GetMessage
GetMessage(string MsgId, stringLanguageName)—取提示信息内容,该信息放在XML文件中(该文件由配置文件(WebFrame.config)中<appSettings>中key="Web.MsgPath"的值及语言决定,文文件放在Web.MsgPath下,文件名是语言名.xml如zh-CHS.xml)
MsgId=信息ID,请参考WebFrameMsg.xml
LanguageName=使用的言语特性(不设定或为空,则使用系统设定zh-CHT),zh-CHT版 ;zh-CHS 简体版;en 英文版 ja-JP 日文版
11. CreateJSMsg
CreateJSMsg(string[] MsgIds, string LanguageName, booladdScript)--生成JS显示的讯息(从讯息文件(*.xml)中取),这些讯息在JS函数中使用。
返回格式:<scriptlanguage='javascript'>S0001="xxx";S0002="xxx";...</script>
MsgIds=要生成的讯息ID,多个,这些讯息在讯息文件中(如zh-CHS.xml)。
LanguageName=使用的言语特性(不设定或为空,则使用系统设定zh-CHT),zh-CHT 繁体版 ;zh-CHS 简体版;en 英文版 ja-JP 日文版
addScript=true(预设):结果加上<scriptlanguage='javascript'></script>
12. ExecuteJS
ExecuteJS(string jsCodes)--执行一段JS代码。返回含<script>的jsCodes代码。
jsCodes=要执行的JS代码,必须是正确的、完整的代码,不含<scriptlanguage='javascript'>
13. ShowJsMsg
ShowJsMsg(string msg, string url, boolIsBack)—显示指定的讯息,并返回指定页面。
msg=要显示的讯息,如果为空则显示no message.
url=返回的页面url,=null或'':返回上一页面history.go(-1),只有一个数字:返回history.go(-url),以');'或')'结束:url=JS函数,其它:url=返回的页面url
IsBack= true:返回指定的url页面,false:不返回.
三: asp.net通用数据库访问层源码
1.在WEB系统的根目录下建一个存放系统配置文件的目录(如AppConfig),设定为只读,WEB无任何权限(在IIS管理员中设定)。同时建如下子目录:
(1) data—存放SQL配置文件(如TB_Users.xml)。
(2) msg—存放系统讯息文件(如zh-CHS.xml)
(3) log—存放系统错误日志文件,必须有写入权限。
(4) setting—存放系统设定文件(如AppSetting.xml) ,必须有写入权限。
2. 设定系统配置文件(WebFrame.config)及Web.config。
3. 在Global.asax.cs文件中:
(1) 加入:using WebFrame.Config;
(2) 在Application_Start()中:
CBaseConfig.OnApplicationStart(Context.Cache,
Context.Server.MapPath(Context.Request.Application Path),
Context.Request.ApplicationPath,”project.dll”);
(3) 在Session_Start()中:
CBaseConfig.AddViewCount("App.UserCount"); //计数器+1
(4) 在Application_Error()和Application_End()中:
CBaseConfig.OnApplicationEnd();
4.
架构
WebFrame架构目前有以下几个名字空间(以后也许还会扩充):
1.WebFrame.Base:包含CBaseDAO、CBaseDAOContext、CSecurity、CMail等类别
2.WebFrame.Config:包含CBaseConfig、CEncrypt、CWebFrameException等类别。
3. WebFrame.DB:包含所有对数据库操作的类别,请参考CDBConn.doc说明
4. WebFrame.UserServices:包含对用户数据、权限数据等操作的所有类别。
5. WebFrame.UserSimple:包含对用户数据、简单权限数据等操作的类别。
6. WebFrame.UI:包含前端页面使用的公用类别。
7. WebFrame.File:包含文件上载、下载操作的所有类别
8. WebFrame.OWC:包含用MS OWC11生成统计图的类别
其中WebFrame.Config、WebFrame.DB、WebFrame.Base是最基本、也是必须的。
使用WebFrame来开发WEB项目/项目时,至少分2层(2个项目/项目),业务逻辑层和接口层:
1.业务逻辑层:包含所有业务逻辑层的类别库(项目/项目),该类别库的所有类别都继承CBaseDAO或CBaseSimpleDAO、CRightDAO类别。类别库中至少包含WebFrame.Base、WebFrame.Config、WebFrame.DB三个名字空间,如果需要用到用户及权限数据,还必须包含WebFrame.UserSimple或 WebFrame.UserServices。
在一般应用中,业务逻辑层类别库中只需要用CEntityDAO类别来操作数据库就够了:
CEntityDAO dao=new CEntityDAO("my.xml",m_LanguageName);
DataSet ds= dao.SearchDataset("SqlName");
…………
如果CEntityDAO类别不能满足要求,或对效能要求比较高,可直接使用CDBConn类别来操作数据库:
CDBConn dbConn=CDBConn.Instance(m_ConnKey,m_LanguageName);
dbConn.Open();
dbConn.BeginTrans(); //开始事务
dbConn. ExecuteNonQuery(strSql);
…… //其它方法
dbConn.CommitTrans();
dbConn.Close();
…………
当使用CEntityDAO类别时,系统用到的所有SQL语句全部保存在XML格式的多个配置文件中(请用DBMap.exe来维护)。一个业务逻辑类用一个配置文件中(将该类用到的所有SQL全部放到一个文件中),这样有多少个业务类,就应该有多少个配置文件。SQL名称最好与类别中的方法名称相同,这样维护起来比较方便。
类别说明及详细使用方法请参考<CDBConn.doc>、<CEntityDAO.doc>、<CBaseDAO.doc>。
2.界面层:在前端接口项目/项目(WEB应用程序)中,至少包含WebFrame.Base、WebFrame.Config,其它可根据需要加入。
在接口层的ASPX或HTM页面中,存取参数值(数据表字段值)的form元素的名称必须和参数名(数据表id)相同,这样就可以用如下方法取得参数值,然后传到业务逻辑类别中:
(1) DataSet paramDataset=new DataSet;
paramDataset.ReadXml(Request.InputStream);
(2) NameValueCollection paramValues=newNameValueCollection();
paramValues.Add(Request.Form);
paramValues.Add(Request.QueryString)
CSimpleUser myCls=new CSimpleUser(); //业务逻辑层类别
myCls.SetLanguage(LanguageName); //设定使用的言语
myCls.InsertRole(paramValues); //新增角色资料
或
myCls.InsertRole(paramDataset); //新增角色资料
在WebFrame.UI中提供了一些前端接口用的公用类别,可根据情况使用或继承这些类别(也可不用),其中PageBaseDAO类别已经包含以上的paramDataset和paramValues参数,直接使用即可
四: asp.net通用数据库访问层源码之权限
权限
WebFrame包含完整的用户数据维护和权限维护功能,包括用户、群组、角色、级别,从简单到复杂的系统都能满足。注意:TB_Function表中的SqlName字段,用于设定该功能使用的SqlName(在sql配置文件中),格式是: sql配置文件名/SqlName,多个用“,(逗号)”隔开(如:TB_User.xml/Insert,TB_Role.xml/Insert),如果该功能只用配置文件,则只输入配置文件名(如:TB_User.xml,TB_Role.xml)。如果该功能没有对应的Sql名或配置文件名,则可指定一个唯一的名称(如1001,Users),或功能编号(FuncNo),在程序中用myRight(SqlName)来判断是否有权限,其中的SqlName就是TB_Function表中的SqlName字段指定的名称或编号。
根据需要,又分为简单和完全权限2种:
1.
简单权限:所有功能都放在WebFrame.UserSimple名字空间中,有3个类别(CUser,CRole,CFunction)(配置文件是TB_SimpleUser.xml,TB_SimpleUser.xml,TB_SimpleUser.xml)。没有群组和角色级别功能,一个用户只有一个角色(或当作群组),权限只有允许(查询、新增、修改、删除)/不允许。用于对权限要求比较简单的系统。
用到的资料表有:TB_Function、TB_Role、TB_RoleRight、TB_Users等4个。
用到的存储过程有:
(1) UP_TB_RoleRight_GetRightById(共享)
(2) UP_Simple_GetMenuByFuncNo(简单权限专用)
(3) UP_Simple_GetUserRight(简单权限专用)
(4) UP_Simple_GetRoleRight(简单权限专用)
(5) UP_Simple_SetRoleRight(简单权限专用)
(6) UP_Simple_Login(简单权限专用)
(7) UP_TB_RoleRight_GetRoleRight(共享)(不用)
(8) UP_TB_Function_DelAllFuncByNo(共享)(不用)
用到的函数:UF_TB_Users_GetUserCountByGroup(公用)(可选,用于取得该群组的用户数)
2.
完全权限:具有完整的、复杂的权限控制功能,包括群组、角色级别。权限不仅有允许(1查询、2新增、3修改、4删除)/不允许,还有群组范围、角色(职务)级别控制。用于对权限要求高的系统,如OA系统、工作流等。包含在WebFrame.UserServices中的所有类别中。
使用的配置文件有:TB_code.xml、TB_function.xml、TB_group.xml、TB_role.xml、TB_user.xml。
用到的数据表(所有以TB_开头的数据表)。除包括简单权限用到的数据表外,还用到:TB_CdType、TB_Codes、TB_Group、TB_GroupInRole、TB_RoleLevel。
用到的存储过程(所有以UP_TB_开头的存储过程,但不含“简单权限专用”,共26个)。
用到的函数(所有以UF_TB_开头的函数:UF_TB_Role_GetGroupRole、UF_TB_Role_GetUserRole,UF_TB_Users_GetUserCountByGroup,共3个)。
五: asp.net通用数据库访问层源码之多语言
多语言版
WebFrame 支持多国语言显示,但必须遵守以下原则:
1.
所有需要显示多国语言的信息,都保存在XML文件中(格式参考zh-CHT.xml,在程序中用CbaseConfig.GetMessage(MsgId)取得要显示的信息),一个语言版本保存一个XML文件,文件名用语言特性名(如繁体中文zh-CHT.xml,其它请参考CultureInfo类别说明),并统一放在一个目录下,在配置文件(WebFrame.config)中指定该目录。(参阅WebFrame.config)。
2.
如果一个语言用一个数据库(数据库结构必须完全一样),则数据库的ConnKey后必须加上“.言语名称”。
如“DB.ConnString.zh-CHS”或“DB.ConnString_DbType.zh-CHS”,但在指定ConnKey时,不用“.言语名称”,如只用DB.ConnString。
3.
web.config中设定使用utf-8编码,如下:
<globalization requestEncoding="utf-8"responseEncoding="utf-8" />
所有文件最好都保存为“utf-8(有签章)”的格式。
4.
在用QueryString传送中文时,必须先进行编码:
(1)
在CS中用HttpUtility.UrlEncode(string),或用Server.UrlEncode(string)来编码,(不要用HttpUtility.HtmlEncode(string)或Server.HtmlEncode(string))。
(2)
在JS中用escape(string)来编码。
(3)
在JS中接收用(string)译码,在CS中接收不用译码,直接使用,如:
string s=Request[“s”];
或string s=Request.Params[“s”] ;
5.
采用下列2种方法来实现多言语版本:
(1)
每个言语有不同的界面程序(ASPX),并放到不同的目录中,如简体版放到 chs目录,繁体版放到cht目录,每个目录下都有一个web.config文件,用于设定该目录使用的言语(只有该行设定):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="Web.Language" value="zh-CHT"/>
</appSettings>
</configuration>
在程序中用GetMessage(MsgId)取得系统显示讯息。
此方法用于不同的言语,界面程序不一样的系统。
(2)
当不同言语使用同一界面程序(ASPX)时,界面程序类(ASPX.CS)继承MultiLangPage.cs类(在WebFrame.UI中),用LanguageName=’言语名称’来指定使用的言语(只需用一次),然后可用LanguageName取得该用户当前使用的言语,在程序中用MultiLangPage的GetMessage(MsgId)和CreateJSMsg(MsgIds)来取得系统显示讯息(页面中,需要多言语的文字都放在讯息文件中)。在使用业务逻辑类时,必须用SetLanguage(LanguageName)来指定使用的言语。在使用CDBConn、CEntityDAO及CBaseDAO时,也要显示指定言语名称LanguageName。
6.
WebFrame只解决程序中显示信息的多国语言的问题,而要完全解决多国语言的问题,必须在设计数据库时就要考虑(可采用一种言语用一个数据库来保存,数据库结构要一样)。
global.asax.cs protected void Application_Start(Object sender,EventArgs e)
...{
CBaseConfig.OnApplicationStart("project.dll");
}
protected void Application_Error(Object sender, EventArgse)
...{
CBaseConfig.OnApplicationEnd();
}
protected void Application_End(Object sender, EventArgs e)
...{
CBaseConfig.OnApplicationEnd();
}
protected void Session_Start(Object sender, EventArgs e)
...{
CBaseConfig.AddViewCount("UserCount");//计数值
…
}
web.config
Web.config之appSettings配置说明
<system.web>
……
<!--设定上传档案最大K数(<20M)-->
<httpRuntime maxRequestLength="20000"executionTimeout="180" />
</system.web>
<appSettings>
<!—系统配置文件名(如果是物理路径,则必须有:\的符号(如c:aa.xml),否则以网站根目录为准,但不包含根路径(如myDir\aa.xml),预设是网站根目录下的AppConfig\WebFrame.config)-->
<add key="WebFrame.Config" value=""/>
<!--使用的言语特性(不设定或为空,则使用系统设定zh-CHT),zh-CHT 繁体版;zh-CHS 简体版 ;en 英文版 ja-JP 日文版-->
<add key="Web.Language" value="zh-CHT"/>
</appSettings>
六: asp.net通用数据库访问层源码之CDBConn类
数据库访问接口类,该类可访问不同数据库系统,使用时只调其Instance(ConnString)即可。该类在WebFrame.DB名字空间里
使用方法
属性说明
1 Connection
IdbConnection,数据库连接对象。
函数说明
1 Instance()
根据WebFrame.config中设定的数据库连接字符串,生成CDBConn实例。返回CDBConn对象。
(1) Instance()---用CBaseConfig.ConnString的数据库连接参数和预设语言名打开数据库
(CBaseConfig.ConnString在配置文件(WebFrame.xml)中设置)
(2) Instance(string ConnKey,stringLanguageName)---用ConnKey指定的数据库连接参数和LanguageName打开数据库
ConnKey=数据库连接字符串的key(在WebFrameconfig中指定的),该key不包含语言名称。如:DB.ConnString.zh-CHS表示 ConnKey=DB.ConnString,LanguageName=zh-CHS
如果WebFrameconfig中的key值不包含语言名称,则ConnKey=WebFrameconfig中的key值。
LanguageName =使用的语言名称,主要用于多国语言(当一个语言用一个数据库时),语言名称用.net格式(如:zh-CHT繁体版 ;zh-CHS 简体版 ;en英文版)。WebFrame.config中数据库连接字符串的key值包含该语言名称,如DB.ConnString.zh-CHS的语言名称是zh-CHS。
2 Open()
Open()---打开数据库,没有返回值。
3 Close()
Close()---关闭数据库,没有返回值。
4 IsOpen()
IsOpen()—判断数据库是否已经打开,返回值:true=是
5 BeginTrans()
BeginTrans()---开始事务处理,没有返回值。
6 CommitTrans()
CommitTrans()---提交事务处理,没有返回值。
7 RollbackTrans()
RollbackTrans()---撒消事务处理,没有返回值。
8 ExecuteNonQuery()
执行SQL语句,对于Insert,Update,Delete返回影响的数据笔数,对于其它SQL,返回-1或0,错误返回-2
? cmd=要执行的IdbCommand变量,包含参数值(请用CDbCmd类的DbCmd取得)
? strSql=要执行的完整SQL语句(如:select * from tab where id=1)。
? sql=要执行的CSqlStruct对象 (请用CEntityBuilder类的GetSqlStruct取得)
?dtVal=DataTable类型,保存cmd的参数值(一笔数据对应一个参数值,可执行多个参数值,DataTable列名与参数名相同)。
?paramValue=NameValueCollection类型,保存cmd的参数值。name=参数名(与cmd中的参数名相同),value=参数值
?xmlVal=参数保存在XML格式的字符中,格式:<r><paramNamevalue='11'/>...</r>。当只有一个参数时,xmlVal=参数值
? paramVal=object数组,保存参数值,与参数名的个数和顺序相同(cmd中的参数个数和顺序相同)。
9 ExecuteScalar()
执行SQL语句,返回第一行第一列的值。
? 参数说明请参考ExecuteNonQuery()。
10 ExecuteProcedure()
执行存储过程,结果保存在NameValueCollection类型中,name=返回参数名,value=返回参数值,失败返回null。
? procName=要执行的存储过程名,该存储过程没有参数,如果成功则返回true。
? 其它参数说明请参考ExecuteNonQuery()。
11 ExecuteProcScalar()
执行存储过程,返回第一个返回值或返回参数的值,失败返回null。
? procName=要执行的存储过程名,该存储过程没有参数,返回存储过程返回值。
? 其它参数说明请参考ExecuteNonQuery()。
12 ExecuteDataset ()
执行语句,成功返回DataSet,失败返回null。
? TableName=DataSet中的资料表名,预设是Table1。
? 其它参数说明请参考ExecuteNonQuery().
13 ExecuteReader ()
执行语句,成功返回IdataReader,失败返回null。
? 参数说明请参考ExecuteNonQuery()。
14 GetMaxValue()
取数据表指定字段的最大值,一般是取主键的最大值,成功返回取到的最大值,失败返回0
TableName=数据表名,取哪个数据表的字段。
ColName=字段名,取哪个字段的最大值,该字段必须是数字型.
CSqlDBCon类
访问 Sql server数据库类,继承CDBConn,并实现CDBConn中的方法。Client不直接使用该类。
COleDBConn类
访问 Sql server以外的其它数据库系统(同CSqlDBConn)
CEntityBuilder类
用于由SQL配置文件中产生SQL语句。该类在WebFrame.DB名字空间里
使用方法
CEntityBuilder builder=newCEntityBuilder(m_EntityFileName);
CSqlStruct sql=builder.GetSqlStruct(SqlName);
CDBConn conn=CDBConn.Instance(ConnKey,LanguageName);
conn.Open();
conn.ExecuteNonQuery(sql);
conn.Close();
函数说明
1 CEntityBuilder()
CEntityBuilder(string EntityFileName)-- 构造函数。
? EntityFileName=配置文件名,XML格式(不含路径)
2 SetEntityFile()
SetEntityFile(string EntityFileName)—设定配置文件名
? EntityFileName=配置文件名,XML格式(不含路径)
3 GetSqlStruct()
GetSqlStruct(stringSqlName)--取CSqlStruct对象,该对象的各属性的值由配置文件EntityFileName中的<sqlname=”SqlName”>决定,即用配置文件EntityFileName中的SQL名称指定的值来生成SQL语句及参数。成功返回生成的CSqlStruct对象,失败返回null.
? SqlName=要生成的SQL配置文件EntityFileName(XML格式)中的sql名称(<sql name=”SqlName”)。
七 :asp.net通用数据库访问层源码之CEntityDAO类
CEntityDAO类
用于对数据库操作。对于单表的新增、修改、删除、查询等操作,可以直接使用该类别。该类在WebFrame.DB名字空间里
使用方法
CEntityDAO dao=newCEntityDAO(m_EntityFile,m_ConnKey,m_LanguageName,m_UseClass);
DataSet ds=dao.ExecuteDataset(sqlName);
在ASPX页面中,如果要用form的组件值作为参数值(如<input type=”text”name=”UserName”>),该组件名(UserName)必须与参数名(即sal配置文件中的参数名,或id名,这里是UserName)相同,这时,可用以下方法取得参数值:
(1) DataSet paramDataset=new DataSet;
paramDataset.ReadXml(Request.InputStream);
(2) NameValueCollection paramValues=newNameValueCollection();
paramValues.Add(Request.Form);
paramValues.Add(Request.QueryString)
属性说明
1. LastMsg
string, 最后的错误信息。当操作发生错误时,该值包含错误原因,请将其显示出来。
2. ConnKey
string, 指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS)。
3. LanguageName
string, 指定使用的语言名称。
4. UseClass
string, 指定调用该类别的类名或页面名,一般在使用该类别的函数用GetType().ToString()。
5. EntityFileName
string, 指定Sql配置文件名,不含路径。
函数说明
参数说明
以下函数的参数都是相同,其说明如下:
? SqlName=要执行的SQL名称。配置文件(在Data目录下的*.xml)中的<sqlnqme=”SqlName”>
?xmlVal=参数保存在XML格式的字符中,格式:<r><paramNamevalue='11'/>...</r>。当只有一个参数时,xmlVal=参数值
?paramValue=NameValueCollection类型,保存cmd的参数值。name=参数名(与cmd中的参数名相同),value=参数值。(对于SqlType=”Insert,Update”且replace=”1”时,可用多个值来执行多个SQL,如果某个参数的值小于最大个数,就用最后一个值,其它情况只用第一个值执行一个SQL)
? oParamVal =object数组,保存参数值,与参数名的个数和顺序相同(与cmd中的参数个数和顺序相同)。
?dtVal=DataTable类型,保存sql的参数值(一笔资料对应一个参数值)。DataTable列名必须与参数名(字段ID)相同。(对于SqlType=”Insert,Update”且replace=”1”时,可用多个值来执行多个SQL,其它情况只用第一个值执行一个SQL)
1. CEntityDAO()
CEntityDAO的构造函数。
(1)CEntityDAO()—必须用属性来指定EntityFileName,如果不指定ConnKey、LanguageName、UseClass,则使用默认值。
(2) CEntityDAO(stringentityFileName)—-指定sql配置文件名。可用属性指定ConnKey、LanguageName、UseClass,如不指定则使用默认值。
(3) CEntityDAO(string entityFileName,stringconnKey)—-指定sql配置文件及连接字符串的key,可用属性指定LanguageName、UseClass,如不指定则使用默认值。
(4) CEntityDAO(string entityFileName,string connKey,stringlanguageName)--指定sql配置文件、连接字符串的key、语言名称,可用属性指定UseClass,如不指定则使用默认值。
(5) CEntityDAO(string entityFileName,string connKey,stringlanguageName,string useClass)--指定sql配置文件、连接字符串的key、语言名称、使用的类别名。
? entityFileName=sql配置文件名,不含路径,必须要指定。
?connKey=数据库连接字符串的key值,预设使用DB.ConnString。在WebFrame.config中指定,不包含语言名称,如:<addkey="DB.ConnString.zh-CHS" value="…">中的DB.ConnString
? languageName=使用的语言名称,预设是zh-CHT。用.net格式,如zh-CHT 繁体版 ;zh-CHS 简体版;en 英文版
? useClass=使用访类别的类名。在调用该类的函数中用GetType().ToString().
2. Insert()
用SQL语句新增数据,成功返回最后新增的数据ID值,没有新增返回0,错误返回-1。
如果<sql name=’…’replace=’1’…>中的replace=”1”或”true”,则多个值来执行(拼成多个insert语句,用于同时新增字段少且数据少的数据)(如果某个值的个数小于最大个数,则用最后一个值),否则只用第一个值(用Command执行,用于新增字段多且数据多的数据)。成功返回第一个ID值(其它ID值可按第一个ID+1计算)。
?bAuto=指定是否要函数来计算主键的最大值。对于主键字段是数字(int),且不是自动+1,该值应该为true。预设=true。
? bTrans=指定是否需要事务,true:要事务。预设=false。
3. Update()
用SQL语句修改数据,成功返回修改的数据笔数,没有修改返回0,错误返回-1
(参数与Insert()类似,请参考Insert()说明)(预设SqlName=Update)。
如果<sql name=’…’replace=’1’…>中的replace=”1”或”true”,则多个值来执行(拼成多个update语句,用于同时修改字段少且数据少的数据)(如果某个值的个数小于最大个数,则用最后一个值),否则只用第一个值(用Command执行,用于修改字段多且数据多的数据)。成功返回第一个ID值。
? bTrans=指定是否需要事务,true:要事务。预设=false。
4. ExecuteNonQuery()
执行SQL语句,成功返回执行的数据笔(int),没有结果返回0,错误返回-1。
5. ExecuteScalar()
执行SQL语句,成功第一行第一列的值(object),失败返回null。
6. ExecuteProcedure()
执行存储过程,返回存储过程的返回值或输出参数(NameValueCollection类型,name=参数名,value=结果值),失败返回null。
7. ExecuteProcScalar()
执行存储过程,返回存储过程的第一个返回值或输出参数(object),失败返回null。
8. ExecuteDataset()
查找指定条件的数据(SqlType='Text'),成功返回取得的资料(DataSet),失败返回null
9. ExecuteReader()
查找指定条件的数据(SqlType='Text'),成功返回取得的资料(IDataReader),失败返回null
? conn=CDBConn类型,数据库连接对象。先用CDBConn dbConn=CDBConn.Instance();dbConn.Open();打开数据库。
10. SearchDataset()
取指定条件的数据(SqlType=”Search”),可以只取指定页的资料(配合存储过程UPP_ExecuteForPage使用),成功返回取得的数据(DataSet),失败返回null
(1)CurrPage=int类型,指定当前页号,即取该页的数据。当用UPP_ExecuteForPage来取数据时,用CurrPage来指定取哪页的数据,当CurrPage=0时,取总资料笔数。当不使用UPP_ExecuteForPage时,CurrPage的值无效(不用该参数)
(2)PageSize=int类型,指定每页多少笔数据。当用UPP_ExecuteForPage来取数据时,用PageSize来指定取每页多少笔数据,当PageSize=0时,取全部(不分页)。当不使用UPP_ExecuteForPage时,PageSize的值无效(不用该参数)
(3)RowCount=int类型,本次查询的总记录数(先用ExecuteProcScalar()取总记录数(CurrPage=0),然后传给该参数),如果RowCount=-1则返回2个Tables(0:取得的资料集,1:资料总数(只有一个值))。当不使用UPP_ExecuteForPage时,RowCount的值无效(不用该参数)。
11. SearchReader()
取指定条件的数据(SqlType=”Search”),可以只取指定页的资料(配合存储过程UPP_ExecuteForPage使用),成功返回取得的数据(IDataReader),失败返回null
(参数与ExecuteProcedure()类似,请参考ExecuteProcedure()说明。)
(1) conn=CDBConn类型,数据库连接对象。先用CDBConn dbConn=CDBConn.Instance();dbConn.Open();打开数据库。
九十: asp.net通用数据库访问层源码之CRightDAO类
CRightDAO类
数据库操作基本类,在WebFrame.Base名字空间里,共有三个:CBaseDAO、CSimpleDAO、CRightDAO。所有对数据库的操作的业务逻辑层类别都继承该类。CSimpleDAO包含由ASPX页面传来的context对象,用于判断当前用户的权限,而CBaseDAO则不包括context对象,要判断权限,必须传入用户数据。一般情况下:
? 不需判断权限时,继承CBaseDAO
? 只需简单权限时,继承CSimpleDAO,该类继承CBaseDAO。
? 需要完全权限时,继承CRightDAO,该类继承CSimpleDAO。
使用方法
1.该类在WebFrame.Base名字空间里,所以必须引入WebFrame.Base才能使用。在需要对数据库操作的业务逻辑类别中继承。
2.该类预设用系统内定的数据库(由配置文件(WebFrame.config)的key=”DB.ConnString”指定),如果要使用其它数据库,则必须指定m_ConnKey的值(配置文件(WebFrame.config)的key=”DB.ConnString”等)。建议生成一个继承该类的新类别,在构造函数中指定m_ConnKey值,在使用相同该数据库时,再继承这个新类别。
3. 如果要判断权限,则用myRight()取得权限值,然后进行判断,再执行存取数据函数。
在ASPX页面中,如果要用form的组件的值作为参数值(如<input type=”text”name=”UserName”>),该组件名(UserName)必须与参数名(即sql配置文件中的参数名,或id名,这里是UserName)相同,这时,可用以下方法取得参数值:
(1) DataSet paramDataset=new DataSet;
paramDataset.ReadXml(Request.InputStream);
(2) NameValueCollection paramValues=newNameValueCollection();
paramValues.Add(Request.Form);
paramValues.Add(Request.QueryString)
属性说明
1. myUserId
string, myUserId=m_UserId,使用者ID。
2. myUserLevel
string, myUserLevel=m_UserLevel, 使用者(登录者)的用户(职务)级别。
3. myParentId
string, myParentId=m_ParentId,使用者所在群组的上级群组ID
4. myGroupId
string, myGroupId=m_GroupId,使用者据群组ID
5. myRoleId
string, myRoleId=m_RoleId使用者所拥有的角色ID,可有多个(用,分开)
6. myRoleLevel
string, myRoleLevel=m_RoleLevel,使用者最大角色级别。
7. LastMsg
string, LastMsg=最后信息。
8. ConnKey
string, 指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS)。
9. UseClass
string, 指定调用该类别的类名或页面名,一般在使用该类别的函数用GetType().ToString()。
函数说明
1. CRightDAO ()
构造函数,一般使用CRightDAO ()。
? UserId=string, 使用者ID,必须已经解密(将Session(“UserId”)解密)。
? UserLevel= string,使用者(职务)级别。
? GroupId= string, 群组ID,必须已经解密(将Session(“GroupId”)解密)。
? ParentId= string,上级群组ID,必须已经解密(将Session(“parentId”)解密)。
2. SetEntityFile()
SetEntityFile(string fileName,stringconnKey)--设置sql配置文件,该文件是XML格式,保存SQL语句。
? fileName= string,sql配置文件名(在Data目录下的*.xml),不包括任何路径,如my.xml
? connKey=string,指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS).
3. SetLanguage()
SetLanguage(string languageName ,stringuseClass)--设定使用的语言名称。
? languageName=使用的语言名称。
? useClass=调用该类别的类名或页面名,一般在使用该类别的函数用GetType().ToString()
4. SetContext()
SetContext()—设定页面的Context值。
5. SetUser()
SetUser(string UserId,string UserLevel)--设置使用者ID,即将使用者ID解密。
?UserId=加密的使用者ID。预设=null,表示使用Session["UserId"],解密后保存在m_UserId中,当没有UserId(UserId=null,0)时,m_UserId=”-9”(可由属性UserId取得m_UserId的值)
?UserLevel=解密后的用户级别,如果是空,则解密登录()的用户级别(Session["UserLevel"])
6. SetGroup()
SetGroup(string GroupId,stringParentId)--设置使用者所在群组ID及上级群组ID,即将群组ID及上级群组ID解密。
?GroupId=加密的群组ID,预设=null,即使用Session["GroupId"],解密后保存在m_GroupId中,当没有GroupId(GroupId=null,0)时,m_GroupId=”-8”(可由属性GroupId取得m_GroupId的值)
?ParentId=加密的上级群组Id,预设=null,即使用Session["ParentId"],解密后保存在m_ParentId中,当没有ParentId(ParentId=null,0)时,m_ParentId=”-7”(可由属性ParentId取得m_ParentId的值)
7. SetRole()
SetRole(string RoleId,stringRoleLevel)--设置使用者所拥有的角色ID及角色级别,即将角色ID及角色级别解密。
?RoleId=加密的角色ID,预设=null,即使用Session[RoleId"],解密后保存在m_RoleId中,当没有RoleId(RoleId=null,0)时,m_RoleId=”-6”(可由属性RoleId取得m_RoleId的值)
?RoleLevel=角色级别,预设=null,即使用Session["RoleLevel"],解密后保存在m_RoleLevel中,当没有RoleLevel(RoleLevel=null,0)时,m_RoleLevel=”-5”(可由属性RoleLevel取得m_RoleLevel的值)。
8. myRight()
myRight(string UserId,stringSqlName)--取得使用者的操作权限。即判断该用户对该SqlName的操作权限,返回值:小于0:无权限,1-查找,2-新增,3-修改,4-删除,9-全部。
m_FullRight保存全部权限,格式:199111(6位),每个权限一位(0无,1有),顺序是(从左到右)1-允许,2-群组,3-角色级别,4-汇出,5-打印,6-远程。(其中,2-群组的值又有1-仅自己,2-仅群组内,3-组内及下层组,4-同级组及其下层,5-指定组,9-全部,3-角色级别的值又有1-低级别,2-同级别,9-全部)
m_right=m_FullRight中的一位,即保存m_FullRight中的一个权限。
? SqlName=SQ名称,即配置文件中的 <sqlname=”SqlName”>,系统是用SQL名来判断是否有执行该SQL的权限
? UserId=使用者ID,必须是已解密。即判断该使用者是否有执行该SQL名的权限。
? type=取权限的类别(完全权限用),0-全部,1-允许(1-查找,2-新增,3-修改,4-删除,9-全部),2-群组(1-仅自己,2-仅群组内,3-组内及下层组,4-全部),3-级别(1-低级别,2-同级别,9-全部),4-汇出,5-打印,6-远程。预设是0,即当用myRight()时则取全部权限。
9. IsGroupRight()
IsGroupRight(string SqlName,string GroupId_UserId,bool isUser)--判断登录用户对SqlName操作的群组权限(登录用户群组与给定的群组的关系(同组、下层组,同组组)。有权限,返回>0:(1:仅自己,2:组内,3:组内及下层组,4:同级组及其下层组,9:全部),-10:未登录,-9:无权限,0:有权限但不在组内
? SqlName=SQL名称,即配置文件中的 <sqlname=”SqlName”>,系统是用SQL名来判断是否有执行该SQL的权限。
? GroupId_UserId=要判断的群组ID,或使用者ID(判断该使用者所在的群组ID)。
? GroupId=要判断的群组ID,使用者群组与该群组的关系(同组、下层组,同组组)
?isUser=指定GroupId_UserId的值,当isUser=true时,GroupId_UserId=UserId(用该使用者ID来取得其群组ID),否则GroupId_UserId=GroupId。
10. Insert()
新增数据,成功返回新增的数据ID,没有新增返回0,错误返回-1。
? SqlName=执行新增的SQL名称,即配置文件中的 <sqlname=”SqlName”>,预设=Insert。
?paramValues=NameValueCollection类型,保存新增的参数值,name=参数名(必须与SQL的参数名相同),value=参数值(可多个值,即允许新增多笔数据)
?dtVal=DataTable类型,保存SQL的参数值(可多个值,一笔数据一个值,即允许新增多笔数据)。当没有colHash时,DataRow列名必须与参数名相同。
?bAuto=指定是否要函数来计算主键的最大值。对于主键字段是数字(int),且不是自动+1,该值应该为true,否则为false。预设=true。
? bTrans=指定是否需要事务,true:要事务。预设=false。
? right=指定是否要判断权限,right=true是(预设),right=false不用判断权限。
11. Update()
修改数据,成功返回修改数据笔数,没有修改返回0,错误返回-1。
(参数与Insert()类似,请参考Insert()说明)(SqlName预设=Update)
12. Delete()
删除数据,成功返回删除的数据笔数,没有删除返回0,错误返回-1。
? SqlName=执行删除的SQL名称,即配置文件中的 <sqlname=”SqlName”>,预设=Delete。
? Ids=要删除的数据ID,多个用,分开。
? bTrans=指定是否需要事务,true:要事务。预设=false。
? right=指定是否要判断权限,right=true是(预设),right=false不用判断权限。
13. IsExists()
IsExists(string SqlName,string colValue,string msgID)--判断数据是否存在(如账号、Email等不能重复的字段),讯息在LastMsg中
? SqlName=要判断的SQL名称,即配置文件中的 <sqlname=”SqlName”>,该sql格式必须是:select id from tab wherecolName=colValue。
? colValue=要判断的字段值。
? msgID=显示讯的ID(空:不显示讯息)
14. GetJSValues()
GetJSValues(string jsParamName,string SqlName,object[]paramVal)--取得指定sqlname的JS变量值,用于联动select。执行SqlName的返回字段是:上级ID,本级ID,名称
返回JS字符串,格式:
var jsParamName=new Array();jsParamName[0]=newArray("0","1","名称1");.....
? jsParamName= JS变量名,该变量在JS函数中调用。
? SqlName=要判断的SQL名称,即配置文件中的 <sqlname=”SqlName”>,该sql格式必须是:select id from tab wherecolName=colValue。
? paramVal= sql的参数值,个数和顺序必须与参数名相同。
15. isLogin()
判断是否已经登录系统,是返回true,否返回false
16. IsEdit()
IsEdit(string SqlName,SByte type)—判断是否有编辑权限,是返回true。
? SqlName=SQL名称,即配置文件中的 <sqlname=”SqlName”>,系统是用SQL名来判断是否有执行该SQL的权限。
? Type=要判断哪个权限:1-查找,2-新增,3-修改,4-删除,9-全部
17. AddMsg()
AddMsg(string msgID,bool isClear)-- 将指定讯息ID的内容加入到LastMsg中
? msgID =要加入的讯息ID,在讯息文件中
? isClear= true(预设):清除LastMsg的所有讯息
18. DispMsg()
DispMsg(string msg,string url,bool IsBack)—用JS显示讯息,并返回指定页面。
? msg =要显示的信息,如果是null或空,则显示LastMsg
? url= IsBack=false时不用。IsBack=true时,返回的页面地址,,或要执行的JS函数(以")"结束)。url=null或'':返回上一页面history.go(-1),_只有2个数字以内:返回history.go(-url),以');'或')'结束则url=JS函数。
? IsBack=true:返回,false:不返回(留在当前页)
CSecurity类
判断使用者的操作权限类别,在WebFrame.Base名字空间里。是静态类,可以直接使用。
使用方法
该类在WebFrame.Base名字空间里,所以必须引入WebFrame.Base才能使用。可以直接使用,如CSecurity.GetRight();
属性说明
无
函数说明
1. GetSimpleRight()
GetSimpleRight(string UserId,string EntityFile,stringSqlName,string ConnKey,stringLanguageName)--取简单操作权限,即只取是否允许的权限,返回取得的权限(1有,0无)。该函数执行UP_TB_RoleRight_GetUserRight存储过程。返回:0-无权限,1-查找,2-新增,3-修改,4-删除,9-全部
? UserId=使用者ID(必须已解密),取该使用者ID的权限。
? EntityFile=sql配置文件名,不含路径
? SqlName=配置文件中的SQL名称(<sqlname=”SqlName”>),即取UserId是否有对SqlName操作的权限。
? ConnKey=指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS)。
? LanguageName=指定使用的语言名称。
2. GetRight()
取全部权限,返回取到的权限(无权限返回0),格式:199111(6位),每个权限一位(0无,1有),顺序是(从左到右)1-允许,2-群组,3-角色级别,4-汇出,5-打印,6-远程。(其中,2-群组的值又有1-仅自己,2-仅群组内,3-组内及下层组,4-同级组及其下层,5-指定组,9-全部,3-角色级别的值又有1-低级别,2-同级别,9-全部)。该函数执行UP_TB_RoleRight_GetUserRight存储过程。
GetRight(string RoleIds,string EntityFile,string SqlName,stringConnKey,string LanguageName)=取指定RoleIds的SqlName的全部权限
GetRight(int right,int type) =由全部权限值取中期一个权限的值,即分解全部权限的值。
(参数与GetSimpleRight()类似,请参考GetSimpleRight()说明)
? RoleIds=角色ID,多个用,分开
? right=权限值,由GetRight(UserId,SqlName)取得的权限值。
? type=要取的权限类别,1-允许,2-群组,3-角色级别,4-汇出,5-打印,6-远程。
3. IsInGroup()
IsInGroup(string ParentId,string User_GroupId,bool bUserId,stringConnKey,stringLanguageName)--判断用户ID或群组ID是否是另一个群组内及下层组,返回值:1=User_GroupId与ParentId同组,2=User_GroupId是ParentId的直接下层,3=User_GroupId是ParentId的下层之下层,0-User_GroupId与ParentId无关系。该函数使用UP_TB_Users_IsInGroup存储过程。
? ParentId=上级群组ID,或群组ID。判断使用者的群组与ParentId的关系。
? User_GroupId=要判断的用户ID或群组ID,与ParentId中的关系。
?bUserId=指定User_GroupId的值,当bUserId=true时,User_GroupId=UserId(用该使用者ID来取得其群组ID),否则User_GroupId=GroupId
? ConnKey=指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS)
? LanguageName=指定使用的语言名称
4. IsRoleLevel()
IsUserLevel(string UserId1,string UserId2,string ConnKey,stringLanguageName)--比较操作者的级别与指定用户角色级别,返回值:-1:RoleLevel低于指定用户级别,0:相同,1:RoleLevel高于指定用户级别。该函数使用UP_TB_Role_IsRoleLevel存储过程。
? RoleLevel=角色级别,判断用户的角色级别与RoleLevel的比较。
?Role_User_GroupId=使用者的角色ID、或用户ID、或群组ID,用这些ID来取角色级别,然后与RoleLevel比较。
?nRoleId=指定Role_User_GroupId的类别,nRoleId=0时:Role_User_GroupId=RoleLevel角色级别,nRoleId=1时:Role_User_GroupId=RoleId角色ID,nRoleId=2时:Role_User_GroupId=UserId用户ID,nRoleId=3时:Role_User_GroupId=GroupId群组ID
? ConnKey=指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS)
? LanguageName=指定使用的语言名称
公共属性
公共属性在CBaseConfig类别中,可以在程序中可以直接以CBaseConfig.appRoot取得)
1. appRoot
string, 应用程序物理路径(格式:c:\myDir\)
2. VirtualPath
string,应用程序虚拟路径(格式:/myWeb/)
3. EncryptKey
string,用于加密资料的密钥
4. IsCache
bool, true/false(default)从数据库中取的数据是否使用cache。
5. SqlCacheDependPath
string, 从数据库中取的数据cache依的目录(格式:c:\myDir\)
6. SmtpServer
string, 发送e-mail的SMTP服务器名称或IP地址
7. AllViewCount
int, 访问系统的总人次数。
8. DayViewCount
int, 访问系统的当日人次数。
9. AppVersion
String, WEB应用程序当前版本,格式:V版本号.年月日.时分,如V3.20050820.1403,表示版本号是3,最后更新日期是2005/8/20 14:03
10. EnablePageCache
bool, true(default)/false使用/不使用页面catch
11. PageCacheExpiresInSecond
int, 页面catch过期时长(秒,default 3600)
12. EnableSsl
bool, true/false(default)是否使用SSL加密传送数据
二: asp.net通用数据库访问层源码之公共函数
公共函数
公共方法在CBaseConfig类别中,在程序中直接以CBaseConfig.ReadStting()调用。
1. OnApplicationStart
OnApplicationStart (stringprojectDLL)---初始化CbaseConfig类,必须在Global.asax.cs的Application_Start(Objectsender, EventArgs e)中执行
projectDLL=WEB程序主DLL文件(不含路径),该DLL在每次修改时都要变,一般是WEB项目名的DLL(用于版本计算)
2. OnApplicationEnd
OnApplicationEnd()—系统结束时,调用该函数,清除所有资源
3. AddViewCount
AddViewCount(string countKey)-- 累加计数值(访问系统的人数)。
返回累加后的总计数值(AllViewCount=总的计数值,DayViewCount=当日计数值)
countKey=在系统设定文件(AppSetting.xml)中的计数值的key。
4. RemoveAllCache
RemoveAllCache()--清除所有Cache(不清除系统使用的cache(以'PSYS_'开头))
5. ReadWebConfig
ReadWebConfig(string key, stringdefaultValue)—从WEB.Config文件中的<appSettings>中取参数值
key=web.config文件中<appkey=’’>中的key值,
defaultValue=默认值,如果没有设定则用该值。
6. ReadAppConfig
ReadAppConfig(string key, objectdefaultValue)—从系统配置文件(WebFrame.config)中读取参数值
key=<app key=’’>中的key值,defaultValue=默认值,如果没有设定则用该值
7. ReadSetting
ReadSetting(string key, objectdefaultValue)—从系统设定文件(AppSetting.xml)中读取参数值
key=<app key=’’>中的key值,defaultValue=默认值,如果没有设定则用该值
8. WriteSetting
WriteSetting(string key, stringsetting)—将key加入系统配置文件(AppSetting.xml)中(如果没有该key则生成)。(存入后,格式为:<appkey=’’ value=’’/>),成功返回true,失败返回false
key=<app key=’’>中的key值,defaultValue=默认值,如果没有设定则用该值
9. SaveSetting
SaveSetting()—WriteSetting()并没有保存加入的key,当所有key加完后,调用该函数来保存。成功返回true,失败返回false.
10. GetMessage
GetMessage(string MsgId, stringLanguageName)—取提示信息内容,该信息放在XML文件中(该文件由配置文件(WebFrame.config)中<appSettings>中key="Web.MsgPath"的值及语言决定,文文件放在Web.MsgPath下,文件名是语言名.xml如zh-CHS.xml)
MsgId=信息ID,请参考WebFrameMsg.xml
LanguageName=使用的言语特性(不设定或为空,则使用系统设定zh-CHT),zh-CHT版 ;zh-CHS 简体版;en 英文版 ja-JP 日文版
11. CreateJSMsg
CreateJSMsg(string[] MsgIds, string LanguageName, booladdScript)--生成JS显示的讯息(从讯息文件(*.xml)中取),这些讯息在JS函数中使用。
返回格式:<scriptlanguage='javascript'>S0001="xxx";S0002="xxx";...</script>
MsgIds=要生成的讯息ID,多个,这些讯息在讯息文件中(如zh-CHS.xml)。
LanguageName=使用的言语特性(不设定或为空,则使用系统设定zh-CHT),zh-CHT 繁体版 ;zh-CHS 简体版;en 英文版 ja-JP 日文版
addScript=true(预设):结果加上<scriptlanguage='javascript'></script>
12. ExecuteJS
ExecuteJS(string jsCodes)--执行一段JS代码。返回含<script>的jsCodes代码。
jsCodes=要执行的JS代码,必须是正确的、完整的代码,不含<scriptlanguage='javascript'>
13. ShowJsMsg
ShowJsMsg(string msg, string url, boolIsBack)—显示指定的讯息,并返回指定页面。
msg=要显示的讯息,如果为空则显示no message.
url=返回的页面url,=null或'':返回上一页面history.go(-1),只有一个数字:返回history.go(-url),以');'或')'结束:url=JS函数,其它:url=返回的页面url
IsBack= true:返回指定的url页面,false:不返回.
三: asp.net通用数据库访问层源码
1.在WEB系统的根目录下建一个存放系统配置文件的目录(如AppConfig),设定为只读,WEB无任何权限(在IIS管理员中设定)。同时建如下子目录:
(1) data—存放SQL配置文件(如TB_Users.xml)。
(2) msg—存放系统讯息文件(如zh-CHS.xml)
(3) log—存放系统错误日志文件,必须有写入权限。
(4) setting—存放系统设定文件(如AppSetting.xml) ,必须有写入权限。
2. 设定系统配置文件(WebFrame.config)及Web.config。
3. 在Global.asax.cs文件中:
(1) 加入:using WebFrame.Config;
(2) 在Application_Start()中:
CBaseConfig.OnApplicationStart(Context.Cache,
Context.Server.MapPath(Context.Request.Application Path),
Context.Request.ApplicationPath,”project.dll”);
(3) 在Session_Start()中:
CBaseConfig.AddViewCount("App.UserCount"); //计数器+1
(4) 在Application_Error()和Application_End()中:
CBaseConfig.OnApplicationEnd();
4.
架构
WebFrame架构目前有以下几个名字空间(以后也许还会扩充):
1.WebFrame.Base:包含CBaseDAO、CBaseDAOContext、CSecurity、CMail等类别
2.WebFrame.Config:包含CBaseConfig、CEncrypt、CWebFrameException等类别。
3. WebFrame.DB:包含所有对数据库操作的类别,请参考CDBConn.doc说明
4. WebFrame.UserServices:包含对用户数据、权限数据等操作的所有类别。
5. WebFrame.UserSimple:包含对用户数据、简单权限数据等操作的类别。
6. WebFrame.UI:包含前端页面使用的公用类别。
7. WebFrame.File:包含文件上载、下载操作的所有类别
8. WebFrame.OWC:包含用MS OWC11生成统计图的类别
其中WebFrame.Config、WebFrame.DB、WebFrame.Base是最基本、也是必须的。
使用WebFrame来开发WEB项目/项目时,至少分2层(2个项目/项目),业务逻辑层和接口层:
1.业务逻辑层:包含所有业务逻辑层的类别库(项目/项目),该类别库的所有类别都继承CBaseDAO或CBaseSimpleDAO、CRightDAO类别。类别库中至少包含WebFrame.Base、WebFrame.Config、WebFrame.DB三个名字空间,如果需要用到用户及权限数据,还必须包含WebFrame.UserSimple或 WebFrame.UserServices。
在一般应用中,业务逻辑层类别库中只需要用CEntityDAO类别来操作数据库就够了:
CEntityDAO dao=new CEntityDAO("my.xml",m_LanguageName);
DataSet ds= dao.SearchDataset("SqlName");
…………
如果CEntityDAO类别不能满足要求,或对效能要求比较高,可直接使用CDBConn类别来操作数据库:
CDBConn dbConn=CDBConn.Instance(m_ConnKey,m_LanguageName);
dbConn.Open();
dbConn.BeginTrans(); //开始事务
dbConn. ExecuteNonQuery(strSql);
…… //其它方法
dbConn.CommitTrans();
dbConn.Close();
…………
当使用CEntityDAO类别时,系统用到的所有SQL语句全部保存在XML格式的多个配置文件中(请用DBMap.exe来维护)。一个业务逻辑类用一个配置文件中(将该类用到的所有SQL全部放到一个文件中),这样有多少个业务类,就应该有多少个配置文件。SQL名称最好与类别中的方法名称相同,这样维护起来比较方便。
类别说明及详细使用方法请参考<CDBConn.doc>、<CEntityDAO.doc>、<CBaseDAO.doc>。
2.界面层:在前端接口项目/项目(WEB应用程序)中,至少包含WebFrame.Base、WebFrame.Config,其它可根据需要加入。
在接口层的ASPX或HTM页面中,存取参数值(数据表字段值)的form元素的名称必须和参数名(数据表id)相同,这样就可以用如下方法取得参数值,然后传到业务逻辑类别中:
(1) DataSet paramDataset=new DataSet;
paramDataset.ReadXml(Request.InputStream);
(2) NameValueCollection paramValues=newNameValueCollection();
paramValues.Add(Request.Form);
paramValues.Add(Request.QueryString)
CSimpleUser myCls=new CSimpleUser(); //业务逻辑层类别
myCls.SetLanguage(LanguageName); //设定使用的言语
myCls.InsertRole(paramValues); //新增角色资料
或
myCls.InsertRole(paramDataset); //新增角色资料
在WebFrame.UI中提供了一些前端接口用的公用类别,可根据情况使用或继承这些类别(也可不用),其中PageBaseDAO类别已经包含以上的paramDataset和paramValues参数,直接使用即可
四: asp.net通用数据库访问层源码之权限
权限
WebFrame包含完整的用户数据维护和权限维护功能,包括用户、群组、角色、级别,从简单到复杂的系统都能满足。注意:TB_Function表中的SqlName字段,用于设定该功能使用的SqlName(在sql配置文件中),格式是: sql配置文件名/SqlName,多个用“,(逗号)”隔开(如:TB_User.xml/Insert,TB_Role.xml/Insert),如果该功能只用配置文件,则只输入配置文件名(如:TB_User.xml,TB_Role.xml)。如果该功能没有对应的Sql名或配置文件名,则可指定一个唯一的名称(如1001,Users),或功能编号(FuncNo),在程序中用myRight(SqlName)来判断是否有权限,其中的SqlName就是TB_Function表中的SqlName字段指定的名称或编号。
根据需要,又分为简单和完全权限2种:
1.
简单权限:所有功能都放在WebFrame.UserSimple名字空间中,有3个类别(CUser,CRole,CFunction)(配置文件是TB_SimpleUser.xml,TB_SimpleUser.xml,TB_SimpleUser.xml)。没有群组和角色级别功能,一个用户只有一个角色(或当作群组),权限只有允许(查询、新增、修改、删除)/不允许。用于对权限要求比较简单的系统。
用到的资料表有:TB_Function、TB_Role、TB_RoleRight、TB_Users等4个。
用到的存储过程有:
(1) UP_TB_RoleRight_GetRightById(共享)
(2) UP_Simple_GetMenuByFuncNo(简单权限专用)
(3) UP_Simple_GetUserRight(简单权限专用)
(4) UP_Simple_GetRoleRight(简单权限专用)
(5) UP_Simple_SetRoleRight(简单权限专用)
(6) UP_Simple_Login(简单权限专用)
(7) UP_TB_RoleRight_GetRoleRight(共享)(不用)
(8) UP_TB_Function_DelAllFuncByNo(共享)(不用)
用到的函数:UF_TB_Users_GetUserCountByGroup(公用)(可选,用于取得该群组的用户数)
2.
完全权限:具有完整的、复杂的权限控制功能,包括群组、角色级别。权限不仅有允许(1查询、2新增、3修改、4删除)/不允许,还有群组范围、角色(职务)级别控制。用于对权限要求高的系统,如OA系统、工作流等。包含在WebFrame.UserServices中的所有类别中。
使用的配置文件有:TB_code.xml、TB_function.xml、TB_group.xml、TB_role.xml、TB_user.xml。
用到的数据表(所有以TB_开头的数据表)。除包括简单权限用到的数据表外,还用到:TB_CdType、TB_Codes、TB_Group、TB_GroupInRole、TB_RoleLevel。
用到的存储过程(所有以UP_TB_开头的存储过程,但不含“简单权限专用”,共26个)。
用到的函数(所有以UF_TB_开头的函数:UF_TB_Role_GetGroupRole、UF_TB_Role_GetUserRole,UF_TB_Users_GetUserCountByGroup,共3个)。
五: asp.net通用数据库访问层源码之多语言
多语言版
WebFrame 支持多国语言显示,但必须遵守以下原则:
1.
所有需要显示多国语言的信息,都保存在XML文件中(格式参考zh-CHT.xml,在程序中用CbaseConfig.GetMessage(MsgId)取得要显示的信息),一个语言版本保存一个XML文件,文件名用语言特性名(如繁体中文zh-CHT.xml,其它请参考CultureInfo类别说明),并统一放在一个目录下,在配置文件(WebFrame.config)中指定该目录。(参阅WebFrame.config)。
2.
如果一个语言用一个数据库(数据库结构必须完全一样),则数据库的ConnKey后必须加上“.言语名称”。
如“DB.ConnString.zh-CHS”或“DB.ConnString_DbType.zh-CHS”,但在指定ConnKey时,不用“.言语名称”,如只用DB.ConnString。
3.
web.config中设定使用utf-8编码,如下:
<globalization requestEncoding="utf-8"responseEncoding="utf-8" />
所有文件最好都保存为“utf-8(有签章)”的格式。
4.
在用QueryString传送中文时,必须先进行编码:
(1)
在CS中用HttpUtility.UrlEncode(string),或用Server.UrlEncode(string)来编码,(不要用HttpUtility.HtmlEncode(string)或Server.HtmlEncode(string))。
(2)
在JS中用escape(string)来编码。
(3)
在JS中接收用(string)译码,在CS中接收不用译码,直接使用,如:
string s=Request[“s”];
或string s=Request.Params[“s”] ;
5.
采用下列2种方法来实现多言语版本:
(1)
每个言语有不同的界面程序(ASPX),并放到不同的目录中,如简体版放到 chs目录,繁体版放到cht目录,每个目录下都有一个web.config文件,用于设定该目录使用的言语(只有该行设定):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="Web.Language" value="zh-CHT"/>
</appSettings>
</configuration>
在程序中用GetMessage(MsgId)取得系统显示讯息。
此方法用于不同的言语,界面程序不一样的系统。
(2)
当不同言语使用同一界面程序(ASPX)时,界面程序类(ASPX.CS)继承MultiLangPage.cs类(在WebFrame.UI中),用LanguageName=’言语名称’来指定使用的言语(只需用一次),然后可用LanguageName取得该用户当前使用的言语,在程序中用MultiLangPage的GetMessage(MsgId)和CreateJSMsg(MsgIds)来取得系统显示讯息(页面中,需要多言语的文字都放在讯息文件中)。在使用业务逻辑类时,必须用SetLanguage(LanguageName)来指定使用的言语。在使用CDBConn、CEntityDAO及CBaseDAO时,也要显示指定言语名称LanguageName。
6.
WebFrame只解决程序中显示信息的多国语言的问题,而要完全解决多国语言的问题,必须在设计数据库时就要考虑(可采用一种言语用一个数据库来保存,数据库结构要一样)。
global.asax.cs protected void Application_Start(Object sender,EventArgs e)
...{
CBaseConfig.OnApplicationStart("project.dll");
}
protected void Application_Error(Object sender, EventArgse)
...{
CBaseConfig.OnApplicationEnd();
}
protected void Application_End(Object sender, EventArgs e)
...{
CBaseConfig.OnApplicationEnd();
}
protected void Session_Start(Object sender, EventArgs e)
...{
CBaseConfig.AddViewCount("UserCount");//计数值
…
}
web.config
Web.config之appSettings配置说明
<system.web>
……
<!--设定上传档案最大K数(<20M)-->
<httpRuntime maxRequestLength="20000"executionTimeout="180" />
</system.web>
<appSettings>
<!—系统配置文件名(如果是物理路径,则必须有:\的符号(如c:aa.xml),否则以网站根目录为准,但不包含根路径(如myDir\aa.xml),预设是网站根目录下的AppConfig\WebFrame.config)-->
<add key="WebFrame.Config" value=""/>
<!--使用的言语特性(不设定或为空,则使用系统设定zh-CHT),zh-CHT 繁体版;zh-CHS 简体版 ;en 英文版 ja-JP 日文版-->
<add key="Web.Language" value="zh-CHT"/>
</appSettings>
六: asp.net通用数据库访问层源码之CDBConn类
数据库访问接口类,该类可访问不同数据库系统,使用时只调其Instance(ConnString)即可。该类在WebFrame.DB名字空间里
使用方法
属性说明
1 Connection
IdbConnection,数据库连接对象。
函数说明
1 Instance()
根据WebFrame.config中设定的数据库连接字符串,生成CDBConn实例。返回CDBConn对象。
(1) Instance()---用CBaseConfig.ConnString的数据库连接参数和预设语言名打开数据库
(CBaseConfig.ConnString在配置文件(WebFrame.xml)中设置)
(2) Instance(string ConnKey,stringLanguageName)---用ConnKey指定的数据库连接参数和LanguageName打开数据库
ConnKey=数据库连接字符串的key(在WebFrameconfig中指定的),该key不包含语言名称。如:DB.ConnString.zh-CHS表示 ConnKey=DB.ConnString,LanguageName=zh-CHS
如果WebFrameconfig中的key值不包含语言名称,则ConnKey=WebFrameconfig中的key值。
LanguageName =使用的语言名称,主要用于多国语言(当一个语言用一个数据库时),语言名称用.net格式(如:zh-CHT繁体版 ;zh-CHS 简体版 ;en英文版)。WebFrame.config中数据库连接字符串的key值包含该语言名称,如DB.ConnString.zh-CHS的语言名称是zh-CHS。
2 Open()
Open()---打开数据库,没有返回值。
3 Close()
Close()---关闭数据库,没有返回值。
4 IsOpen()
IsOpen()—判断数据库是否已经打开,返回值:true=是
5 BeginTrans()
BeginTrans()---开始事务处理,没有返回值。
6 CommitTrans()
CommitTrans()---提交事务处理,没有返回值。
7 RollbackTrans()
RollbackTrans()---撒消事务处理,没有返回值。
8 ExecuteNonQuery()
执行SQL语句,对于Insert,Update,Delete返回影响的数据笔数,对于其它SQL,返回-1或0,错误返回-2
? cmd=要执行的IdbCommand变量,包含参数值(请用CDbCmd类的DbCmd取得)
? strSql=要执行的完整SQL语句(如:select * from tab where id=1)。
? sql=要执行的CSqlStruct对象 (请用CEntityBuilder类的GetSqlStruct取得)
?dtVal=DataTable类型,保存cmd的参数值(一笔数据对应一个参数值,可执行多个参数值,DataTable列名与参数名相同)。
?paramValue=NameValueCollection类型,保存cmd的参数值。name=参数名(与cmd中的参数名相同),value=参数值
?xmlVal=参数保存在XML格式的字符中,格式:<r><paramNamevalue='11'/>...</r>。当只有一个参数时,xmlVal=参数值
? paramVal=object数组,保存参数值,与参数名的个数和顺序相同(cmd中的参数个数和顺序相同)。
9 ExecuteScalar()
执行SQL语句,返回第一行第一列的值。
? 参数说明请参考ExecuteNonQuery()。
10 ExecuteProcedure()
执行存储过程,结果保存在NameValueCollection类型中,name=返回参数名,value=返回参数值,失败返回null。
? procName=要执行的存储过程名,该存储过程没有参数,如果成功则返回true。
? 其它参数说明请参考ExecuteNonQuery()。
11 ExecuteProcScalar()
执行存储过程,返回第一个返回值或返回参数的值,失败返回null。
? procName=要执行的存储过程名,该存储过程没有参数,返回存储过程返回值。
? 其它参数说明请参考ExecuteNonQuery()。
12 ExecuteDataset ()
执行语句,成功返回DataSet,失败返回null。
? TableName=DataSet中的资料表名,预设是Table1。
? 其它参数说明请参考ExecuteNonQuery().
13 ExecuteReader ()
执行语句,成功返回IdataReader,失败返回null。
? 参数说明请参考ExecuteNonQuery()。
14 GetMaxValue()
取数据表指定字段的最大值,一般是取主键的最大值,成功返回取到的最大值,失败返回0
TableName=数据表名,取哪个数据表的字段。
ColName=字段名,取哪个字段的最大值,该字段必须是数字型.
CSqlDBCon类
访问 Sql server数据库类,继承CDBConn,并实现CDBConn中的方法。Client不直接使用该类。
COleDBConn类
访问 Sql server以外的其它数据库系统(同CSqlDBConn)
CEntityBuilder类
用于由SQL配置文件中产生SQL语句。该类在WebFrame.DB名字空间里
使用方法
CEntityBuilder builder=newCEntityBuilder(m_EntityFileName);
CSqlStruct sql=builder.GetSqlStruct(SqlName);
CDBConn conn=CDBConn.Instance(ConnKey,LanguageName);
conn.Open();
conn.ExecuteNonQuery(sql);
conn.Close();
函数说明
1 CEntityBuilder()
CEntityBuilder(string EntityFileName)-- 构造函数。
? EntityFileName=配置文件名,XML格式(不含路径)
2 SetEntityFile()
SetEntityFile(string EntityFileName)—设定配置文件名
? EntityFileName=配置文件名,XML格式(不含路径)
3 GetSqlStruct()
GetSqlStruct(stringSqlName)--取CSqlStruct对象,该对象的各属性的值由配置文件EntityFileName中的<sqlname=”SqlName”>决定,即用配置文件EntityFileName中的SQL名称指定的值来生成SQL语句及参数。成功返回生成的CSqlStruct对象,失败返回null.
? SqlName=要生成的SQL配置文件EntityFileName(XML格式)中的sql名称(<sql name=”SqlName”)。
七 :asp.net通用数据库访问层源码之CEntityDAO类
CEntityDAO类
用于对数据库操作。对于单表的新增、修改、删除、查询等操作,可以直接使用该类别。该类在WebFrame.DB名字空间里
使用方法
CEntityDAO dao=newCEntityDAO(m_EntityFile,m_ConnKey,m_LanguageName,m_UseClass);
DataSet ds=dao.ExecuteDataset(sqlName);
在ASPX页面中,如果要用form的组件值作为参数值(如<input type=”text”name=”UserName”>),该组件名(UserName)必须与参数名(即sal配置文件中的参数名,或id名,这里是UserName)相同,这时,可用以下方法取得参数值:
(1) DataSet paramDataset=new DataSet;
paramDataset.ReadXml(Request.InputStream);
(2) NameValueCollection paramValues=newNameValueCollection();
paramValues.Add(Request.Form);
paramValues.Add(Request.QueryString)
属性说明
1. LastMsg
string, 最后的错误信息。当操作发生错误时,该值包含错误原因,请将其显示出来。
2. ConnKey
string, 指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS)。
3. LanguageName
string, 指定使用的语言名称。
4. UseClass
string, 指定调用该类别的类名或页面名,一般在使用该类别的函数用GetType().ToString()。
5. EntityFileName
string, 指定Sql配置文件名,不含路径。
函数说明
参数说明
以下函数的参数都是相同,其说明如下:
? SqlName=要执行的SQL名称。配置文件(在Data目录下的*.xml)中的<sqlnqme=”SqlName”>
?xmlVal=参数保存在XML格式的字符中,格式:<r><paramNamevalue='11'/>...</r>。当只有一个参数时,xmlVal=参数值
?paramValue=NameValueCollection类型,保存cmd的参数值。name=参数名(与cmd中的参数名相同),value=参数值。(对于SqlType=”Insert,Update”且replace=”1”时,可用多个值来执行多个SQL,如果某个参数的值小于最大个数,就用最后一个值,其它情况只用第一个值执行一个SQL)
? oParamVal =object数组,保存参数值,与参数名的个数和顺序相同(与cmd中的参数个数和顺序相同)。
?dtVal=DataTable类型,保存sql的参数值(一笔资料对应一个参数值)。DataTable列名必须与参数名(字段ID)相同。(对于SqlType=”Insert,Update”且replace=”1”时,可用多个值来执行多个SQL,其它情况只用第一个值执行一个SQL)
1. CEntityDAO()
CEntityDAO的构造函数。
(1)CEntityDAO()—必须用属性来指定EntityFileName,如果不指定ConnKey、LanguageName、UseClass,则使用默认值。
(2) CEntityDAO(stringentityFileName)—-指定sql配置文件名。可用属性指定ConnKey、LanguageName、UseClass,如不指定则使用默认值。
(3) CEntityDAO(string entityFileName,stringconnKey)—-指定sql配置文件及连接字符串的key,可用属性指定LanguageName、UseClass,如不指定则使用默认值。
(4) CEntityDAO(string entityFileName,string connKey,stringlanguageName)--指定sql配置文件、连接字符串的key、语言名称,可用属性指定UseClass,如不指定则使用默认值。
(5) CEntityDAO(string entityFileName,string connKey,stringlanguageName,string useClass)--指定sql配置文件、连接字符串的key、语言名称、使用的类别名。
? entityFileName=sql配置文件名,不含路径,必须要指定。
?connKey=数据库连接字符串的key值,预设使用DB.ConnString。在WebFrame.config中指定,不包含语言名称,如:<addkey="DB.ConnString.zh-CHS" value="…">中的DB.ConnString
? languageName=使用的语言名称,预设是zh-CHT。用.net格式,如zh-CHT 繁体版 ;zh-CHS 简体版;en 英文版
? useClass=使用访类别的类名。在调用该类的函数中用GetType().ToString().
2. Insert()
用SQL语句新增数据,成功返回最后新增的数据ID值,没有新增返回0,错误返回-1。
如果<sql name=’…’replace=’1’…>中的replace=”1”或”true”,则多个值来执行(拼成多个insert语句,用于同时新增字段少且数据少的数据)(如果某个值的个数小于最大个数,则用最后一个值),否则只用第一个值(用Command执行,用于新增字段多且数据多的数据)。成功返回第一个ID值(其它ID值可按第一个ID+1计算)。
?bAuto=指定是否要函数来计算主键的最大值。对于主键字段是数字(int),且不是自动+1,该值应该为true。预设=true。
? bTrans=指定是否需要事务,true:要事务。预设=false。
3. Update()
用SQL语句修改数据,成功返回修改的数据笔数,没有修改返回0,错误返回-1
(参数与Insert()类似,请参考Insert()说明)(预设SqlName=Update)。
如果<sql name=’…’replace=’1’…>中的replace=”1”或”true”,则多个值来执行(拼成多个update语句,用于同时修改字段少且数据少的数据)(如果某个值的个数小于最大个数,则用最后一个值),否则只用第一个值(用Command执行,用于修改字段多且数据多的数据)。成功返回第一个ID值。
? bTrans=指定是否需要事务,true:要事务。预设=false。
4. ExecuteNonQuery()
执行SQL语句,成功返回执行的数据笔(int),没有结果返回0,错误返回-1。
5. ExecuteScalar()
执行SQL语句,成功第一行第一列的值(object),失败返回null。
6. ExecuteProcedure()
执行存储过程,返回存储过程的返回值或输出参数(NameValueCollection类型,name=参数名,value=结果值),失败返回null。
7. ExecuteProcScalar()
执行存储过程,返回存储过程的第一个返回值或输出参数(object),失败返回null。
8. ExecuteDataset()
查找指定条件的数据(SqlType='Text'),成功返回取得的资料(DataSet),失败返回null
9. ExecuteReader()
查找指定条件的数据(SqlType='Text'),成功返回取得的资料(IDataReader),失败返回null
? conn=CDBConn类型,数据库连接对象。先用CDBConn dbConn=CDBConn.Instance();dbConn.Open();打开数据库。
10. SearchDataset()
取指定条件的数据(SqlType=”Search”),可以只取指定页的资料(配合存储过程UPP_ExecuteForPage使用),成功返回取得的数据(DataSet),失败返回null
(1)CurrPage=int类型,指定当前页号,即取该页的数据。当用UPP_ExecuteForPage来取数据时,用CurrPage来指定取哪页的数据,当CurrPage=0时,取总资料笔数。当不使用UPP_ExecuteForPage时,CurrPage的值无效(不用该参数)
(2)PageSize=int类型,指定每页多少笔数据。当用UPP_ExecuteForPage来取数据时,用PageSize来指定取每页多少笔数据,当PageSize=0时,取全部(不分页)。当不使用UPP_ExecuteForPage时,PageSize的值无效(不用该参数)
(3)RowCount=int类型,本次查询的总记录数(先用ExecuteProcScalar()取总记录数(CurrPage=0),然后传给该参数),如果RowCount=-1则返回2个Tables(0:取得的资料集,1:资料总数(只有一个值))。当不使用UPP_ExecuteForPage时,RowCount的值无效(不用该参数)。
11. SearchReader()
取指定条件的数据(SqlType=”Search”),可以只取指定页的资料(配合存储过程UPP_ExecuteForPage使用),成功返回取得的数据(IDataReader),失败返回null
(参数与ExecuteProcedure()类似,请参考ExecuteProcedure()说明。)
(1) conn=CDBConn类型,数据库连接对象。先用CDBConn dbConn=CDBConn.Instance();dbConn.Open();打开数据库。
九十: asp.net通用数据库访问层源码之CRightDAO类
CRightDAO类
数据库操作基本类,在WebFrame.Base名字空间里,共有三个:CBaseDAO、CSimpleDAO、CRightDAO。所有对数据库的操作的业务逻辑层类别都继承该类。CSimpleDAO包含由ASPX页面传来的context对象,用于判断当前用户的权限,而CBaseDAO则不包括context对象,要判断权限,必须传入用户数据。一般情况下:
? 不需判断权限时,继承CBaseDAO
? 只需简单权限时,继承CSimpleDAO,该类继承CBaseDAO。
? 需要完全权限时,继承CRightDAO,该类继承CSimpleDAO。
使用方法
1.该类在WebFrame.Base名字空间里,所以必须引入WebFrame.Base才能使用。在需要对数据库操作的业务逻辑类别中继承。
2.该类预设用系统内定的数据库(由配置文件(WebFrame.config)的key=”DB.ConnString”指定),如果要使用其它数据库,则必须指定m_ConnKey的值(配置文件(WebFrame.config)的key=”DB.ConnString”等)。建议生成一个继承该类的新类别,在构造函数中指定m_ConnKey值,在使用相同该数据库时,再继承这个新类别。
3. 如果要判断权限,则用myRight()取得权限值,然后进行判断,再执行存取数据函数。
在ASPX页面中,如果要用form的组件的值作为参数值(如<input type=”text”name=”UserName”>),该组件名(UserName)必须与参数名(即sql配置文件中的参数名,或id名,这里是UserName)相同,这时,可用以下方法取得参数值:
(1) DataSet paramDataset=new DataSet;
paramDataset.ReadXml(Request.InputStream);
(2) NameValueCollection paramValues=newNameValueCollection();
paramValues.Add(Request.Form);
paramValues.Add(Request.QueryString)
属性说明
1. myUserId
string, myUserId=m_UserId,使用者ID。
2. myUserLevel
string, myUserLevel=m_UserLevel, 使用者(登录者)的用户(职务)级别。
3. myParentId
string, myParentId=m_ParentId,使用者所在群组的上级群组ID
4. myGroupId
string, myGroupId=m_GroupId,使用者据群组ID
5. myRoleId
string, myRoleId=m_RoleId使用者所拥有的角色ID,可有多个(用,分开)
6. myRoleLevel
string, myRoleLevel=m_RoleLevel,使用者最大角色级别。
7. LastMsg
string, LastMsg=最后信息。
8. ConnKey
string, 指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS)。
9. UseClass
string, 指定调用该类别的类名或页面名,一般在使用该类别的函数用GetType().ToString()。
函数说明
1. CRightDAO ()
构造函数,一般使用CRightDAO ()。
? UserId=string, 使用者ID,必须已经解密(将Session(“UserId”)解密)。
? UserLevel= string,使用者(职务)级别。
? GroupId= string, 群组ID,必须已经解密(将Session(“GroupId”)解密)。
? ParentId= string,上级群组ID,必须已经解密(将Session(“parentId”)解密)。
2. SetEntityFile()
SetEntityFile(string fileName,stringconnKey)--设置sql配置文件,该文件是XML格式,保存SQL语句。
? fileName= string,sql配置文件名(在Data目录下的*.xml),不包括任何路径,如my.xml
? connKey=string,指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS).
3. SetLanguage()
SetLanguage(string languageName ,stringuseClass)--设定使用的语言名称。
? languageName=使用的语言名称。
? useClass=调用该类别的类名或页面名,一般在使用该类别的函数用GetType().ToString()
4. SetContext()
SetContext()—设定页面的Context值。
5. SetUser()
SetUser(string UserId,string UserLevel)--设置使用者ID,即将使用者ID解密。
?UserId=加密的使用者ID。预设=null,表示使用Session["UserId"],解密后保存在m_UserId中,当没有UserId(UserId=null,0)时,m_UserId=”-9”(可由属性UserId取得m_UserId的值)
?UserLevel=解密后的用户级别,如果是空,则解密登录()的用户级别(Session["UserLevel"])
6. SetGroup()
SetGroup(string GroupId,stringParentId)--设置使用者所在群组ID及上级群组ID,即将群组ID及上级群组ID解密。
?GroupId=加密的群组ID,预设=null,即使用Session["GroupId"],解密后保存在m_GroupId中,当没有GroupId(GroupId=null,0)时,m_GroupId=”-8”(可由属性GroupId取得m_GroupId的值)
?ParentId=加密的上级群组Id,预设=null,即使用Session["ParentId"],解密后保存在m_ParentId中,当没有ParentId(ParentId=null,0)时,m_ParentId=”-7”(可由属性ParentId取得m_ParentId的值)
7. SetRole()
SetRole(string RoleId,stringRoleLevel)--设置使用者所拥有的角色ID及角色级别,即将角色ID及角色级别解密。
?RoleId=加密的角色ID,预设=null,即使用Session[RoleId"],解密后保存在m_RoleId中,当没有RoleId(RoleId=null,0)时,m_RoleId=”-6”(可由属性RoleId取得m_RoleId的值)
?RoleLevel=角色级别,预设=null,即使用Session["RoleLevel"],解密后保存在m_RoleLevel中,当没有RoleLevel(RoleLevel=null,0)时,m_RoleLevel=”-5”(可由属性RoleLevel取得m_RoleLevel的值)。
8. myRight()
myRight(string UserId,stringSqlName)--取得使用者的操作权限。即判断该用户对该SqlName的操作权限,返回值:小于0:无权限,1-查找,2-新增,3-修改,4-删除,9-全部。
m_FullRight保存全部权限,格式:199111(6位),每个权限一位(0无,1有),顺序是(从左到右)1-允许,2-群组,3-角色级别,4-汇出,5-打印,6-远程。(其中,2-群组的值又有1-仅自己,2-仅群组内,3-组内及下层组,4-同级组及其下层,5-指定组,9-全部,3-角色级别的值又有1-低级别,2-同级别,9-全部)
m_right=m_FullRight中的一位,即保存m_FullRight中的一个权限。
? SqlName=SQ名称,即配置文件中的 <sqlname=”SqlName”>,系统是用SQL名来判断是否有执行该SQL的权限
? UserId=使用者ID,必须是已解密。即判断该使用者是否有执行该SQL名的权限。
? type=取权限的类别(完全权限用),0-全部,1-允许(1-查找,2-新增,3-修改,4-删除,9-全部),2-群组(1-仅自己,2-仅群组内,3-组内及下层组,4-全部),3-级别(1-低级别,2-同级别,9-全部),4-汇出,5-打印,6-远程。预设是0,即当用myRight()时则取全部权限。
9. IsGroupRight()
IsGroupRight(string SqlName,string GroupId_UserId,bool isUser)--判断登录用户对SqlName操作的群组权限(登录用户群组与给定的群组的关系(同组、下层组,同组组)。有权限,返回>0:(1:仅自己,2:组内,3:组内及下层组,4:同级组及其下层组,9:全部),-10:未登录,-9:无权限,0:有权限但不在组内
? SqlName=SQL名称,即配置文件中的 <sqlname=”SqlName”>,系统是用SQL名来判断是否有执行该SQL的权限。
? GroupId_UserId=要判断的群组ID,或使用者ID(判断该使用者所在的群组ID)。
? GroupId=要判断的群组ID,使用者群组与该群组的关系(同组、下层组,同组组)
?isUser=指定GroupId_UserId的值,当isUser=true时,GroupId_UserId=UserId(用该使用者ID来取得其群组ID),否则GroupId_UserId=GroupId。
10. Insert()
新增数据,成功返回新增的数据ID,没有新增返回0,错误返回-1。
? SqlName=执行新增的SQL名称,即配置文件中的 <sqlname=”SqlName”>,预设=Insert。
?paramValues=NameValueCollection类型,保存新增的参数值,name=参数名(必须与SQL的参数名相同),value=参数值(可多个值,即允许新增多笔数据)
?dtVal=DataTable类型,保存SQL的参数值(可多个值,一笔数据一个值,即允许新增多笔数据)。当没有colHash时,DataRow列名必须与参数名相同。
?bAuto=指定是否要函数来计算主键的最大值。对于主键字段是数字(int),且不是自动+1,该值应该为true,否则为false。预设=true。
? bTrans=指定是否需要事务,true:要事务。预设=false。
? right=指定是否要判断权限,right=true是(预设),right=false不用判断权限。
11. Update()
修改数据,成功返回修改数据笔数,没有修改返回0,错误返回-1。
(参数与Insert()类似,请参考Insert()说明)(SqlName预设=Update)
12. Delete()
删除数据,成功返回删除的数据笔数,没有删除返回0,错误返回-1。
? SqlName=执行删除的SQL名称,即配置文件中的 <sqlname=”SqlName”>,预设=Delete。
? Ids=要删除的数据ID,多个用,分开。
? bTrans=指定是否需要事务,true:要事务。预设=false。
? right=指定是否要判断权限,right=true是(预设),right=false不用判断权限。
13. IsExists()
IsExists(string SqlName,string colValue,string msgID)--判断数据是否存在(如账号、Email等不能重复的字段),讯息在LastMsg中
? SqlName=要判断的SQL名称,即配置文件中的 <sqlname=”SqlName”>,该sql格式必须是:select id from tab wherecolName=colValue。
? colValue=要判断的字段值。
? msgID=显示讯的ID(空:不显示讯息)
14. GetJSValues()
GetJSValues(string jsParamName,string SqlName,object[]paramVal)--取得指定sqlname的JS变量值,用于联动select。执行SqlName的返回字段是:上级ID,本级ID,名称
返回JS字符串,格式:
var jsParamName=new Array();jsParamName[0]=newArray("0","1","名称1");.....
? jsParamName= JS变量名,该变量在JS函数中调用。
? SqlName=要判断的SQL名称,即配置文件中的 <sqlname=”SqlName”>,该sql格式必须是:select id from tab wherecolName=colValue。
? paramVal= sql的参数值,个数和顺序必须与参数名相同。
15. isLogin()
判断是否已经登录系统,是返回true,否返回false
16. IsEdit()
IsEdit(string SqlName,SByte type)—判断是否有编辑权限,是返回true。
? SqlName=SQL名称,即配置文件中的 <sqlname=”SqlName”>,系统是用SQL名来判断是否有执行该SQL的权限。
? Type=要判断哪个权限:1-查找,2-新增,3-修改,4-删除,9-全部
17. AddMsg()
AddMsg(string msgID,bool isClear)-- 将指定讯息ID的内容加入到LastMsg中
? msgID =要加入的讯息ID,在讯息文件中
? isClear= true(预设):清除LastMsg的所有讯息
18. DispMsg()
DispMsg(string msg,string url,bool IsBack)—用JS显示讯息,并返回指定页面。
? msg =要显示的信息,如果是null或空,则显示LastMsg
? url= IsBack=false时不用。IsBack=true时,返回的页面地址,,或要执行的JS函数(以")"结束)。url=null或'':返回上一页面history.go(-1),_只有2个数字以内:返回history.go(-url),以');'或')'结束则url=JS函数。
? IsBack=true:返回,false:不返回(留在当前页)
CSecurity类
判断使用者的操作权限类别,在WebFrame.Base名字空间里。是静态类,可以直接使用。
使用方法
该类在WebFrame.Base名字空间里,所以必须引入WebFrame.Base才能使用。可以直接使用,如CSecurity.GetRight();
属性说明
无
函数说明
1. GetSimpleRight()
GetSimpleRight(string UserId,string EntityFile,stringSqlName,string ConnKey,stringLanguageName)--取简单操作权限,即只取是否允许的权限,返回取得的权限(1有,0无)。该函数执行UP_TB_RoleRight_GetUserRight存储过程。返回:0-无权限,1-查找,2-新增,3-修改,4-删除,9-全部
? UserId=使用者ID(必须已解密),取该使用者ID的权限。
? EntityFile=sql配置文件名,不含路径
? SqlName=配置文件中的SQL名称(<sqlname=”SqlName”>),即取UserId是否有对SqlName操作的权限。
? ConnKey=指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS)。
? LanguageName=指定使用的语言名称。
2. GetRight()
取全部权限,返回取到的权限(无权限返回0),格式:199111(6位),每个权限一位(0无,1有),顺序是(从左到右)1-允许,2-群组,3-角色级别,4-汇出,5-打印,6-远程。(其中,2-群组的值又有1-仅自己,2-仅群组内,3-组内及下层组,4-同级组及其下层,5-指定组,9-全部,3-角色级别的值又有1-低级别,2-同级别,9-全部)。该函数执行UP_TB_RoleRight_GetUserRight存储过程。
GetRight(string RoleIds,string EntityFile,string SqlName,stringConnKey,string LanguageName)=取指定RoleIds的SqlName的全部权限
GetRight(int right,int type) =由全部权限值取中期一个权限的值,即分解全部权限的值。
(参数与GetSimpleRight()类似,请参考GetSimpleRight()说明)
? RoleIds=角色ID,多个用,分开
? right=权限值,由GetRight(UserId,SqlName)取得的权限值。
? type=要取的权限类别,1-允许,2-群组,3-角色级别,4-汇出,5-打印,6-远程。
3. IsInGroup()
IsInGroup(string ParentId,string User_GroupId,bool bUserId,stringConnKey,stringLanguageName)--判断用户ID或群组ID是否是另一个群组内及下层组,返回值:1=User_GroupId与ParentId同组,2=User_GroupId是ParentId的直接下层,3=User_GroupId是ParentId的下层之下层,0-User_GroupId与ParentId无关系。该函数使用UP_TB_Users_IsInGroup存储过程。
? ParentId=上级群组ID,或群组ID。判断使用者的群组与ParentId的关系。
? User_GroupId=要判断的用户ID或群组ID,与ParentId中的关系。
?bUserId=指定User_GroupId的值,当bUserId=true时,User_GroupId=UserId(用该使用者ID来取得其群组ID),否则User_GroupId=GroupId
? ConnKey=指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS)
? LanguageName=指定使用的语言名称
4. IsRoleLevel()
IsUserLevel(string UserId1,string UserId2,string ConnKey,stringLanguageName)--比较操作者的级别与指定用户角色级别,返回值:-1:RoleLevel低于指定用户级别,0:相同,1:RoleLevel高于指定用户级别。该函数使用UP_TB_Role_IsRoleLevel存储过程。
? RoleLevel=角色级别,判断用户的角色级别与RoleLevel的比较。
?Role_User_GroupId=使用者的角色ID、或用户ID、或群组ID,用这些ID来取角色级别,然后与RoleLevel比较。
?nRoleId=指定Role_User_GroupId的类别,nRoleId=0时:Role_User_GroupId=RoleLevel角色级别,nRoleId=1时:Role_User_GroupId=RoleId角色ID,nRoleId=2时:Role_User_GroupId=UserId用户ID,nRoleId=3时:Role_User_GroupId=GroupId群组ID
? ConnKey=指定数据库连接字符串的key,该值在系统配置文件(WebFrame.config)中的
<addkey=”DB.ConnString.zh-CHS”…/>中指定(不包含语言名称.zh-CHS)
? LanguageName=指定使用的语言名称