有关帐套的问题,欢迎指点(200)

  • 主题发起人 主题发起人 dadada
  • 开始时间 开始时间
D

dadada

Unregistered / Unconfirmed
GUEST, unregistred user!
想给进销存软件加上“新建帐套”的功能,数据库是用的SQL2000目前有两种方案:1.用SQL倒出的数据库脚本来建立新帐套,但是由于我的视图有好多嵌套视图,在执行脚本时必须排好先后顺序才能顺利执行,这项工程有点浩大,而且还存在每修改了表或视图,就要更新一次脚本的弊端。2.将当前数据库强制分离,然后复制两个文件(.mdf,.ldf),然后改成新帐套名,然后附加成新帐套名。这个方案的好处是直接完成新帐套,不用处理繁琐的细节,在手工复制数据库时,我都用这个方法,因为这个新建帐套的功能是在C/S远程执行的,所以要写在SQL的存储过程,我遇到的问题是:怎样在存储过程里修改文件名呢?这个问题简单的问:就是怎样在SQL存储过程里写代码,修改硬盘上某个文件的名称?有心帮助我的朋友,请帖上这个关键环节的代码?关于帐套的方案,若还存在其它更好的解决方案,请高手进一步指点? 谢谢了!
 
参考以下帖子~~http://www.delphibbs.com/delphibbs/dispq.asp?lid=3968617
 
谢谢,我几乎参考过了有关帐套的所有历史帖子,从思路上讲,每个帐套对应一个独立的数据库,才是科学的,因为可以减轻单个帐套的负荷.我测试用SQL脚本的方法新建帐套,遇到很多障碍,难以成功...所以想通过直接复制数据库,再改名的方法,经过调试,在修改文件名的环节被卡住了...存储过程里写代码,修改硬盘上的某个文件的名称,谁有类似的代码? 请帮忙找找呀各位
 
我的解决方案:1.首先要有一个帐套模板数据库.(此模板是一个空的数据库备份,你可以用脚本产生一个数据库然后生成该备份)2.在主数据库里(既然有帐套数据库,就有一个主数据库),建一个表,用以存放新建帐套数据库文件的路径,即你新建的帐套数据库的文件要存放在哪里.为了省事,你的帐套模板也放在该目录下.3.程序里面加一个新建帐套的功能,以下是关键代码://取得模板存放路径 sDBPath := GetUpdatePath('DBPATH'); if sDBPath[Length(sDBPath)] <> '/' then sDBPath := sDBPath + '/';//创建新的帐套数据库 sSql := 'USE master ' + 'RESTORE FILELISTONLY FROM DISK = ''' + sDBPath + 'DBModel.bak'' ' //DBModel.bak即为帐套模板 + 'RESTORE DATABASE ' + LegNum_edt.Text + ' FROM DISK = ''' + sDBPath + 'DBModel.bak'' '//LegNum_edt.Text 为新建数据库的名称 + 'WITH MOVE ''DBModel_Data'' TO ''' + sDBPath + '' + LegNum_edt.Text + '_Data.mdf'',' //新建数据库的数据文件 + 'MOVE ''DBModel_Log'' TO ''' + sDBPath + '' + LegNum_edt.Text + '_Log.ldf'''; //新建数据库的日志文件//执行SQL语句 iRet := MID_SERVER.ExecSingleSQL(sSql, sError);
 
感谢wcq1002!使用模板库的备份文件,再还原,在还原时指定新的数据名称,这种方案我已经实现过,但是最终结果是:只是数据库的名称变了,而对应的两个文件的名称变不了,这样的话没有实用价值,所以我放弃了...另外,我是C/S模式,从客户端发出新建帐套的命令,结果要求是在服务器生成一个新库,物理文件名和数据库名都要求是新的...新建的帐套与原来的帐套都要附加上,要同时在线.希望wcq1002能进一步指点?
 
楼主,你有没有试过先?我的ERP软件都是采用这种方案. 都运行几年.用户自己随便建帐套.老大,物理文件名和数据库名都是新的,只是逻辑名相同而已,根本不影响.你把那段代码在数据库里面执行下就知道了.代码里面已经写的很清楚了,物理文件名是你自己随便命名的,如果物理文件名都相同,在同一目录下还能创建成功?
 
+ 'WITH MOVE ''DBModel_Data'' TO ''' + sDBPath + '' + LegNum_edt.Text + '_Data.mdf'',' //新建数据库的数据文件 + 'MOVE ''DBModel_Log'' TO ''' + sDBPath + '' + LegNum_edt.Text + '_Log.ldf'''; //新建数据库的日志文件这就是产生的新的物理文件名, 自己在sDBPath 指定的目录下看看就知道了.
 
我看你是把逻辑名看成是物理名称了吧,
 
说得对,不过我调试的结果是:代码正常执行了,但没有结果出来?不是怪你哈,是我经验不够,我还在调试中,稍后再来报告结果...
 
请帮我看看: 为了简化我先弄成固定路径了,执行的结果是提示成功,但是没有得到新文件?我转换的代码如下: (ADOQuery1 指向的: master)procedure TForm1.Button2Click(Sender: TObject);var sSql:string;beginsSql := 'USE master ' + 'RESTORE FILELISTONLY FROM DISK = ''F:/QS1_001.bak'' ' //DBModel.bak即为帐套模板 + 'RESTORE DATABASE web3 FROM DISK = ''F:/QS1_001.bak'' '//LegNum_edt.Text 为新建数据库的名称 + 'WITH MOVE ''qs1.mdf'' TO ''F:/web3_Data.mdf'',' //新建数据库的数据文件 + 'MOVE ''qs1_Log.ldf'' TO ''F:/web3_Log.ldf'''; //新建数据库的日志文件 //iRet := MID_SERVER.ExecSingleSQL(sSql, sError); with ADOQuery1 do begin close; sql.clear; sql.add(sSql); execsql; close; end; showmessage('成功');end;
 
这回求菩萨都不如求wcq1002了,如果方便的话请您将一部分片段发到我邮箱:9278625@qq.com 我需要转换成SQL的存储过程来执行这个建立帐套的功能.转换成功我会帖上来,拜谢高手!
 
你把此SQL语句在数据库里面执行一下,老大.我的程序运行了这么久都没有问题.(请确认你的备份文件 QS1_001.bak 放对目录了)
 
放在查询分析器里执行,报错:服务器: 消息 3234,级别 16,状态 2,行 3逻辑文件 'qs1.mdf' 不是数据库 'web3' 的一部分。请使用 RESTORE FILELISTONLY 来列出逻辑文件名。服务器: 消息 3013,级别 16,状态 1,行 3RESTORE DATABASE 操作异常终止。
 
哎,我来试下.成功了把SQL语句发给你.
 
终于遇到热心的高手了! 如果用你的方法解决了这种问题,就太好了,之前用SQL脚本来做,工作量太大了.
 
麻烦你,把你语句中的 web3 改成qs1, 老大.
 
执行成功,语句如下:(老大,我怀疑你都没有仔细看我给你的代码)USE master RESTORE FILELISTONLY FROM DISK = 'F:/ERP_DB_GB/DBModel.bak' RESTORE DATABASE DD FROM DISK = 'F:/ERP_DB_GB/DBModel.bak' WITH MOVE 'DBModel_Data' TO 'F:/ERP_DB_GB/DD_Data.mdf',MOVE 'DBModel_Log' TO 'F:/ERP_DB_GB/DD_Log.ldf'自己去分解一下,(DD是新建的帐套数据库)
 
我现在已经完全按照你写的,来转换的,如下:USE master RESTORE FILELISTONLY FROM DISK = 'D:/PUBDATE/QS/QS1_001.bak' RESTORE DATABASE DD FROM DISK ='D:/PUBDATE/QS/QS1_001.bak' WITH MOVE 'QS1.mdf' TO 'D:/PUBDATE/QS/DD_Data.mdf',MOVE 'QS1_log.LDF' TO 'D:/PUBDATE/QS/DD_Log.ldf'请帮我看看代码有没有错? 为什么我还是执行不成功,郁闷得很.
 
离成功就差一步了吗? 可能还有其它环境的东西,我没有做到吗? 我是拷贝到查询分析器里执行的...执行之前,先分离了QS1报告说:无法打开备份设备 'D:/PUBDATE/QS/QS1_001.bak'。设备出现错误或设备脱机。
 
我也在F盘按你一模一样建立了一个数据库,再调试就成功了!感谢wcq1002! !个人原因我也要慢慢查找,你的高超技巧我也要慢慢消化! 总之谢谢你了!
 
后退
顶部