关于C# OracleClient连接OracleOCIEnvCreate failed with return code -1的问题解决方案

最近在很多新的客户电脑中使用我们的程序时报了一个错误:

英文:

OCIEnvCreate failed with return code -1 but error message text was not available.

中文:

OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用。

 

为了部署方便,我们使用了精简版的Oracle客户端,自己配或者网上找的安装包。

经过国内外的搜索,基本上此问题都定位为权限问题。确实,权限可能是问题之一,但是不完全是权限问题,没办法找到其他的原因了。后来想改用ODP.Net,在研究过程中发现了这一篇博客,有一句话:

当然,光有OCI目录(在环境变量Path中设置)不行,还得设置环境变量ORACLE_HOME为OCI目录,否则报错(因为oci.dll要用别的dll):

OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用。

是的,我们没有配置ORACLE_HOME,包括找的精简版的安装包也没有配置此环境变量,更让人头疼的是,有些电脑不用配置也能正常连接Oracle,导致了我们疏忽了此问题。刚刚接手此项目栽了跟头。

ORACLE_HOME是配置oci所在bin的上一级目录,非bin目录。如果大家的运行环境没必要在XP系统上,大家还是用ODP.Net吧,貌似只支持.net framework 4.5。

为了方便大家解决此问题,记录在此,希望搜索引擎能搜索到帮助大家。

MySQL The user specified as a definer…does not exist问题

本人是在做hibernate开发时,执行某一条语句出现这个异常:

查了很多相似的问题,大部分都说是存储过程(Stored Procedure)或者视图(View)的权限问题,没有指定的definer用户。但本人的数据库中没有存储过程也没有视图,肯定不是这个问题了。

继续阅读

Struts2+Spring中抛出一般异常(checked exception)事务不回滚的问题

在用String进程事务管理时,Spring只会在运行时异常(runtime exception)抛出时回滚数据库操作,如果我们自定义的异常或者其他没有继承runtime exception的异常抛出时,String不会回滚事务。如果你的抛出某种异常时,有两种方法。

继续阅读

关于Ext JS重写(override)和加载的问题

这里说明的是用Sencha CMD生成的项目。

要修复Ext中的Bug和添加自己的功能,用Ext.define来定义有重写类。

 

override配置项指定要重写的类,其他项目为要重写的具体内容。
如果你不想因为重写一个方法而导致原来的方法失效,你可以用this.callParent();来调用父类的同名方法。

重写的具体内容不多写,网上资料很多,这里说一下重写的类文件加载问题。

在定义一个类时,我们可以用requires或者uses来引用要调用的Ext类,但是重写的类在哪里加载容易维护?如果我们在随便一个类的定义里用requires来引用,那维护时会很不方便。
自己搜索了很久,没找到说明了在哪里加载,一开始我是在app.json里配置,后来发现项目里有个overrides文件夹,把重写的文件放到里面,然后用Sencha CMD运行sencha app refresh后,这个文件夹里的JS文件会被自动加载。

这个链接里也提到重写的问题:http://extjs.org.cn/node/721

 

Struts2 生成 JSON的日期转化成JS Date对象时间不一致的问题

我们前端用到Ext JS,在用Ext.Date.format(date, fomat)格式化日期的时候时间出现了不一致的问题,一开始以为是JS出现的问题。后来看了一下后端生成的JSON日期,格式类似:2014-10-11T17:02:45,日期和时间之前有个T,这是UTC时间,为世界标准时间,与GMT时间一样。

这个时间转成JS的Date对象时,如new Date(“2014-10-11T17:02:45″),时间会变成12号 的1点02分45秒,可见,相差了8个小时,而中国的时间是+0800,刚好就差这8个小时。

不知道为什么Strut2转成JSON会这样,丢失了时区,如果时间格式为:2014-10-11T17:02:45+0800是没问题的,包含了时区信息。

为了让JS正常工作,我们在Java的PO的Date类型的get方法中用注解 @JSON(format=”yyyy-MM-dd HH:mm:ss”) 格式化一下时间格式即可。我们在前端获取的时间格式变成了:2015-01-02 13:26:53,转成Date对象时间正确。