以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 升级时的问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=65893) |
-- 作者:zeta_123 -- 发布时间:2015/3/25 9:54:00 -- 升级时的问题 各位老师:我用的SQL数据库,建了两个,一个做测试升级用,一个是正式客户端用的。之前都没问题,在测试里做好了,改一下数据库链接字符串就好了(过去只有代码改动,表结构并没有改动)。但这次在测试版数据库里更改了表结构(删除列或增加列),之后我相应的在正式版数据库里也增加或删除了相应列,但是在客户端运行时,提示我,找不到该表中的某个列,后来我又把提示少的这个列给增加到数据库(之前改列名了),然后才提示我:升级成功,请重新打开程序。之后一切正常,新做的功能也都加上了。 下面是afteropenprojiect 中的代码,红色部分“纪要概述”过去叫做“纪要内容” ,提示的错误信息就是:会议纪要表中不存在“会议内容“列,但是在正式版数据库中是有的。 For Each t As RibbonMenu.Tab In RibbonTabs t.Visible =False Next basemainform.controls("c1ribbon1").visible = False TableCaptionVisible = not TableCaptionVisible ApplicationMenu.visible= False \'用于关闭左上方的大按钮
DataTables("多任务临时表").DataCols.Add("状态", Gettype(String))\'在多任务临时表增加临时列 With Tables("会议纪要表") \'关闭列窗口 .Cols("纪要概述").CloseWindow() End With
DataTables("任务表").ReplaceFor("编辑者",Nothing,"编辑者 = \'" & _name & "\'") DataTables("任务表").Save() Tables("任务表").Cols.Remove("编辑者") \'移除编辑者列,避免用户直接修改此列
\'解锁非正常退出时被锁定的编辑者记录(独占式) DataTables("多任务临时表").ReplaceFor("编辑者",Nothing,"编辑者 = \'" & _name & "\'") DataTables("多任务临时表").Save() Tables("多任务临时表").Cols.Remove("编辑者") \'移除编辑者列,避免用户直接修改此列
\'解锁非正常退出时被锁定的编辑者记录(独占式) DataTables("会议纪要表").ReplaceFor("编辑者",Nothing,"编辑者 = \'" & _name & "\'") DataTables("会议纪要表").Save() Tables("会议纪要表").Cols.Remove("编辑者") \'移除编辑者列,避免用户直接修改此列
If Syscmd.Project.Update(False,False) = False Then \'如果没有升级 Forms("用户登录").Open() End If [此贴子已经被作者于2015/3/25 9:54:12编辑过]
|
-- 作者:有点甜 -- 发布时间:2015/3/25 10:12:00 -- 1、你的更新代码写在之前还是之后?必须写在前面
2、理一下顺序:你客户端打开的时候,会先执行你afteropenproject的代码,这个时候,它并没有知道数据表发生了变化,自然会报错,然后下面的代码不再执行 [此贴子已经被作者于2015/3/25 10:12:04编辑过]
|
-- 作者:zeta_123 -- 发布时间:2015/3/25 15:08:00 -- 我在项目属性里设置了在线升级路径,项目发布日期,没有写其他更新代码,老师的意思是我把后三句代码提的前三行吗? |
-- 作者:有点甜 -- 发布时间:2015/3/25 15:09:00 -- 以下是引用zeta_123在2015/3/25 15:08:00的发言:
我在项目属性里设置了在线升级路径,项目发布日期,没有写其他更新代码,老师的意思是我把后三句代码提的前三行吗?
差不多就是这个意思。 |
-- 作者:zeta_123 -- 发布时间:2015/3/25 15:19:00 -- 我上午试了,把后三句代码加到最上面,还是那个情况,除非我把那一列字段在数据库里再加上,不报错。问题是以后还会再有其他改动啊 |
-- 作者:Bin -- 发布时间:2015/3/25 15:21:00 -- 没有办法,因为表加载发生在ALterOpenProject事件之前. 此时还没更新,加载表发现数据库这列没有了.就肯定会报错. 你升级只能增加列,不能减少列, 实在要减少列, 要确保所有客户端都完全升级了.此时再删除多余的列.
|
-- 作者:zeta_123 -- 发布时间:2015/3/25 15:28:00 -- 我明白bin说的了,其实我并没有删除那个列,我给他把列名给改了而已,是不是即便这样,也跟bin说的原理是一样的? |
-- 作者:Bin -- 发布时间:2015/3/25 15:29:00 -- 没错. |
-- 作者:Bin -- 发布时间:2015/3/25 15:30:00 -- 除非你使用的是动态加载表的方式,一开始不加载这些表,那就可以随意修改删除. |
-- 作者:狐狸爸爸 -- 发布时间:2015/3/25 15:33:00 -- 以下是引用zeta_123在2015/3/25 15:19:00的发言:
我上午试了,把后三句代码加到最上面,还是那个情况,除非我把那一列字段在数据库里再加上,不报错。问题是以后还会再有其他改动啊
升级成功后Return,不要执行后续代码,这样就不会报错了:
If Syscmd.Project.Update(False,False) = False Then \'如果没有升级 Forms("用户登录").Open() Else return End If
For Each t As RibbonMenu.Tab In RibbonTabs t.Visible =False Next basemainform.controls("c1ribbon1").visible = False TableCaptionVisible = not TableCaptionVisible ApplicationMenu.visible= False \'用于关闭左上方的大按钮
.Cols("纪要概述").CloseWindow() End With
DataTables("任务表").ReplaceFor("编辑者",Nothing,"编辑者 = \'" & _name & "\'") DataTables("任务表").Save() Tables("任务表").Cols.Remove("编辑者") \'移除编辑者列,避免用户直接修改此列
\'解锁非正常退出时被锁定的编辑者记录(独占式) DataTables("多任务临时表").ReplaceFor("编辑者",Nothing,"编辑者 = \'" & _name & "\'") DataTables("多任务临时表").Save() Tables("多任务临时表").Cols.Remove("编辑者") \'移除编辑者列,避免用户直接修改此列
DataTables("会议纪要表").ReplaceFor("编辑者",Nothing,"编辑者 = \'" & _name & "\'") DataTables("会议纪要表").Save() Tables("会议纪要表").Cols.Remove("编辑者") \'移除编辑者列,避免用户直接修改此列 [此贴子已经被作者于2015/3/25 15:36:17编辑过]
|