导入数据到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:导入数据的程序
using System;2
using System.Data;3
using AspNetForums;4
using AspNetForums.Controls;5
using AspNetForums.Components;6
using AspNetForums.Enumerations;7

8
namespace AspNetForums9
{10
/// <summary>11
/// ForumConver 的摘要说明。12
/// </summary>13
public class ForumConver14
{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
CreateForum87

88
addForumGroup97

98
addForum 112

113
addThread151

152
addPost197

198
addPermissions269

270
CreateUser292
293
}294
}295

代码2:主站的用户注册
public static int Insert(CmdLogic.User_Insert logic)2
{3
//insert into forums4
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
try13
{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 main29
try30
{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:主站使用的删除用户的存储过程
ALTER proc forums_User_RemoveforMain2
@UserID int3
as4
BEGIN5
-- 删除用户6
BEGIN TRAN7
8
UPDATE forums_Posts set UserID = 0 where UserID = @UserID9
10
if( @@ERROR != 0 )11
begin12
rollback tran13
select -114
end15
16
delete forums_UserProfile where UserID = @UserID17
18
if( @@ERROR != 0 )19
begin20
rollback tran21
select -122
end23
24
delete forums_Users where UserID = @UserID25
26
if( @@ERROR != 0 )27
begin28
rollback tran29
select -130
end31
else32
begin33
commit tran34
select 135
end36

37
END


浙公网安备 33010602011771号