dvbbs7.1.0从ACCESS迁移到SQL Server的一点经验

来源:互联网 发布:unityloader.js php 编辑:程序博客网 时间:2024/05/17 05:58

前几天,人很无聊,在同学的建议下用动网建了一个论坛,没想到访问人数一增加就不能进去,刷新也没有用,很郁闷。后来,自己找了下原因,发现是数据库的原因,动网免费版用的是ACCESS作为数据库,最多只能支持5个人同时访问(据说,虽然夸张了点,不过的确支持的访问人数比SQL Server少),多了就卡了~。于是决定将数据库升级成为SQL Server,经过一天一夜的奋战,历尽千辛万苦,终于成功解决了问题。

下面是我在升级过程中的几个问题。

问题1、如何在XP上装上SQL Server 2000的服务器端?

一开始,我直接点击光盘根目录下的autorun.exe,根据提示安装,结果自检过程中知道系统不是SERVER版,提示只安装客户端工具。很郁闷,后来就找啊找,终于找到了解决门道。

解决方法:
装上一个补丁:下载地址如下:
http://download.microsoft.com/download/d/d/e/dde427eb-0296-4eac-a47c-d11a66b03816/chs_sql2ksp3.exe
装上后就可以安装了。

以上地址我不知道能否再用,不过我用的是SQL2000.MSDE-KB884525-SP4-x86-CHS.EXE,一般下载都应该有的吧(我是下载时候自带的,用GOOGLE或BAIDU搜索下)。

因为你的是企业版本的
XP系统下也可以安装 企业版本

安装办法如下:

一.在SQL服务器的安装盘中找到MSDE这个目录,并且点击setup.exe安装它,过程简单直接下一步就OK了。(这个是服务端,按正常方法会提示系统不支持)

二. 重启系统WINDOWSXP,这下就可以看到SQL服务的图标出现了。(服务器图表没出现也可先安装客户端在安装服务端)

三. 再拿出SQL服务器版的安装光盘,直接安装客户端工具(这个不要多说吧?最简单的方法就是直接点击光盘根目录下的autorun.exe)

根据提示安装,自检过程中知道系统不是SERVER版,会提示只安装客户端工具。(哈哈,服务端我已有了)

四. 打开企业管理器,试用SA用户连一下看看,是不是发现SA用户登陆失败?因为你还没有与信任SQL SERVER连接相关联。还好这个只要对系统注册表稍加修改就可以啦:

在运行中输入regedit打开注册表编辑器,找到[HKEY_LOCAL_MACHINE/SOFTWARE/MICROSOFT/MSSQLSERVER/MSSQLSERVER],这个项里面

有一个键值LoginMode,默认下,值是1,现在将值改为0,重启电脑。

五. 再打开企业管理,再连接试试,是不是OK了!

 

装好了SQL Server 2000,我们就可以开始迁移了。

以下是具体步骤:

1、必须先安装Microsoft Office Access 2003,和SQL Server2000。

2、把旧的动网数据库备份,备份完成后,

3、(如果你原来就是2002-2003格式格式,就没有必要执行这一步,跳过)用Access 2003打开动网旧数据库,在打开时会出现一个警告,不要理会它(安全警告),按打开键,打开后按工具栏——数据库实用工具——转换数据库——转换为2002-2003格式,把数据库转换成2003格式。

 

3、转换完成后再用Access 2003打开,打开后按工具栏——数据库实用工具——升迁向导——新建数据库——填写SQL数据库登陆名称、密码和要新建的动网数据库(准备转成新的动网数据库),按下一步,按“ 》”键,再按下一步,选取所有选项,再按下一步,选择“不对应用程序作任何改动”,再按完成。

4、打开SQL企业管理器——数据库---选中相应的数据库---右键所有任务-----生成SQL脚本——常规——全部显示——编写全部对象脚本——确定(记住存放的位置)。

5、用记事本打开刚才生成的SQL脚本,在编辑栏——替换——查找内容为“smalldatetime”替换为“datetime”——替换全部;完成后再在编辑栏——替换——查找内容为“nvarchar”替换为“varchar”——替换全部,完成后保存退出。
6、打开SQL企业管理器——数据库——点击这个数据库一下新建的动网数据库,然后在工具栏——SQL查询分析器——文件——打开——“刚才生成的SQL脚本”——查询——执行,然后关闭窗口。

(有的朋友说,用sql版自带的sql脚本也可以,大家不妨试试看)

7、再回到SQL企业管理器——数据库——点击这个数据库一下新建的动网数据库,然后打开工具栏——数据库转换服务——导入数据——下一步——数据源“Microsoft Access”文件名“为旧的动网数据库”——下一步——再下一步——从源数据复制表和视图——下一步——全选——下一步——立即运行——下一步——完成。

8、修改动网文件夹两个文件conn.asp。(根据文件提示操作)

+++++++++++++++++++++++++++++++

以上为网络上使用的方法,以下为自己升级的过程。

前2步相同。

3、创建一个数据库,为论坛将要使用的数据库;新建一个用户角色,对该数据库有完全控制权限;

4、打开动网提供的SQL语句,选取其中创建存储过程的那部分,在CREATE***[表名]这部分的[表名],改为[数据库使用者].[表名]。运行,使创建对应的存储过程。

5、再回到SQL企业管理器——数据库——点击这个数据库一下新建的动网数据库,然后打开工具栏——数据库转换服务——导入数据——下一步——数据源“Microsoft Access”文件名“为旧的动网数据库”——下一步——再下一步——从源数据复制表和视图——下一步——全选——下一步——立即运行——下一步——完成。

6、修改动网文件夹两个文件conn.asp和inc/const.asp

Conn.asp文件修改如下:
Const IsSqlDataBase = 1
SqlDatabaseName = "MYBBS"
SqlPassword = "sa"
SqlUsername = "sa"
SqlLocalName = "MYSERVER"

Const.asp文件修改如下:
Const IsBuss=0

 

PS:BBS数据库ACCESS转换SQL版本
1. 步聚一:
a. CONN.ASP文件à第15行àConst IsSqlDataBase = 1此处设为1为SQL数据库,当为0时为ACCESS数据库
b. CONN.ASP文件à第22行à Const SqlDatabaseName = "数据库名称"
c. CONN.ASP文件à第23行à Const SqlPassword= "数据库密码"
d. CONN.ASP文件à第24行à Const SqlUsername= "数据库用户名"
e. CONN.ASP文件à第25行à Const SqlLocalName = "服务器名称"
f. CONN.ASP文件à第62行à Const SqlDatabaseName = "数据库名称"
g. CONN.ASP文件à第63行à Const SqlPassword = "数据库密码"
h. CONN.ASP文件à第64行à Const SqlUsername = "数据库用户名"
i. CONN.ASP文件à第65行à Const SqlLocalName = "服务器名称"
2. 步聚二:
      注意:Conn.ASP文件的27行设SqlNowString = "GetDate()" ,此函数为SQL中的函数!
3. 步聚三:
a. 打开BBS目录下的INC文件夹,找到Dv_ClsMain.asp文件à第13行àConst IsBuss=0此处设为0,如果是ACCESS设为1,否则显示不正常,注意: 此处非常重要!
4. 步聚四:
       把ACCESS里的数据表结构导到SQL中,注意根据ACCESS原有的表一一对应所有的表结构! 并设主键!找到相对应

8、最后补充:
(1)由于SQL2000里面没有"自动编号",所以你的以"自动编号"设置的字段都会变成非空的字段,这就必须手工修改这些字段,并把他的"标示"选择"是",种子为"1",增量为"1",
(2)另外,ACCESS2000转换成SQL2000后,原来属性为"是/否"的字段将被转换成非空的"bit",这时候你必须修改成自己想要的属性了;
(3)另外,大家要注意对时间函数的把握.ACCESS与SQL是有很多不同的.
根据以上3点,再回到SQL企业管理器——数据库——点击这个数据库下新建的动网数据库,将所有表的字段属性根据以上3点进行修改

 


补充说明:


自动增加字段需要重写。在access中经常使用的自动编号字段,导入到mssql后,他并不是自增型的int,需要手工设置,把导入后的自动编号字段的标识的“否”改为“是”,“种子”和“递增量”都为“1”,才能成为自动编号

所有的默认值都丢失了。主要是数字类型和日期类型

所有now(),time(),date()要改成getdate()

所有datediff('d', time1, time2)要改成datediff(day, time1, time2)

所有datediff('ww', time1, time2)要改成datediff(week, time1, time2)

所有datediff('d', time1, time2)要改成datediff(day, time1, time2)

在mssql server中,有许多保留字,在access中是没有的,当你把数据导入到mssql的时候,问题就出来了。mssql在导入的时候,会自动给这些字段(包括数据库中的表名)加上“[字段名]”,因此,你必须修改你的脚本,把相应的字段名字(或者表名字)加上中括号,或改变字段名字为不是mssql的保留字

在用access关于时间的使用,大家喜欢使用“select * from aaaa while time="&now()”这样的sql语句,然而,在mssql中没有“now()”这个函数,而是使用“getdate()”,所以,所有的sql语句中的“now()”必须换成“getdate()”。

日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对
SQL SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。

转化时,跟日期有关的字段,SQL SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。有时用smalldatetime型时,转化失败,而用datetime型时,转化成功

isnull(rowname)要改成rowname = null

CursorType要改成1,也就是打开数据库时要给出第一个数字参数为1,否则记录可能
显示不完整

备注类型要通过cast(column as varchar)来使用

true/false类型不能使用,要变为1/0

对此两种数据库进行操作的sql语句不全相同,例如:在对ACCESS数据库进行删除纪录时用:"delete * from user where id=10",而对SQL SERVER数据库进行删除是用:"delete user where id=10".

在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQL SERVER数据库处理中,却不能用

在access的sql语句中的时间使用变量查询的时候,大家一般使用"select * from aaaa while time=#"&变量名&"#",在mssql中是不行的,他的语法是“select * from aaaa while time='"&变量名&"'"”。(意思是让你把日期时间变量当成字符串来使用,呵呵~~~)

原来ASP里的“DELETE * FROM ……”要改为“DELETE FROM ……”

有可能rs.update失败,修改成update 表名 set 字段=‘值’ 这样通过(遇到的情况,提示为:
Microsoft OLE DB Provider for SQL Server 错误 '80040e38'

乐观并发检查失败。已在此游标之外修改了该行。

/Admin_ClassOrder.asp,行 164 )

access里面除法可以使用"/"或者"/",MSSQL里面只能使用"/"

+++++++++++++++++++++++++++++++++++++++

安装完成,到后台更新缓存,即可使用。

下面是我更新后碰到的一个问题:

问题2、DVBBS未能找到存储过程 'dv_list'的问题解决办法

解决方法:

打开SQL Server Entreprise Manager,点击你迁移好后的动网数据库,在子节点中找到存储过程,右键——新建存储过程——在文本中输入以下代码——保存关闭就OK了。

 

代码:

CREATE       PROCEDURE       [dv_list]   
    
      @boardid       int=1,   
      @pagenow       int=1, --当前页数                             
      @pagesize       int=1, --定义每页面帖子数目   
      @tl       int=0, --按时间段查询   
      @topicmode       int=0, --专题   
      @totalrec       int       output   
    
    
        AS   
      set       nocount       on   
      declare       @int_topnum       int   
      declare       @int_timenum       int   
      declare       @var_times       varchar(5000)   
    
      if       @pagenow>1   
      if       @topicmode>0   
      begin   
      select       @int_timenum=(@pagenow-1)*@pagesize   
      set       rowcount       @int_timenum   
      select       @var_times=lastposttime       from       Dv_Topic       where   boardID=@boardID       and       istop       =       0       and   mode=@topicmode       ORDER       BY       lastposttime       desc   
    
      set       rowcount       @pagesize   
      select       TopicID,boardid,title,postusername,postuserid,dateandtime,child,hits,votetotal,lastpost,lastposttime,istop,isvote,isbest,locktopic,Expression,TopicMode,Mode       from       dv_topic       where   boardID=@boardID       and       istop       =       0       and   mode=@topicmode       and       lastposttime       <       @var_times       ORDER       BY       lastposttime       desc   
    
      set       nocount       off   
      return   
      end   
      else   
      begin   
      select       @int_timenum=(@pagenow-1)*@pagesize   
      set       rowcount       @int_timenum   
      select       @var_times=lastposttime       from       Dv_Topic       where   boardID=@boardID       and       istop       =       0       ORDER       BY       lastposttime       desc   
    
      set       rowcount       @pagesize   
      select       TopicID,boardid,title,postusername,postuserid,dateandtime,child,hits,votetotal,lastpost,lastposttime,istop,isvote,isbest,locktopic,Expression,TopicMode,Mode       from       dv_topic       where   boardID=@boardID       and       istop       =       0       and       lastposttime       <       @var_times       ORDER       BY       lastposttime       desc   
    
      set       nocount       off   
      return   
      end   
    
      else   
      if       @topicmode>0   
      begin   
      set       rowcount       @pagesize   
      select       TopicID,boardid,title,postusername,postuserid,dateandtime,child,hits,votetotal,lastpost,lastposttime,istop,isvote,isbest,locktopic,Expression,TopicMode,Mode       from       Dv_topic       where   boardID=@boardid       and       istop       =       0       and   mode=@topicmode       ORDER       BY       lastposttime       desc   
      end   
      else   
      begin   
      set       rowcount       @pagesize   
      select       TopicID,boardid,title,postusername,postuserid,dateandtime,child,hits,votetotal,lastpost,lastposttime,istop,isvote,isbest,locktopic,Expression,TopicMode,Mode       from       Dv_topic       where   boardID=@boardid       and       istop       =       0       ORDER       BY       lastposttime       desc   
      end

 

以上是我的一些小小的经验,希望对大家有用。在迁移过程中,还参考了http://blog.iyi.cn/user/david/archives/2005/03/266.html。

 

原创粉丝点击