基本思路
目的:使用可以自己控制且功能强大的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:导入数据的程序
1
using System;
2
using System.Data;
3
using AspNetForums;
4
using AspNetForums.Controls;
5
using AspNetForums.Components;
6
using AspNetForums.Enumerations;
7
8
namespace 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![]()