80
最 新 评 论
80
专 题 分 类
80
最 新 日 志
80
最 新 留 言
80
搜 索
用 户 登 录
友 情 连 接
我 的 好 友
80
博 客 信 息
80


IIS OBLOG数据库迁移 | 2008/10/11 12:19:00
access转sql的第一步是数据库的转换。
在这方面我没什么好办法,比如我从来没写过sql脚本,只用最简单的办法:直接导入。
首先确定您已安装了sql2000,最后打上sp4补丁。
开始-程序-microsoft sql server-企业管理器。
(注意,如果您是2003操作系统,可能在安装完sql2000之后要重新启动操作系统,否则sql server 服务器可能尚未启动。)
依次点开树形菜单,进入数据库,这时您可能看到系统内建的几个数据库,如master、model等。
右键单击数据库,选择新建数据库,在弹出的窗体中为您的数据库取个名字,如myoblog,当然,您可以用更麻烦一点的名字。除了数据库名字,其余各项均用默认值即可。点击确定,一个新的数据库就建立起来了。点开看看,会发现里面有些数据表,不要理它们,就当他们不存在好了。
右键点击您刚刚创建的数据库,选择所有任务-导入数据,会弹出一个窗体,点击下一步继续进行。接下来的窗体您必须选择一个数据源,既然是access转sql,数据源当然要选择micosoft access,接下来需要选择的是数据库源文件。可能您要为这个数据库建立一个用户名和密码,当然也可以不建立,直接用超级用户sa登录数据库。当选择完毕后,点击下一步。
此时弹出的窗体是目地数据库,也就是说您要把刚才选择的access数据库导入到哪里。毫无疑问,这里要选择您刚刚创建的数据库。如果您是完全按照上面的步骤操作,应该什么都不需要改动,直接点下一步即可。否则可能只需要改动一下数据库。
点击下一步,您可以从视图上直观的看到是从access转换成sql,选择从源数据库中复制表和视图,点击下一步即可。
选择您要复制的表。建议您直接点击全选,然后点击下一步。oblog官方不可能在access库里加入与程序无关的表。
好了,应该设置的都已经设置好了,这时候您只要选中立即运行,然后再点击下一步、完成,就可以看到导入工作正在进行了。
等系统提示您N个表已经复制完成,点击完成,数据库的转换工作已经完成第一步了。

这时候您只要点开您新建立的数据库,点击表,就可以看到数据库里已经有了您需要的各个表。但到这只是数据库转换的第一步,还有大量的工作等着您做,如默认值、标识字段等。
接下来您需要点开access数据库,您可以看到access数据库中的表与sql库中的表一一对应(除了系统内建的表),这时候需要您有足够的耐心了:对照着access表修改sql中各表的标识字段、默认值。
注意:每个表都要改,每个字段都要查看是否有默认值,对于有默认值的,在sql表中一定要填写。对于日期函数,可能有些麻烦,access中默认值为now()的,在sql中则要写成getdate(),还有就是access的日期表转过来可能是smalldatetime,您最好将其改成datetime。
还有一句不曾提到,既然是定位给比我还菜的人看,下面这句话也有必要说一下:对照修改的方式是在access库中右键单击表,点设计视图;sql库中是右键单击对应表,点设计表。

您已经改完了吗?这一步非常重要,直接关系到转换能否成功,如果没有足够的细心和耐心,您以前的工作可能就白做了。当然了,这一步有简单的解决办法,只是我不知道罢了,而且也懒得去想。据说是加一条什么命令就能完成,有兴趣的朋友可以去google一下,或百度一下。
闲话不说,继续工作。
这时您需要的就是改动程序了。既然改变了数据库,自然要改变数据库连接了。
打开conn.asp
看到里面的中文注释了吗?对,就是这么简单,您只需要改动一个数字而已。
'数据库类型:0-Access,1-Sql Server
Const Is_Sqldata=1
接下来还需要在这个文件里做一点小小的改动:数据库连接。
  'Sql数据库连接参数:连接名(本地用local,外地用IP)$数据库名$用户名$用户密码
  Dim Sql_DBServer,Sql_DBName,Sql_User,Sql_Password
  Sql_DBServer = "(local)"
  Sql_DB>  Sql_User = "sa"
  Sql_Password = "password"
在转换数据库时,有一步需要填写用户名密码的,如果您填写了,sa要换成您的用户名,password要换成您设置的密码,如果您没填写,则只需要把password写成您的超级用户密码即可,也就是安装sql数据库时设置的密码。sql_dbname是您刚才创建的数据库名字。确认您填写无误,保存修改即可。

此时,您已经完成了access转sql的大部分工作,不信吗?不由您不信,oblog就是这样的大公无私,您可以打开页面看一下,是不是已经能正常运行了?如果不能,可能是您的某一步没有做对,这时您就需要根据经验修正bug了。

但是如果真的这样简单,我也就没必要说这么多废话了,还有一些小问题需要修正。比如此时您进后台可能无法管理日志、无法更新全站等等问题。

在这里我只把几处我能想到的写出来,其余的只能靠您自己摸索着解决了。转换完成之后,您必需测试,要在iis里打开向客户端发送详细错误脚本,这样您能直观的看到错误出在哪个文件,甚至是第几行,这样在揪错时会有极大的帮助。

其实您的主要修改是在inc文件夹里,这里涉及到一些系统参数,也就是因为它的重要性,您在修改时要做好备份工作。


进入后台,您去更新一下页面,会发现有错误提示,说未找到项目……我们看一下相关的文件,找到相关内容,如下:cmd("@logdate") = logdate
这里我没找到更好的解决办法,但完全可以用另一句话来替换这段内容:
   Dim cmd, rs
   Set cmd = Server.Createo bject("ADODB.Command")
   Set cmd.ActiveConnection = conn
   cmd.CommandText = "ob_calendar"
   cmd.CommandType = 4
   cmd("@logdate") = logdate
   cmd("@userid") = user_id
   Set rs = cmd.Execute
   Set cmd = Nothing
替换为:
sql = "Select addtime,logfile from oBlog_log Where datediff(n,addtime,getdate())>0 and userid=" & user_id
Set rs = oblog.Execute(sql)
这一处解决了生成静态页面出错的问题。


既然是博客,当然要为用户服务,我们进用户后台看看。您会发现日志管理、评论管理、留言管理等都出错,错误内容:参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。
接下来的内容是某个文件的第几行……打开对应文件,找到错误行:
rs.AbsolutePage = lPage
读整段代码,确定功能,然后找原因,测试过程我就不复述了,最后找到问题所在是发现lAll=INT(rs.recordcount)这一段上,您可以在这一行下加入代码response.write lall试一下,发现在错误页面的第一行写着-1,也就是说rs.recordcount的遍历过程有问题。解决的办法有很多,不过我认为最简单的一种是把数据库打开方式改一下,也就是说把:
rs.open sql, conn, 1, 3
改成:
rs.open sql, conn, 3, 1

至于评论、留言等处,修改方法与此处完全一样,不再累述。


能正常看日志了,再试一下发布日志,您会发现发布日志时也会出错,出错在ajaxserver.asp里,后面连着的是347
我们去347行看看,发现只有一句:rs.addnew
添加新记录也会有错吗?当然不会,那我们就又要读与它们关的这段代码了。既然要添加,就一定要打开数据库,看一下相关sql语句:
rs.open "select top 1 * from oblog_log", conn, 2, 2
在我这儿看来,这次错误提示是乱码,也就是看不到究竟错在哪,当然也找不到解决办法,不过可以一一尝试,比如改变打开方式、改写语句等等。
这里我用的办法是把select top 1 * from oblog_log改成select * from oblog_log
结果把问题解决了,至于原理,我暂时还说不明白:(


再去看看回复。如果没有意外,您一定会看到的一句话是:当前记录集不支持更新。这可能是提供程序的限制,也可能是选定锁定类型的限制。问题出在savecomment.asp,行77,我们去找相关代码:rs.addnew
咦?好像和上一个一样哦!其实是的,一样的错误现象,我们是不是仍然可以用去掉top 1来解决问题?答案是肯定的。去掉top 1发现问题得到解决……
在接下来的测试中,您将遇到多处这样的问题,如留言、短消息、后台添加日志分类等,解决方式是相同的。测试过程是痛苦的,问题被逐一解决又是快乐的,有没有决心做下去,就看您的毅力了:)

好了,就说这么多,改完这些似乎就没有什么大问题了,在3.13的修改中,似乎还有一处是这样的:if rs.recordcount=0 then.............
此处出错,原因也是rs.recordcount的返回值为-1,导致出错,后来用if rs.eof then代替这句解决了问题,好像在4.0中没有了吧……说这句的意思是说如果遇到实在无法解决的问题,不妨换个思路:)某次帮别人改代码,要求要有明确的用户权限,当然,这些用户账号是由他分配的。我是菜鸟,想到权限问题就头疼,后来去WC时忽然想到既然由他分配账号,当然可以从账号上做手脚。于是思路是这样的:如果用户名的前两个是xy,那么他能操作什么,如果前两位是ab,那么他能操作什么,如果…………
也就是if left(username,2)="xy" then………………
阅读全文 | 回复(0) | 引用通告 | 编辑 | By: 皮皮爸爸

发表评论:

    大名:
    密码: (游客无须输入密码)
    主页:
    标题:
    80
Powered by Oblog.