在Forums中,有些内容是不固定的,例如用户资料,除了一些基本资料,可能还要有一些其他资料信息,例如MSN、个人主页、签名档等,一般对于这样的都是每一个属性对应于数据库中的一个字段。但是如果以后我们因为需要增加一些属性,例如QQ号、Blog地址等,如果还是用这种增加数据表字段的方法,那么将会频繁的修改数据库表结构、存储过程、数据库访问的程序。
或许您也遇到过类似问题,看Forums中是怎么借用.Net的序列化和反序列化来解决的:
例如我需要在用户资料里面增加QQ号这个属性,那么我只需要在User类中增加一个属性
public String QQIM
{
get { return GetExtendedAttribute("QQIM"); }
set { SetExtendedAttribute("QQIM", value); }
}
不需要修改数据库表结构,不需要修改存储过程,连数据库访问的程序都不需要动。
其具体实现的主要代码:
实质上序列化机制是将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流保存到数据库的某个字段中(在数据库中forums_UserProfile表中有一个字段“StringNameValues varbinary(7500)”)。读取的过程对对象进行反序列化时,创建出与原对象完全相同的副本。
注意一般这类属性在数据库中是不能被检索到的,并且要这些属性能被序列化。
更详细内容请查阅MSDN和Asp.Net Forums源码
打印 | 张贴于 2004-12-10 13:44:00 | Tag:CnForums
目前致力于
留言反馈
解决无法查询的问题
"IIf(PropertyNames='' or PropertyNames is Null,'',Mid(PropertyValues,Val(Mid(Mid(PropertyNames,InStr(1,PropertyNames,'" + property.Name + "')+Len('" + property.Name + "')+3),1,InStr(1,Mid(PropertyNames,InStr(1,PropertyNames,'" + property.Name + "')+Len('" + property.Name + "')+3),':')-1))+1,4)) = '" + property.Value + "'"
用另外一个基础表保本记录类型,如qq,msn,mail等。
然后在这个信息保存表中指定是qq还是msn就可以了。
这样如果要新加联系方式的话不需要改数据结构。
我在博客园上没有找到。
这样做可以将一些非查询类资料进行序列化管理,将资料转换到一个字段内统一存储。类似于php当年的
内容=a|neirong=b|cic=C;
对不?
只是具体保存方法和保存的格式不同了。
学习。
实际上,CS中有很多属性都是保存在序列化中的,例如icqIM,你可以参考其实现。
我下载的cnform2.0并没有看到您所说的“
在communityserver中就是从membership继承了 ”
我看到的是: User : ExtendedAttributes
因为我是业余学习者,所以我一行行看其中的代码实在太累。
但大概明白其中的意思。虽然不是直接从membershipuser继承,但是的确用了membershipuser的属性。
就是不明白为什么不直接继承的了
我现在的思路如下,希望得到你的指正
1.建一个表(userattriextend),通过username字段来和aspnet_Users中的username建立联系
2.建个userattriextend类,不继承任何类。构造函数用一个userame参数,然后设置各种附加属性,如QQ,在属性设计中的set,get都是分别从数据库写入(update)和读取(executescalar).
希望继续得到你的帮助。
附:我明白把一个sql server的储存过程导出到access(access没有储存过程吧。).sql server数据库间的储存过程导入导出我目前是用attach-detach,或备份的方法,请问有什么更简单的方法吗?
我在你的asp.net发email的贴也问了个问题。
谢谢了。
这个时候membership还没有出来呢,呵呵,在communityserver中就是从membership继承了
对不起,为什么不从membershipuser继承。
谢谢。
例如我需要在用户资料里面增加QQ号这个属性,那么我只需要在User类中增加一个属性
public String QQIM
{
get { return GetExtendedAttribute("QQIM"); }
set { SetExtendedAttribute("QQIM", value); }
}
宝玉说的这句话什么意思,难道vs 2005可以直接修改user类的结构。
新手问题,请勿见笑
必须是可转化为string型的,不需要被检索的,所以要灵活运行,不能全部采用
建议再检查一下您的代码!
因为办公室的代码要拿 回家写,备份恢复SQL库后,此字段读取失败.长度稍发生变化.
SQL同样的版本.
对于字符串序列化方式在另一篇随笔中有说明!
:)
俺想着如果按到一定的格式把这些信息连接成字符串存储在一个字段里面不好么?
按格式的话也可以查询
需求是客户提出的,如果事后客户再提出搜索个人主页,QQ号,签名档等,我想改起来更麻烦
正面:减少程序员开发量,提高灵活性,Flexible
反面:一个字,慢
但是至少这个地方用此方法很好。
所以主要用来保存一些不需要被查询的,例如个人主页,QQ号,签名档等