好累啊,好像感冒了,一点感觉都没有!~
先用着吧,也不去追究乱不乱了,说到底还是项目进度要紧,时间就是金钱,时间就是生命呀
DBFactory调用了ADM文件(类似于hibenate的hbm,不过我这里用的是JSon格式,方便调用,而且也不需要再做xml解析,省时省力,真的是居家旅行,杀人灭口,必备利器)
这里调了一个外部文件操作类,里面写了一些简单的文件操作功能,主要为读写追加文件,够用了就行,以后需要再往里加,唉!时间啊!
/**/
/*
********************************************************************************************
文 件: /Function/Database.asp
作 者: hnyashiro
********************************************************************************************
文 件: /Function/Database.asp
作 者: hnyashiro
时 间: 2007年7月26日
备注:
这里的DBFactory自我感觉在功能和上有前面的Statement有点混淆了!
好像把本就是SQL操作的内容硬生生的给分成了两部分,感觉有点不爽!先不管
了,把DBFactory完成后之再看看,是不是能够合并吧
********************************************************************************************
*/
Database.DBFactory = Class.create();
Database.DBFactory.construct = function () ... {
this.DBean = null;
this.dbTable = "";
this.dbContext = null;
this.Initialize=function()...{
this.dbTable = arguments[0] || this.dbTable;
}
this.useTable=function(strTb)...{
/**//*
========================================================================================
useTable:
1.根据传入的表名称参数strTb,设置DBFactory的当前操作表名
2.从指定目录中读取对应表名的数据表配置文件,并对配置信息进行布署
3.配置信息中的表字段有三个主要属性type[表字段类型],size[表字段大小],mainkey[是否主键]
4.可扩展配置信息
========================================================================================
*/
this.dbTable = strTb;
try...{
var strContext = FileManager.getFile(Server.MapPath(Database.Configuration.ADM_PATH+this.dbTable+"."+Database.Configuration.ADM_EXT),"UTF-8");
eval("var s="+strContext);
this.dbStruct = s;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.useTable错误--表配置文件读入错误"+e.description)
}
}
this.getTypeValue=function(strName,strValue)...{
/**//*
=======================================================================
getTypeValue:
1.主要是为了把数据库字段对应的内容转换成相应的数据类型
2.只加入了简单的转换,并没有进行数据合法性验证,数据验证类在以后将会书写,
然后再头过头来为此方法增加数据验证功能
=======================================================================
*/
if(this.dbStruct==null)...{
throw new Error("(Databse.DBFcatory)Instance.getTypeValue错误--没有找到数据表的配置信息");
}
var tp = this.dbStruct[strName].TYPE.toLowerCase();
var val=null;
try...{
switch(tp)...{
case "int":
val = parseInt(strValue);
break;
case "varchar":
val = new String(strValue);
break;
case "text":
val = new String(strValue);
break;
case "float":
val = parseFloat(strValue);
break;
case "datetime":
val = new Date(strValue);
break;
case "date":
val = new Date(strValue);
break;
case "bit":
val = new Boolean(strValue);
break;
}
return val;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.getTypeValue错误--字段对应数据类型不正确");
}
}
this.__InsertSQLBuild=function(dbBean)...{
/**//*
=======================================================================
在这里对数据模型对象的参数进行校验,以生成适合SQL使用的格式
最终返回一个完整的insert语句
在这里目前只对text类型的字段做escape编码!其他暂未考虑
=======================================================================
*/
try...{
if(this.DBean==null)...{
throw new Error("(Databse.DBFcatory)Instance.InsertSQLBuild错误--表对象不能为空");
}
if(this.DBean.constructor!=Object)...{
throw new Error("(Databse.DBFcatory)Instance.InsertSQLBuild错误--表对象类型必须为Object");
}
if(this.dbTable==null)...{
throw new Error("(Databse.DBFcatory)Instance.InsertSQLBuild错误--表名称不能为空");
}
var fdlist = [];
var vllist = [];
var tmpVal = "";
for(obj in this.DBean)...{
if(this.DBean[obj]==null || this.DBean[obj]=="" || this.DBean[obj]==undefined)...{
continue;
}
if(this.dbStruct[obj].MAINKEY==0)...{
fdlist.push("["+obj+"]");
tpVal = this.dbStruct[obj].TYPE.toLowerCase();
switch(tpVal)...{
case 'int':
vllist.push(parseInt(this.DBean[obj]));
break;
case 'float':
vllist.push(parseFloat(this.DBean[obj]));
break;
case 'varchar':
vllist.push("'"+this.DBean[obj]+"'");
break;
case 'text':
vllist.push("'"+escape(this.DBean[obj])+"'");
break;
case 'datetime':
vllist.push("'"+this.DBean[obj]+"'");
break;
case 'date':
vllist.push("'"+this.DBean[obj]+"'");
break;
case 'bit':
vllist.push(new Boolean(this.DBean[obj]));
break;
}
}
}
SQLSTR = "insert into ["+this.dbTable+"]("+fdlist.join(",")+")Values("+vllist.join(",")+")";
return SQLSTR;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.InsertSQLBuild错误--"+e.description);
}
return null;
}
this.Insert=function(dbBean)...{
/**//*
==============================================================================
Insert:
1.执行单个对象的Insert操作
2.若是对象列表,需要使用Loop来完成数据的批量添加
3.这里还有个问题就是数据的编码问题,因为传进来的参数有没有经过escape编码不确定
考虑是不是在已编码的数据之前加上escage的前缀,用来表示是经过编码处理的
==============================================================================
*/
this.DBean = dbBean || null;
try...{
var sql = this.__InsertSQLBuild(dbBean);
blFlag = new Database.Statement().Execute(SQLSTR);
return blFlag;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.Insert错误--"+e.description);
}
}
this.__UpdateSQLBuild=function(dbBean)...{
/**//*
=======================================================================
在这里对数据模型对象的参数进行校验,以生成适合SQL使用的格式
最终返回一个完整的Update语句
在这里目前只对text类型的字段做escape编码!其他暂未考虑
=======================================================================
*/
try...{
if(this.DBean==null)...{
throw new Error("(Databse.DBFcatory)Instance.UpdateSQLBuild错误--表对象不能为空");
}
if(this.DBean.constructor!=Object)...{
throw new Error("(Databse.DBFcatory)Instance.UpdateSQLBuild错误--表对象类型必须为Object");
}
if(this.dbTable==null)...{
throw new Error("(Databse.DBFcatory)Instance.UpdateSQLBuild错误--表名称不能为空");
}
var setArr = [];
var Where = "";
for(obj in this.DBean)...{
if(this.DBean[obj]==null || this.DBean[obj]=="" || this.DBean[obj]==undefined)...{
continue;
}
if(this.dbStruct[obj].MAINKEY==0)...{
tpVal = this.dbStruct[obj].TYPE.toLowerCase();
switch(tpVal)...{
case 'int':
setArr.push(obj+"="+parseInt(this.DBean[obj]));
break;
case 'float':
setArr.push(obj+"="+parseFloat(this.DBean[obj]));
break;
case 'varchar':
setArr.push(obj+"='"+this.DBean[obj]+"'");
break;
case 'text':
setArr.push(obj+"='"+escape(this.DBean[obj])+"'");
break;
case 'datetime':
setArr.push(obj+"='"+this.DBean[obj]+"'");
break;
case 'date':
setArr.push(obj+"='"+this.DBean[obj]+"'");
break;
case 'bit':
setArr.push(obj+"="+new Boolean(this.DBean[obj]));
break;
}
}else if(this.dbStruct[obj].MAINKEY==1)...{
Where = obj+"="+this.DBean[obj];
}
}
SQLSTR = "update ["+this.dbTable+"] set "+setArr.join(",")+" Where "+Where;
return SQLSTR;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.InsertSQLBuild错误--"+e.description);
}
return null;
}
this.Update=function(dbBean)...{
/**//*
==============================================================================
Update:
1.执行单个对象的Update操作
2.若是对象列表,需要使用Loop来完成数据的批量Update
3.这里还有个问题就是数据的编码问题,因为传进来的参数有没有经过escape编码不确定
考虑是不是在已编码的数据之前加上escage的前缀,用来表示是经过编码处理的
4.过滤关键字段只设值为主键,关于这个问题,想专门出一个SqlParse来处理filter(以后考虑啦,现在项目紧,有了用的功能再说,嘻嘻)
==============================================================================
*/
this.DBean = dbBean || null;
try...{
var sql = this.__UpdateSQLBuild(dbBean);
blFlag = new Database.Statement().Execute(sql);
return blFlag;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.Update错误--"+e.description);
}
}
this.__DeleteSQLBuild=function(dbBean)...{
try...{
if(this.DBean==null)...{
throw new Error("(Databse.DBFcatory)Instance.DeleteSQLBuild错误--表对象不能为空");
}
if(this.DBean.constructor!=Object)...{
throw new Error("(Databse.DBFcatory)Instance.DeleteSQLBuild错误--表对象类型必须为Object");
}
if(this.dbTable==null)...{
throw new Error("(Databse.DBFcatory)Instance.DeleteSQLBuild错误--表名称不能为空");
}
var setArr = [];
for(obj in this.DBean)...{
if(this.DBean[obj]==null || this.DBean[obj]=="" || this.DBean[obj]==undefined)...{
continue;
}
tpVal = this.dbStruct[obj].TYPE.toLowerCase();
switch(tpVal)...{
case 'int':
setArr.push(obj+"="+parseInt(this.DBean[obj]));
break;
case 'float':
setArr.push(obj+"="+parseFloat(this.DBean[obj]));
break;
case 'varchar':
setArr.push(obj+" Like '%"+this.DBean[obj]+"%'");
break;
case 'text':
setArr.push(obj+" Like '%"+escape(this.DBean[obj])+"%'");
break;
case 'datetime':
setArr.push(obj+"='"+this.DBean[obj]+"'");
break;
case 'date':
setArr.push(obj+"='"+this.DBean[obj]+"'");
break;
case 'bit':
setArr.push(obj+"="+new Boolean(this.DBean[obj]));
break;
}
}
return "delete from ["+this.dbTable+"] Where "+setArr.join(" OR ");
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.DeleteSQLBuild错误--"+e.description);
}
}
this.Delete=function(dbBean)...{
/**//*
==============================================================================
Delete:
1.执行单个对象的Delete操作
2.若是对象列表,需要使用Loop来完成数据的批量Delete
==============================================================================
*/
this.DBean = dbBean || null;
try...{
var sql = this.__DeleteSQLBuild(dbBean);
blFlag = new Database.Statement().Execute(sql);
return blFlag;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.Delete错误--"+e.description);
}
}
}
备注:
这里的DBFactory自我感觉在功能和上有前面的Statement有点混淆了!
好像把本就是SQL操作的内容硬生生的给分成了两部分,感觉有点不爽!先不管
了,把DBFactory完成后之再看看,是不是能够合并吧
********************************************************************************************
*/
Database.DBFactory = Class.create();
Database.DBFactory.construct = function () ... {
this.DBean = null;
this.dbTable = "";
this.dbContext = null;
this.Initialize=function()...{
this.dbTable = arguments[0] || this.dbTable;
}
this.useTable=function(strTb)...{
/**//*
========================================================================================
useTable:
1.根据传入的表名称参数strTb,设置DBFactory的当前操作表名
2.从指定目录中读取对应表名的数据表配置文件,并对配置信息进行布署
3.配置信息中的表字段有三个主要属性type[表字段类型],size[表字段大小],mainkey[是否主键]
4.可扩展配置信息
========================================================================================
*/
this.dbTable = strTb;
try...{
var strContext = FileManager.getFile(Server.MapPath(Database.Configuration.ADM_PATH+this.dbTable+"."+Database.Configuration.ADM_EXT),"UTF-8");
eval("var s="+strContext);
this.dbStruct = s;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.useTable错误--表配置文件读入错误"+e.description)
}
}
this.getTypeValue=function(strName,strValue)...{
/**//*
=======================================================================
getTypeValue:
1.主要是为了把数据库字段对应的内容转换成相应的数据类型
2.只加入了简单的转换,并没有进行数据合法性验证,数据验证类在以后将会书写,
然后再头过头来为此方法增加数据验证功能
=======================================================================
*/
if(this.dbStruct==null)...{
throw new Error("(Databse.DBFcatory)Instance.getTypeValue错误--没有找到数据表的配置信息");
}
var tp = this.dbStruct[strName].TYPE.toLowerCase();
var val=null;
try...{
switch(tp)...{
case "int":
val = parseInt(strValue);
break;
case "varchar":
val = new String(strValue);
break;
case "text":
val = new String(strValue);
break;
case "float":
val = parseFloat(strValue);
break;
case "datetime":
val = new Date(strValue);
break;
case "date":
val = new Date(strValue);
break;
case "bit":
val = new Boolean(strValue);
break;
}
return val;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.getTypeValue错误--字段对应数据类型不正确");
}
}
this.__InsertSQLBuild=function(dbBean)...{
/**//*
=======================================================================
在这里对数据模型对象的参数进行校验,以生成适合SQL使用的格式
最终返回一个完整的insert语句
在这里目前只对text类型的字段做escape编码!其他暂未考虑
=======================================================================
*/
try...{
if(this.DBean==null)...{
throw new Error("(Databse.DBFcatory)Instance.InsertSQLBuild错误--表对象不能为空");
}
if(this.DBean.constructor!=Object)...{
throw new Error("(Databse.DBFcatory)Instance.InsertSQLBuild错误--表对象类型必须为Object");
}
if(this.dbTable==null)...{
throw new Error("(Databse.DBFcatory)Instance.InsertSQLBuild错误--表名称不能为空");
}
var fdlist = [];
var vllist = [];
var tmpVal = "";
for(obj in this.DBean)...{
if(this.DBean[obj]==null || this.DBean[obj]=="" || this.DBean[obj]==undefined)...{
continue;
}
if(this.dbStruct[obj].MAINKEY==0)...{
fdlist.push("["+obj+"]");
tpVal = this.dbStruct[obj].TYPE.toLowerCase();
switch(tpVal)...{
case 'int':
vllist.push(parseInt(this.DBean[obj]));
break;
case 'float':
vllist.push(parseFloat(this.DBean[obj]));
break;
case 'varchar':
vllist.push("'"+this.DBean[obj]+"'");
break;
case 'text':
vllist.push("'"+escape(this.DBean[obj])+"'");
break;
case 'datetime':
vllist.push("'"+this.DBean[obj]+"'");
break;
case 'date':
vllist.push("'"+this.DBean[obj]+"'");
break;
case 'bit':
vllist.push(new Boolean(this.DBean[obj]));
break;
}
}
}
SQLSTR = "insert into ["+this.dbTable+"]("+fdlist.join(",")+")Values("+vllist.join(",")+")";
return SQLSTR;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.InsertSQLBuild错误--"+e.description);
}
return null;
}
this.Insert=function(dbBean)...{
/**//*
==============================================================================
Insert:
1.执行单个对象的Insert操作
2.若是对象列表,需要使用Loop来完成数据的批量添加
3.这里还有个问题就是数据的编码问题,因为传进来的参数有没有经过escape编码不确定
考虑是不是在已编码的数据之前加上escage的前缀,用来表示是经过编码处理的
==============================================================================
*/
this.DBean = dbBean || null;
try...{
var sql = this.__InsertSQLBuild(dbBean);
blFlag = new Database.Statement().Execute(SQLSTR);
return blFlag;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.Insert错误--"+e.description);
}
}
this.__UpdateSQLBuild=function(dbBean)...{
/**//*
=======================================================================
在这里对数据模型对象的参数进行校验,以生成适合SQL使用的格式
最终返回一个完整的Update语句
在这里目前只对text类型的字段做escape编码!其他暂未考虑
=======================================================================
*/
try...{
if(this.DBean==null)...{
throw new Error("(Databse.DBFcatory)Instance.UpdateSQLBuild错误--表对象不能为空");
}
if(this.DBean.constructor!=Object)...{
throw new Error("(Databse.DBFcatory)Instance.UpdateSQLBuild错误--表对象类型必须为Object");
}
if(this.dbTable==null)...{
throw new Error("(Databse.DBFcatory)Instance.UpdateSQLBuild错误--表名称不能为空");
}
var setArr = [];
var Where = "";
for(obj in this.DBean)...{
if(this.DBean[obj]==null || this.DBean[obj]=="" || this.DBean[obj]==undefined)...{
continue;
}
if(this.dbStruct[obj].MAINKEY==0)...{
tpVal = this.dbStruct[obj].TYPE.toLowerCase();
switch(tpVal)...{
case 'int':
setArr.push(obj+"="+parseInt(this.DBean[obj]));
break;
case 'float':
setArr.push(obj+"="+parseFloat(this.DBean[obj]));
break;
case 'varchar':
setArr.push(obj+"='"+this.DBean[obj]+"'");
break;
case 'text':
setArr.push(obj+"='"+escape(this.DBean[obj])+"'");
break;
case 'datetime':
setArr.push(obj+"='"+this.DBean[obj]+"'");
break;
case 'date':
setArr.push(obj+"='"+this.DBean[obj]+"'");
break;
case 'bit':
setArr.push(obj+"="+new Boolean(this.DBean[obj]));
break;
}
}else if(this.dbStruct[obj].MAINKEY==1)...{
Where = obj+"="+this.DBean[obj];
}
}
SQLSTR = "update ["+this.dbTable+"] set "+setArr.join(",")+" Where "+Where;
return SQLSTR;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.InsertSQLBuild错误--"+e.description);
}
return null;
}
this.Update=function(dbBean)...{
/**//*
==============================================================================
Update:
1.执行单个对象的Update操作
2.若是对象列表,需要使用Loop来完成数据的批量Update
3.这里还有个问题就是数据的编码问题,因为传进来的参数有没有经过escape编码不确定
考虑是不是在已编码的数据之前加上escage的前缀,用来表示是经过编码处理的
4.过滤关键字段只设值为主键,关于这个问题,想专门出一个SqlParse来处理filter(以后考虑啦,现在项目紧,有了用的功能再说,嘻嘻)
==============================================================================
*/
this.DBean = dbBean || null;
try...{
var sql = this.__UpdateSQLBuild(dbBean);
blFlag = new Database.Statement().Execute(sql);
return blFlag;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.Update错误--"+e.description);
}
}
this.__DeleteSQLBuild=function(dbBean)...{
try...{
if(this.DBean==null)...{
throw new Error("(Databse.DBFcatory)Instance.DeleteSQLBuild错误--表对象不能为空");
}
if(this.DBean.constructor!=Object)...{
throw new Error("(Databse.DBFcatory)Instance.DeleteSQLBuild错误--表对象类型必须为Object");
}
if(this.dbTable==null)...{
throw new Error("(Databse.DBFcatory)Instance.DeleteSQLBuild错误--表名称不能为空");
}
var setArr = [];
for(obj in this.DBean)...{
if(this.DBean[obj]==null || this.DBean[obj]=="" || this.DBean[obj]==undefined)...{
continue;
}
tpVal = this.dbStruct[obj].TYPE.toLowerCase();
switch(tpVal)...{
case 'int':
setArr.push(obj+"="+parseInt(this.DBean[obj]));
break;
case 'float':
setArr.push(obj+"="+parseFloat(this.DBean[obj]));
break;
case 'varchar':
setArr.push(obj+" Like '%"+this.DBean[obj]+"%'");
break;
case 'text':
setArr.push(obj+" Like '%"+escape(this.DBean[obj])+"%'");
break;
case 'datetime':
setArr.push(obj+"='"+this.DBean[obj]+"'");
break;
case 'date':
setArr.push(obj+"='"+this.DBean[obj]+"'");
break;
case 'bit':
setArr.push(obj+"="+new Boolean(this.DBean[obj]));
break;
}
}
return "delete from ["+this.dbTable+"] Where "+setArr.join(" OR ");
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.DeleteSQLBuild错误--"+e.description);
}
}
this.Delete=function(dbBean)...{
/**//*
==============================================================================
Delete:
1.执行单个对象的Delete操作
2.若是对象列表,需要使用Loop来完成数据的批量Delete
==============================================================================
*/
this.DBean = dbBean || null;
try...{
var sql = this.__DeleteSQLBuild(dbBean);
blFlag = new Database.Statement().Execute(sql);
return blFlag;
}catch(e)...{
throw new Error("(Databse.DBFcatory)Instance.Delete错误--"+e.description);
}
}
}