请问如何给函数返回的对象赋值? 这个好像和asp语言的内部机制有关吧.没有研究过 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你要想改变rs的值就只能对原始的rs进行操作并且在保存之前不能关闭它. function RS(sql){ rs.id=rs("id") return rs}这样能够解决rs("id")=1的问题, 可是rs.id又不能用了, 不知道怎么搞的, rs这个对象不能给他赋值,rs.id=rs("id")这句就会提示错误 对象不支持该属性或方法 这样亏你想得出来,要是支持这个觉得RS对象支持这个属性吗?有这个属性吗? 其实我就是想不通, 为什么JS要区分大小写,ASP五大对象不区分大小写, 创建的ActiveObject也可以不区分大小写调用方法若没参数可以不打括号, 返回函数还可以赋值 等等...这到底是怎么实现的呢? 还有就是JS中可以给任意对象的未定义的属性赋值例如var a=new Object()a.hello="world"可是ASP的五大对象也ActiveObject都不能这样, 例如rs=createObject("...")rs.hello="world" // 提示对象不支持属性或方法但是我看了rs的类型, 是继承自object的, 可是为什么这样却不能赋值呢?搞不懂的... 1、是为了安全2、是为了保密再如,在浏览器里我们自定义的函数可以通过toString()来看到函数本身的内容,而且我们还可以去更改自定义函数,但是通过toString()我们查看系统函数时得到的是[object],浏览器不让我们看它内部的代码,即便是我们经常用的函数。 做映射 数据量大的时候不建议给些我的代码你参考一下 只是一部分System.data = { connection:function(){ var db = Server.MapPath(paths + "bak/abs.mdb"); var conn = Server.CreateObject("ADODB.Connection"); conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;User ID=admin;Data Source=" + db); return conn; }, /* return Array { readonly bool pageSplit bool pageSize int pageIndex int pageCount int classType "recordset" Fields array(string) } [item] Object { classType "record" } */ recordSet:function(sql,o){ var options = { readonly:true, pageSplit:false, pageSize:20, pageIndex:1 } System.extend(options,o); var oconn = System.data.connection(); var rs = Server.CreateObject("ADODB.RecordSet"); //System.view(sql,true); rs.Open(sql,oconn,options.readonly?1:3,options.readonly?1:3); var arr = []; var arr1 = []; options.pageCount = rs.PageCount; for(var i=0,l=rs.Fields.Count;i<l;i++) arr1[arr1.length] = rs.Fields.Item(i).Name; if(!rs.EOF) { if(options.pageSplit) { rs.PageSize = options.pageSize; options.pageCount = rs.PageCount; if(options.pageIndex<1)options.pageIndex = 1; if(options.pageIndex>rs.PageCount)options.pageIndex = rs.PageCount; rs.AbsolutePage = options.pageIndex; } var pageSize = options.pageSize; while(!rs.EOF && (!options.pageSplit || pageSize-->0)) { var obj = {classType:"record"}; for(var i=0,l=arr1.length;i<l;i++) { obj[arr1[i]] = rs.Fields.Item(arr1[i]).Value; switch(typeof(obj[arr1[i]])) { case "string":obj[arr1[i]] = String(obj[arr1[i]]);break; case "boolean":obj[arr1[i]] = RegExp.Cache.booleanTrue.test(new String(obj[arr1[i]]));break; case "number":obj[arr1[i]] = Number(obj[arr1[i]]);break; case "date":obj[arr1[i]] = new Date(Date.parse(obj[arr1[i]]));break; } } arr[arr.length] = obj; rs.MoveNext(); } } else { for(var i=0,l=rs.Fields.Count;i<l;i++) arr1[arr1.length] = rs.Fields.Item(i).Name; options.pageIndex = 0; } arr.commandText = sql; arr.Fields = arr1; arr.classType = "recordset"; System.extend(arr,options); rs.Close(); oconn.Close(); return arr; }, /*boolean*/ execute:function(/*string*/ sql) { var oconn = System.data.connection(); var returnvalue = true; try{ oconn.Execute(sql); }catch(e){ if(System.debug) returnvalue = e.message; else returnvalue = false; } oconn.Close(); return returnvalue; }} 哦, 原来如此, 不过我已经封装好了这个类调用示例:// 打开记录集, 连接对象在里面已经处理好了, 而且多个实例中是共享的Recordset池, 防止重复的调用CreateObject而没有及时回收加大服务器开销// 如果有空闲的Recordset对象, 则投入使用, 若没有空闲的, 则自动CreateObject创建一个var rs=RS("select ddNickName from ddUser", 0) // 最后的参数为0=只读方式打开, 1=一次性调用, 调用结束后关闭连接, 2=可读写方式打开var a=rs.ddNickName // 这里传的是变量的值, 而不是field的引用, 这样可以避免很多麻烦//例如 一个Date类型的field对象字段, rs("ddBirthday").getFullYear()这样是错的, //而 rs.ddBirthday.getFullYear() 则是OK的, //程序会自动根据字段的类型来重新映射字段的值, 并且类型不会丢失, 当然, 目前只支持各种格式的 数字, 布尔, 字符串 和 日期, 其他格式很少使用, 所以就暂不支持了rs.moveNext() // 支持游标操作, 如果哪位能够做出不加括号也能调用这个方法, 请告诉我, 非常感谢, 这样就能够像真正的Recordset对象一样rs.ddNickName="hello" // 赋值操作rs.update() // update 函数也重写了, 后面的参数是 是否将当前记录作为新的记录来更新rs.addNew() // 增加新记录操作rs.ddNickName="world"rs.update() // 按照常规模式, AddNew是不需要update,可是为了节省编写代码的时间, 所以还是靠update来更新, 而不是在游标移动或者关闭连接时来更新rs.moveFirst() // 游标操作for(var i=0; i<rs.length; i++){ // 使用rs.length代替了rs.recordset属性, 一来recordset太长, 二来不符合js的习惯, 例如字符串, 数组等都是length Response.write(rs.ddNickName+"<br />") rs.moveNext()}rs.moveLast()while(!rs.bof){ // bof, eof 属性完美的支持 Response.write(rs.ddNickName+"<br />") rs.moveProv()}rs.close()基本上常用的属性和方法已经重写了, 同时还提供访问真正的Recordset对象的方式, 例如 rs.rs("ddNickName") 来支持没有重写的属性或方法 所有对字段的写入, 新增操作都不是实时生效, 只有当调用rs.update()时, 才会将字段的值写入到field对象中并update Recordset不过这样做性能问题是肯定存在的, 因为每当打开连接或游标移动, 都要重新映射值, 而当数据量非常大, 或则字段中有很长的内容的时候(nText 等类型), 效率肯定会很低下 呵呵, 本人喜欢偷懒, 我甚至还写了一个静态类用于生成一条sql语句, 例如var field=["ddName","ddClass","ddNickName"]var valus=["bizshiw","1","布丁"]var sql = SqlMaker.insert("ddUser", field, valus)// sql="insert into ddUser(ddName,ddClass,ddNickName) values('...','...','...')"这样当字段很多的时候, 也不容易出错, 代码维护起来也容易得很多, 可是就是消耗服务器资源, 本来一个字符串能够解决的问题 变成了 N+1个字符串+2个数组类似的还有给order 部分取反, where部分取反 等等我有一种想自己开发一个Recordset组件的冲动了, 不知道VB6.0能够开发ActiveX组件吗?不好意思, 我只会用VB... 我觉得rs没必要再提供update的能力,只是做做数据映射就够了。映射完数据应该及时关闭rs连接。update的话直接用execute执行sql就行了如果rs不及时关闭的话可能带来很多数据连接占用的问题。反而带来了出错的机会。LZ上面的insert满不错的,但要注意values的单引号问题. 我发现SQL Server的好处, 就是不管什么类型的值, 加上单引号都没有问题, 前提是JS能够将值正确的转换为需要的值, 例如update xxx set xxx='1' 与update xxx set xxx=1 等效的但如果 xxx 是 int, 则update xxx set xxx='aaa' 就会出错 高手请来帮忙。 JQUERY的问题 javascript 生成excel 求救!asp.net中javascript的一个难题! 怎么让子窗口关闭的时候在父窗口弹出刷新的次数 拦截alt+f4,不让IE窗口关闭! 关于窗口焦点问题 求高手合并两个jqery插件 本人刚入行新手勿喷 关于参数传值 原型相关一个报错问题 求解释 祝自己明天超水平发挥 给位虾友,求助一个正则表达式来替换一个字符串
rs.id=rs("id")
return rs
}
这样能够解决rs("id")=1的问题, 可是rs.id又不能用了, 不知道怎么搞的,
rs这个对象不能给他赋值,rs.id=rs("id")这句就会提示错误 对象不支持该属性或方法 这样亏你想得出来,要是支持这个觉得RS对象支持这个属性吗?有这个属性吗?
ASP五大对象不区分大小写, 创建的ActiveObject也可以不区分大小写
调用方法若没参数可以不打括号, 返回函数还可以赋值 等等...这到底是怎么实现的呢?
例如
var a=new Object()
a.hello="world"可是ASP的五大对象也ActiveObject都不能这样, 例如
rs=createObject("...")
rs.hello="world" // 提示对象不支持属性或方法
但是我看了rs的类型, 是继承自object的, 可是为什么这样却不能赋值呢?搞不懂的...
2、是为了保密
再如,在浏览器里我们自定义的函数可以通过toString()来看到函数本身的内容,而且我们还可以去更改自定义函数,但是通过toString()我们查看系统函数时得到的是[object],浏览器不让我们看它内部的代码,即便是我们经常用的函数。
connection:function(){
var db = Server.MapPath(paths + "bak/abs.mdb");
var conn = Server.CreateObject("ADODB.Connection");
conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;User ID=admin;Data Source=" + db);
return conn;
},
/*
return
Array
{
readonly bool
pageSplit bool
pageSize int
pageIndex int
pageCount int
classType "recordset"
Fields array(string)
}
[item]
Object
{
classType "record"
}
*/
recordSet:function(sql,o){
var options = {
readonly:true,
pageSplit:false,
pageSize:20,
pageIndex:1
}
System.extend(options,o);
var oconn = System.data.connection();
var rs = Server.CreateObject("ADODB.RecordSet");
//System.view(sql,true); rs.Open(sql,oconn,options.readonly?1:3,options.readonly?1:3);
var arr = [];
var arr1 = [];
options.pageCount = rs.PageCount;
for(var i=0,l=rs.Fields.Count;i<l;i++)
arr1[arr1.length] = rs.Fields.Item(i).Name;
if(!rs.EOF)
{
if(options.pageSplit)
{
rs.PageSize = options.pageSize;
options.pageCount = rs.PageCount;
if(options.pageIndex<1)options.pageIndex = 1;
if(options.pageIndex>rs.PageCount)options.pageIndex = rs.PageCount;
rs.AbsolutePage = options.pageIndex;
}
var pageSize = options.pageSize;
while(!rs.EOF && (!options.pageSplit || pageSize-->0))
{
var obj = {classType:"record"};
for(var i=0,l=arr1.length;i<l;i++)
{
obj[arr1[i]] = rs.Fields.Item(arr1[i]).Value;
switch(typeof(obj[arr1[i]]))
{
case "string":obj[arr1[i]] = String(obj[arr1[i]]);break;
case "boolean":obj[arr1[i]] = RegExp.Cache.booleanTrue.test(new String(obj[arr1[i]]));break;
case "number":obj[arr1[i]] = Number(obj[arr1[i]]);break;
case "date":obj[arr1[i]] = new Date(Date.parse(obj[arr1[i]]));break;
}
}
arr[arr.length] = obj;
rs.MoveNext();
}
}
else
{
for(var i=0,l=rs.Fields.Count;i<l;i++)
arr1[arr1.length] = rs.Fields.Item(i).Name;
options.pageIndex = 0;
}
arr.commandText = sql;
arr.Fields = arr1;
arr.classType = "recordset";
System.extend(arr,options);
rs.Close();
oconn.Close();
return arr;
},
/*boolean*/ execute:function(/*string*/ sql)
{
var oconn = System.data.connection();
var returnvalue = true;
try{
oconn.Execute(sql);
}catch(e){
if(System.debug)
returnvalue = e.message;
else
returnvalue = false;
}
oconn.Close();
return returnvalue;
}
}
调用示例:// 打开记录集, 连接对象在里面已经处理好了, 而且多个实例中是共享的Recordset池, 防止重复的调用CreateObject而没有及时回收加大服务器开销
// 如果有空闲的Recordset对象, 则投入使用, 若没有空闲的, 则自动CreateObject创建一个
var rs=RS("select ddNickName from ddUser", 0) // 最后的参数为0=只读方式打开, 1=一次性调用, 调用结束后关闭连接, 2=可读写方式打开
var a=rs.ddNickName // 这里传的是变量的值, 而不是field的引用, 这样可以避免很多麻烦
//例如 一个Date类型的field对象字段, rs("ddBirthday").getFullYear()这样是错的,
//而 rs.ddBirthday.getFullYear() 则是OK的,
//程序会自动根据字段的类型来重新映射字段的值, 并且类型不会丢失, 当然, 目前只支持各种格式的 数字, 布尔, 字符串 和 日期, 其他格式很少使用, 所以就暂不支持了
rs.moveNext() // 支持游标操作, 如果哪位能够做出不加括号也能调用这个方法, 请告诉我, 非常感谢, 这样就能够像真正的Recordset对象一样rs.ddNickName="hello" // 赋值操作
rs.update() // update 函数也重写了, 后面的参数是 是否将当前记录作为新的记录来更新rs.addNew() // 增加新记录操作
rs.ddNickName="world"
rs.update() // 按照常规模式, AddNew是不需要update,可是为了节省编写代码的时间, 所以还是靠update来更新, 而不是在游标移动或者关闭连接时来更新rs.moveFirst() // 游标操作
for(var i=0; i<rs.length; i++){ // 使用rs.length代替了rs.recordset属性, 一来recordset太长, 二来不符合js的习惯, 例如字符串, 数组等都是length
Response.write(rs.ddNickName+"<br />")
rs.moveNext()
}rs.moveLast()
while(!rs.bof){ // bof, eof 属性完美的支持
Response.write(rs.ddNickName+"<br />")
rs.moveProv()
}
rs.close()基本上常用的属性和方法已经重写了, 同时还提供访问真正的Recordset对象的方式, 例如 rs.rs("ddNickName") 来支持没有重写的属性或方法
而当数据量非常大, 或则字段中有很长的内容的时候(nText 等类型), 效率肯定会很低下
var field=["ddName","ddClass","ddNickName"]
var valus=["bizshiw","1","布丁"]
var sql = SqlMaker.insert("ddUser", field, valus)
// sql="insert into ddUser(ddName,ddClass,ddNickName) values('...','...','...')"
这样当字段很多的时候, 也不容易出错, 代码维护起来也容易得很多, 可是就是消耗服务器资源, 本来一个字符串能够解决的问题 变成了 N+1个字符串+2个数组
类似的还有给order 部分取反, where部分取反 等等我有一种想自己开发一个Recordset组件的冲动了, 不知道VB6.0能够开发ActiveX组件吗?
不好意思, 我只会用VB...
update的话直接用execute执行sql就行了
如果rs不及时关闭的话可能带来很多数据连接占用的问题。反而带来了出错的机会。
LZ上面的insert满不错的,但要注意values的单引号问题.
update xxx set xxx='1' 与
update xxx set xxx=1 等效的但如果 xxx 是 int, 则
update xxx set xxx='aaa' 就会出错