以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  升级时的问题  (http://www.foxtable.com/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 \'用于关闭左上方的大按钮


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("编辑者")  \'移除编辑者列,避免用户直接修改此列

[此贴子已经被作者于2015/3/25 15:36:17编辑过]