置顶随笔
#
2008年7月22日
#
在用view控件实现一系列业务操作的分步操作时发现了一个问题,在某个View中实现了如下功能:
A控件放在其中一个View中,用控制A控件的显示和隐藏(Visible)的方法表示业务中存在A和不存在A的情况,并用来作为一个属性的字段。
切换View前读取此属性无任何问题,可当切换View后读取此属性一直为不存在,也就是A控件的Visible属性一直为False。跟踪代码也确实如此。
不知道这种情况是否.net的一个bug,可能跟asp.net的View与MultiView的实现方式有关吧,本人正在查找资料,但网上讲应用的多原理的少,无奈正准备去慢慢看View的源代码。
希望有兴趣的xdjm共同探讨。
下面我先抛砖引玉,说一下我的理解。
首先从Visible这个属性说起,我发现官方提供的web控件都继承自System.Web.UI.Control这个类,同时,Control 类的Visible这个属性是个virtual属性的方法。本人猜测当隐藏和现实一个View容器,可能通过的是改变其内所有控件Visible属性来实现的,毕竟这样对于多个同根的派生类来说实现起来很简单。
2008年4月9日
#
2008年2月27日
#
好久没来写博了,最近开始读一本新书,在这标记下。
刚刚读了没几天,给我的感觉就是这本书很对我的胃口,但由于本人英文水平有限,理解起来有些费劲。
2006年12月22日
#
最近项目中数据库操作非常频繁复杂,同事讨论是不是更改一下数据库操作类的写法,原来数据库操作类是每个方法对应一个存储过程,把复杂的逻辑判断都放到数据库中了。但是同事提出异议:存储过程非常不灵活,不能做到各种数据库通用,不利于以后项目的变化;存储过程不能做到更新操作的灵活设置更新字段的选择。在我的思想里虽然觉得他说的有些道理,但是一直不能认同,存储过程执行的高效和管理上的方便相信大家都有体会,我们也都认可,但是我实在不能理解把sql语句写到程序里比写成存储过程优越到哪里。看来真得好好思考几天。
2006年9月26日
#
今天上午建立了一个新表,由于疏忽表名后面多加了个“ ] ”,但是在企业管理器和查询分析器的对象中这个事不会显示的,双击重命名也不会被复制出来,拖动也不能显示,造成了莫名其妙的表名不匹配。好半天才发现了这个问题,在同事提醒下做了修改。
今天在sqlserver 中 一个事务中调用了一个本身带有事务的存储过程,出现了下面错误
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
经过检查发现问题主要是因为事务的嵌套引起的。被嵌套的事务里面如果出现错误处理不当是导致这个问题的主要原因。一般情况下都是用RollBack Transaction,但是在嵌套的事务中这样往往会出现错误。
在SqlServer里,嵌套事务的层次是由@@TranCount全局变量反映出来的。每一次Begin Transaction都会引起@@TranCount加1。而每一次Commit Transaction都会使@@TranCount减1,而RollBack Transaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,而使@@TranCount置0。举个例子:
Begin Transaction -- @@TranCount = 1
BeginTransaction -- @@TranCount = 2
BeginTransaction -- @@TranCount = 3
Commit Transaction -- @@TranCount = 2
Commit Transaction -- @@TranCount = 1
Commit Transaction -- @@TranCount = 0
如果出现错误ROLLBACK TRANSACTION
则:
Begin Transaction -- @@TranCount = 1
BeginTransaction -- @@TranCount = 2
BeginTransaction -- @@TranCount = 3
ROLLBACK TRANSACTION -- @@TranCount = 0
Commit Transaction -- @@TranCount = 0---出现错误
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
如果被嵌套的事务中发生错误,最简单的方法应该是无论如何都先将它提交,同时返回错误码(一个正常情况不可能出现的代码 如 -1)让上一层事务来处理这个错误,从而使@@TranCount 减1。 这样外层事务在回滚或者提交的时候能够保证外层事务在开始的时候和结束的时候保持一致。由于里层事务返回了错误码,因此外层事务(最外层)可以回滚事务,这样里面已经提交的事务也可以被回滚而不会出现错误。
在项目中应该会常常出现这样的情况,一个存储过程里面用了事务,但是不能保证它会被别的带有事务的存储过程调用,如果单独调用的话,出现错误可以直接回滚,但是如果是被别的带事务的存储过程调用的话,RollBack 就会出错了。因此需要一种机制来区分,建立一个临时的变量来区分是否嵌套,和嵌套的层数,如下:
declare @tempTranCount int
set @tempTranCount = 0
Begin Transaction
set @tempTranCount = @tempTranCount +1
…………
--事务内要执行的代码
…………
IF @@ERROR<>0
goto Error
Commit Transaction
Commit Transaction
--下面返回要返回的值0只是个例子
Return 0
Error:
IF(@@TranCount = @tempTranCount) RollBack Transaction
Else Commit Transaction
Return @Error
2006年8月10日
#
前台html 页面中进行控件html 属性的设置一般为静态的属性,当然也可以通过嵌入脚本语言代码进行一些简单的动态设置,但并不能实现复杂的逻辑也会给维护带来麻烦,我们可以使用 控件的 Attributes 属性下面的方法进行这些操作如下:
为控件增加 onclick 事件响应脚本: 控件名.Attributes.Add("onclick","响应脚本")
位控件增加 src url指向响应: 控件名.Attributes.Add("src","url字符串")
2006年5月1日
#
最近项目中需要用流向指定大小的区域输出文本内容,内容换行是需要人为控制的,查找了老多内容都不得其要,一哥们帮忙解决了 ,原来在流中需要断行处加入"\r\n"就可以了,困扰了好几天,终于解决了,回头一定好好思考总结一下这类问题。
2006年4月21日
#
前两天装了个jbuilder2005 ,但只能执行不能调试,郁闷的不行,今天早上看见有人说可能是环境变量 path 的原因,我删除后果然可以了,思考了好长时间也不得要领,没弄清楚到底是什么机制造成的。
2006年4月19日
#
以前从来没实际用java写过程序,今天在jbuilder下写了几段,按照自己的想法程序应该没什么问题,可是运行后出了好多警告(因为是警告所以开始没注意),调试通以后仔细一看原来这些警告是些代码规范的内容,象:main 方法最好写在所在类所有方法最后,方法名首字母一般大写,变量名首字母一般不大写,等等好多。改完之后发现的确比以前看着清爽多了,既然人家有了一个这么好的解决方案,我也就拿来了,以后还真要再研究一下这方面内容,使自己代码更“通用一些”。