本文简单的介绍了如何向asp.net forum 导入数据。通过stella forum 2.0 -> asp.net forum041226的具体数据导入为例让大家对整个过程有一个直观的认识。通过本文,可以更好的了解asp.net forum的结构,为实现自己定制的论坛提供更多帮助。
基本思路
目的:使用可以自己控制且功能强大的asp.net forum
简介:将旧数据库的用户、论坛结构、帖子等数据导入anf
关键:在本地建一个专门用来导数据的anf,将数据导入后,只传数据库
向anf导入数据的步骤
1.从服务器端复制一个论坛程序到相应的位置
2.在本地对一个新的论坛程序进行改造
3.从本地上传覆盖掉服务器端相应位置论坛的需要自定义的部分
4.将服务器端的原数据库备份
5.将备份下载,在本地还原
6.使用最新数据的原论坛数据库将数据导入到新论坛的数据库
7.备份本地的新论坛的数据库
8.将备份上传到服务器端,将需要使用的新论坛数据库还原
9.后继工作
下面是对某些步骤的说明:
1.如果之前服务器上有运行anf,那直接复制一份就可以了。如果没有,那就从本地上传一份(这个好像有些白痴的解释……)
2.这个的意思是:因为为了导数据,需要对anf内部的一些程序进行修改,为了减少错误,所以建一个新的anf程序,用这个进行数据的导入,待完成后只要上传数据库到服务器就可以了,而在本地的这个用来导数据的anf不需要上传。
9.这些工作包括:
1)forums_Users表的用户编号改为自动增长
2)forums_User_CreateUpdateDelete用户插入时去掉“强制插入用户编号”
3)forums_Post_CreateUpdate帖子插入的时间改回=null
4)其他错误。(因为记不清楚了,所以只能这么不负责任的放这里了)
论坛和主站的结合
有些站点,论坛和主站使用相同的用户数据库,这样就要求在注册的时候同时向主站数据库和论坛数据库插入数据。对于这种情况,我的做法是先向论坛插入数据,没有问题了,在向主站插入数据。最后提供的两个存储过程就是用来在主站程序中向论坛插入数据用的。仅供参考。
相关的一些修改如下:
SiteUrls.config 行122 user_Register节点 注册页面连接
把论坛的注册连接改到主站就可以了
多说一句,主站和论坛的cookie同步问题可以这样解决
System.Web.HttpCookie coo=forumContext.Context.Response.Cookies[FormsAuthentication.FormsCookieName];
coo.Domain=".xxx.com";
.xxx.com是你的域名,这个代码在登陆和退出的时候都需要加。另外需要注意看web.config中的forms验证的cookie名是否一致。
下面是具体的数据导入工作的介绍:
第一步:用户数据的导入
1.准备工作
先要弄清楚anf的用户数据存放。现在用anf041226举例说明
forums_Users :存放基本数据
forums_UserProfile :存放资料
forums_UsersInRoles:存放角色
需要填充数据的就是这三个表。
因为我们的用户数据在导入前已经有用户编号,且论坛的帖子资料也是用的该用户编号,为了方便,需要保留这些用户编号,所以在数据导入前需要:
1) 修改forums_Users表,去掉UserID的自动增长属性。
2) 修改插入用户的存储过程forums_User_CreateUpdateDelete,首先注释掉插入用户前的“用户名昵称emial检查”,因为我们之前的数据可能会有一些重复的数据在里面,然后强制插入用户编号。具体的修改可以看我最后给出的那个sp。
3) 修改SqlDataProvider. CreateUpdateDeleteUser(),给参数@UserID赋值。
Anf在用户注册时是直接取的当前日期,为了保留原始的用户注册日期,需要强制插入。这需要做的工作有:
1) 修改插入用户的存储过程forums_User_CreateUpdateDelete,添加参数@DateCreated datetime,然后强制插入@DateCreated
2) 修改SqlDataProvider. CreateUpdateDeleteUser(),添加参数@DateCreated datetime,然后给该参数赋值。
Anf有用户昵称,如果之前的数据没有昵称这个设定,那最好就是把用户名赋给昵称,其实,我就是这么做的。(我觉得昵称完全没有用……)。而这个的完成只需要在导入数据的程序中做手脚就可以了。
删除关系FK_forums_UserProfile_forums_Users,这个我没弄清楚,总之删除了吧。
2.用户数据导入程序的编写
基本思想是使用原论坛的程序取出数据,然后再使用anf的程序将数据循环插入。
1) 从论坛数据库导入数据
如果该论坛是开源的,那可以自己动手,如果不是,那就需要自己先用C#写一个取全部用户数据的程序。取得用户数据后,可以直接使用anf自带的Users.Create()方法插入数据。
2) 从主站数据库导入数据
有些站点主站和论坛使用一样的用户数据库,但是像密码和email等资料只保存在主站数据库中,这个时候就需要直接从主站取数据。具体的操作方法同上。
无论如何,至少需要的数据为UserID、Username、Email、DateCreated、Password。
具体的代码可以看我最后给出的示例。
3.其他工作
Anf有一个用户资料EnableDisplayInMemberList,是用来控制是否将该用户统计到全部用户中。这个默认是1,如果不想统计某用户,可以待数据导入完成后手动修改这个数值。
如果要将某个用户设为管理员,则需要角色1和3。可以待数据导入完成后手动修改forums_UsersInRoles表添加这两个角色给指定的用户。
(当然,我上面说的手动修改的意思是使用查询分析器,而不是让您打开数据表……)
第二步:论坛结构和帖子的导入
1.准备工作
先认识一下anf在那些表保存论坛结构和帖子
forums_ForumGroups:存放论坛组
forums_Forums:存放论坛版块
forums_Threads:存放主题
forums_Posts:存放具体的帖子
帖子的内容全部存放到forums_Posts,而forums_Threads只是记录那些是主题帖的帖子的编号。这样就要我们注意,当向anf导入帖子时如何操作。
删除索引IX_ForumGroups,,这个我也没弄清楚,总之删除了吧。
论坛的组、版块、主题、帖子等的编号关系非常重要,为了方便,我使用了由anf新生成的编号。具体的操作可以看最后的示例代码。
原始的帖子有发表日期,所以需要把这些数据导入到新论坛中。
1)修改存储过程forums_Post_CreateUpdate,将@PostDate datetime = null改成@PostDate datetime 。这样就可以插入自己的数据。
2)修改SqlDataProvider. AddPost,给参数@PostDate赋值。
2.原始数据导入程序的编写
如果之前使用的是开源的论坛程序(比如我的sf2),那这一步就很简单了。如果不是,那就需要自己编写程序分别取得原始的组、版块、主题、帖子等数据,这个工作量……不过为了使用可以自己控制的anf,应该也是值得的!
基本思想同导入用户数据时,都是先用程序取出旧数据,然后用anf自带的方法添加到新数据库。
最后的示例程序是用sf2向anf导入数据。应该已经写的很清楚,在这里就不多说了。
第三步:运行
很简单,新建一个页面,然后简单的调用方法即可。
ForumConver.CreateUser ();
ForumConver.CreateForum ();
一定是先导入用户,然后导入其他数据。为了防止因执行时间太长而产生错误,可以分两步执行。
最后的话
我想大家看这个文章并不是为了真的导数据,就算是倒数据也不是从sf2导,所以就写到这里,点到为止,目的是让大家对如何向anf导入数据有一个直观的认识。
Anf很美好,值得为它奋斗!
附录部分
代码1:导入数据的程序
1using System;
2using System.Data;
3using AspNetForums;
4using AspNetForums.Controls;
5using AspNetForums.Components;
6using AspNetForums.Enumerations;
7
8namespace AspNetForums
9{
10 /**//// <summary>
11 /// ForumConver 的摘要说明。
12 /// </summary>
13 public class ForumConver
14 {
15 public ForumConver()
16 {
17 //
18 // TODO: 在此处添加构造函数逻辑
19 //
20 }
21
22 static int topicSize=500;
23 static int artSize=500;
24 static int userSize=1000;
25
26 CreateForum#region CreateForum
27
28 public static void CreateForum()
29 {
30 //添加组
31
32 Stella2.Model.Districts dists=Stella2.Business.Cached.GetDists();
33
34 foreach(Stella2.Model.District dist in dists.getDistricts())
35 {
36 //原始的组编号
37 int oriDistID=dist.Id;
38 //新的组编号
39 int newDistID=addForumGroup(dist.Name);
40 //添加板块
41 Stella2.Model.Themes themes=Stella2.Business.Cached.GetThemes(oriDistID);
42 foreach(Stella2.Model.Theme theme in themes.getThemes())
43 {
44 //原始的板块编号
45 int oriThemeID=theme.Id;
46 //新的板块编号
47 int newThemeID =addForum(theme,newDistID);
48
49 //添加帖子
50 Stella2.Model.Topics topics= (new Stella2.CheagleDAL.Theme()).GetTopics(oriThemeID,topicSize,1);
51 foreach(Stella2.Model.Topic topic in topics.getTopics())
52 {
53 //原始的主题编号
54 int oriTopicID=topic.Id;
55 Stella2.Model.Art[] arts=(new Stella2.CheagleDAL.Topic()).GetArts(oriTopicID,artSize,1).getArts();
56 //长度
57 int len=arts.Length;
58 //.先添加楼主帖
59 //新的主题的楼主帖的帖子编号
60
61 int newTopicArtID=0;
62 bool goon=true;
63 try
64 {
65 newTopicArtID=addThread(arts[0],newThemeID);
66 }
67 catch
68 {
69 goon=false;
70 }
71
72 if(goon)
73 {
74 //..再添加回帖
75 for(int i=1;i<len;i++)
76 {
77 addPost(arts[i],newTopicArtID);
78 }
79 }
80
81 }
82 }
83
84 }
85 }
86 #endregion
87
88 addForumGroup#region addForumGroup
89 static int addForumGroup(string name)
90 {
91 ForumGroup group = new ForumGroup(name);
92
93 //新的组编号
94 return ForumGroups.AddForumGroup(group);
95 }
96 #endregion
97
98 addForum#region addForum
99 static int addForum(Stella2.Model.Theme theme,int newDistID)
100 {
101 Forum forum = new Forum();
102 forum.ForumGroupID = newDistID;
103 forum.Name = theme.Name;
104 forum.ForumType = AspNetForums.Enumerations.ForumType.Normal;
105 forum.IsActive = true;
106 int themeid=Forums.AddForum(forum);
107 //权限
108 addPermissions(themeid);
109 return themeid;
110 }
111 #endregion
112
113 addThread#region addThread
114 static int addThread(Stella2.Model.Art topArt,int newThemeID)
115 {
116 Thread postToAdd = new Thread();
117
118 postToAdd.Username = topArt.UserAdded.Name;
119
120 postToAdd.Subject = topArt.Title;
121 postToAdd.IsLocked = false;
122 postToAdd.IsGlobal = false;
123
124 postToAdd.DisableBBCode = false;
125 postToAdd.DisableEmoticon = false;
126
127 postToAdd.IsTracked = false;
128
129 postToAdd.EmoticonID=0;
130
131 postToAdd.PostType = PostType.HTML;
132 postToAdd.Body =topArt.Body;
133
134 postToAdd.PostDate=topArt.DateAdded;
135
136 postToAdd.IsSticky = false;
137
138 //使用新的板块编号
139 postToAdd.ForumID=newThemeID;
140
141 User user=new User();
142
143 //添加该帖子的用户
144 user.UserID=topArt.UserAdded.UserId;
145 user.Nickname=topArt.UserAdded.Name;
146
147 return Posts.AddPost(postToAdd,user).PostID;
148
149 }
150 #endregion
151
152 addPost#region addPost
153 static void addPost(Stella2.Model.Art commonArt,int newTopicArtID)
154 {
155 Thread postToAdd = new Thread();
156
157 postToAdd.Username = commonArt.UserAdded.Name;
158
159 postToAdd.Subject = commonArt.Title;
160 postToAdd.IsLocked =false;
161 postToAdd.IsGlobal = false;
162
163 postToAdd.DisableBBCode = false;
164 postToAdd.DisableEmoticon =false;
165
166 postToAdd.IsTracked = false;
167
168 postToAdd.EmoticonID=0;
169
170 postToAdd.PostType = PostType.HTML;
171 postToAdd.Body =commonArt.Body;
172
173 postToAdd.PostDate=commonArt.DateAdded;
174
175 postToAdd.IsSticky = false;
176
177 //此处不是threadid,而是要回复的帖子的postid:新的主题的楼主帖的帖子编号
178 postToAdd.ParentID=newTopicArtID;
179
180 postToAdd.ForumID=0;
181
182 User user=new User();
183
184 //添加该帖子的用户
185 user.UserID=commonArt.UserAdded.UserId;
186 user.Nickname=commonArt.UserAdded.Name;
187
188
189 try
190 {
191 Posts.AddPost(postToAdd, user);
192 }
193 catch
194 {}
195 }
196 #endregion
197
198 addPermissions#region addPermissions
199 static void addPermissions(int newThemeID)
200 {
201
202
203 // Add the Everyone forum permission
204 //
205 ForumPermissions.AddForumPermission( newThemeID, 0 );
206 // 增加论坛默认角色 by venjiang 2004/12/23
207 ForumPermissions.AddForumPermission( newThemeID, 7 ); // 全局注册用户
208 ForumPermissions.AddForumPermission( newThemeID, 8 ); // 站点注册用户
209
210 // Get the forum permission just added
211 // 默认游客访问权限
212 ForumPermission permission = ForumPermissions.GetForumPermission(newThemeID, 0);
213
214
215
216 // 修订游客默认权限 by venjiang 2004/12/23
217 permission.View = AccessControlEntry.Allow;
218 permission.Read = AccessControlEntry.Allow;
219 permission.Post = AccessControlEntry.Deny;
220 permission.Reply = AccessControlEntry.Deny;
221 permission.Edit = AccessControlEntry.Deny;
222 permission.Delete = AccessControlEntry.Deny;
223 permission.Sticky = AccessControlEntry.Deny;
224 permission.Announce = AccessControlEntry.Deny;
225 permission.CreatePoll = AccessControlEntry.Deny;
226 permission.Vote = AccessControlEntry.Deny;
227 permission.Moderate = AccessControlEntry.Deny;
228 permission.Attachment = AccessControlEntry.Deny;
229
230 ForumPermissions.UpdateForumPermission( permission );
231
232 // 修订默认用户权限设置 by venjiang 2004/12/23
233 // 更新站点注册用户默认权限
234 permission = ForumPermissions.GetForumPermission(newThemeID, 7);
235 permission.View = AccessControlEntry.Allow;
236 permission.Read = AccessControlEntry.Allow;
237 permission.Post = AccessControlEntry.Allow;
238 permission.Reply = AccessControlEntry.Allow;
239 permission.Edit = AccessControlEntry.Allow;
240 permission.Delete = AccessControlEntry.Allow;
241 permission.Sticky = AccessControlEntry.Deny;
242 permission.Announce = AccessControlEntry.Deny;
243 permission.CreatePoll = AccessControlEntry.Deny;
244 permission.Vote = AccessControlEntry.Allow;
245 permission.Moderate = AccessControlEntry.Deny;
246 permission.Attachment = AccessControlEntry.Deny;
247
248 ForumPermissions.UpdateForumPermission( permission );
249
250 // 更新全局注册用户默认权限
251 permission = ForumPermissions.GetForumPermission(newThemeID, 8);
252 permission.View = AccessControlEntry.Allow;
253 permission.Read = AccessControlEntry.Allow;
254 permission.Post = AccessControlEntry.Allow;
255 permission.Reply = AccessControlEntry.Allow;
256 permission.Edit = AccessControlEntry.Allow;
257 permission.Delete = AccessControlEntry.Allow;
258 permission.Sticky = AccessControlEntry.Deny;
259 permission.Announce = AccessControlEntry.Deny;
260 permission.CreatePoll = AccessControlEntry.Deny;
261 permission.Vote = AccessControlEntry.Allow;
262 permission.Moderate = AccessControlEntry.Deny;
263 permission.Attachment = AccessControlEntry.Deny;
264
265 ForumPermissions.UpdateForumPermission( permission );
266 }
267
268 #endregion
269
270 CreateUser#region CreateUser
271 public static void CreateUser()
272 {
273 int count=0;
274 DataTable dt=SchoolDataControl.Facade.User.UserAll();
275 foreach(DataRow dr in dt.Rows)
276 {
277 User user = new User();
278 user.Username =(string) dr["Username"];
279 user.Nickname = (string)dr["Username"];
280 user.Email = (string)dr["Email"];
281 user.IPCreated = Globals.IPAddress;
282 user.DateCreated=(DateTime)dr["CreateDate"];
283 user.Password = (string)dr["UserPwd"];
284 user.AccountStatus = UserAccountStatus.Approved;
285 user.IsAnonymous = false;
286 //先修改存储过程,强制插入用户编号。完成后再修改回
287 user.UserID=(int)dr["UserID"];
288 Users.Create(user, true);
289 }
290 }
291 #endregion
292
293 }
294}
295
代码2:主站的用户注册
1public static int Insert(CmdLogic.User_Insert logic)
2 {
3 //insert into forums
4 CmdLogic.forums_User_InsertForMain fl=new UPlat.CmdLogic.forums_User_InsertForMain();
5 fl.Email=logic.Email;
6 fl.Password=logic.UserPwd;
7 fl.UserID=0;
8 fl.UserName=logic.UserName;
9
10 object[] objs2=fl.GetObjects();
11 int flat;
12 try
13 {
14 flat=(int)Common.DataBase.SqlTools.HelpBBS.ExecuteScalar(fl.GetProcName(),objs2);
15 }
16 catch(Exception e)
17 {
18 Remove(fl.UserID);
19 flat=-1;
20 }
21
22
23 if(flat==1)
24 {
25 logic.UserID=fl.UserID;
26
27 object[] objs=logic.GetObjects();
28 //insert for main
29 try
30 {
31 Common.DataBase.SqlTools.Help.ExecuteNonQuery(logic.GetProcName(),objs);
32 }
33 catch(Exception e)
34 {
35 Remove(fl.UserID);
36 flat=-1;
37 }
38
39 }
40
41 return flat;
42
43
44 }
代码3:主站使用的插入用户的存储过程
ALTER procedure forums_User_InsertForMain
(
@UserID int ,
@UserName nvarchar (64) ,
@Password nvarchar (64),
@Email nvarchar (128)
)
AS
SET NOCOUNT ON
-- 创建新用户
BEGIN
-- 检查用户名是否存在
--IF EXISTS(SELECT UserName FROM forums_Users (nolock) WHERE UserName = @UserName )
--select 2
--ELSE
-- 进一步检查Email地址是否存在
--IF EXISTS(SELECT Email FROM forums_Users (nolock) WHERE Email = @Email )
--select 3
--ELSE
--BEGIN
---- 进一步检查昵称是否存在
--IF EXISTS(SELECT NickName FROM forums_Users (nolock) WHERE NickName = @UserName AND IsAnonymous = 0)
--SELECT 6
--ELSE
--BEGIN
-- 追加新用户
INSERT INTO forums_Users
([UserID] , UserName,
NickName,
Email,
Password
)
VALUES
( @UserID, @UserName,
@UserName,
@Email,
@Password
)
IF( @@ERROR != 0 )
select -1
-- 获取创建新用户的ID
--SET @UserID = @@IDENTITY
-- 追加用户配置信息
INSERT INTO forums_UserProfile
(
[UserID] ,
[timezone]
)
VALUES
( @UserID,
0
)
IF( @@ERROR != 0 )
select -1
--增加默认用户角色
exec forums_Roles_AddUser @UserID, 7
exec forums_Roles_AddUser @UserID, 8
select 1 -- 返回成功代码
--END
--END
-- 即出存储过程
RETURN
END
代码4:主站使用的删除用户的存储过程
1ALTER proc forums_User_RemoveforMain
2@UserID int
3as
4BEGIN
5 -- 删除用户
6 BEGIN TRAN
7
8 UPDATE forums_Posts set UserID = 0 where UserID = @UserID
9
10 if( @@ERROR != 0 )
11 begin
12 rollback tran
13 select -1
14 end
15
16 delete forums_UserProfile where UserID = @UserID
17
18 if( @@ERROR != 0 )
19 begin
20 rollback tran
21 select -1
22 end
23
24 delete forums_Users where UserID = @UserID
25
26 if( @@ERROR != 0 )
27 begin
28 rollback tran
29 select -1
30 end
31 else
32 begin
33 commit tran
34 select 1
35 end
36
37END