十二 28
Digg
Stumbleupon
Technorati
Delicious

FileNet添加和删除文件错误 An error occurred accessing the database

这两天在客户测试环境的FileNet Server遇到错误,不管是调用CE Web Service API的方式还是FileNet Workplace,上传或删除文件都失败,出现了Exception,显示的错误信息是

An error occurred accessing the database.  ErrorCode: 0, Message: ‘enlist: caught Exception’

看错误信息,可能是oracle数据库有什么问题,可是查了很久没查出错误所在。

后来在WebSphere Server的SystemOut.log中看到具体错误信息如下:

WTRN0037W: The transaction service encountered an error on an xa_recover operation. The resource was com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl@57562412. The error code was XAER_RMERR. The exception stack trace follows: javax.transaction.xa.XAException
at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java(Compiled Code))
at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.recover(WSRdbXaResourceImpl.java(Compiled Code))
at com.ibm.ws.Transaction.JTA.XARminst.recover(XARminst.java(Compiled Code))
at com.ibm.ws.Transaction.JTA.XARecoveryData.recover(XARecoveryData.java(Compiled Code))
at com.ibm.ws.Transaction.JTA.PartnerLogTable.recover(PartnerLogTable.java(Compiled Code))
at com.ibm.ws.Transaction.JTA.RecoveryManager.resync(RecoveryManager.java:1896)
at com.ibm.ws.Transaction.JTA.RecoveryManager.run(RecoveryManager.java:2608)
at java.lang.Thread.run(Thread.java:571)

有了具体的错误日志后,Google后在IBM的网站上查到原因和解决方案

https://www-304.ibm.com/support/docview.wss?uid=swg21196663

它说原因是Oracle做什么recover操作的时候没权限。

第一种解决方案试了下,给用户加权限,但是我们试了,不知道是什么原因,错误依旧。

所以继续试第二种方案。

1. 停掉WebSphere Application Server

2. 找到 ‘\transaction‘目录,位于<WebSphere Application Server_install_root>\profiles\<PROFILE_NAME>\tranlog\<CELL_NAME>\<NODE_NAME>\<SERVER_NAME>\transaction

3. 删掉 ’\transaction‘目录及其子目录

4. 重启WebSphere Application Server

然后错误就没了。

 


Author: jianyun
十二 28
Digg
Stumbleupon
Technorati
Delicious

Executing Multiple Select Statements for Oracle

使用SQL Server的时候,我们可以传多个Select语句作为CommandText,一次执行,然后通过DataReader的NextResult方法访问多个Select语句返回的结果集,当然也可以用DataAdapter来填充DataSet。

下面的例子就是用一个DBCommand执行多个Select语句的代码片段。

myCommand.CommandText =
	"UPDATE Books SET Price=Price*0.95 “ +
	“SELECT BookName, Price FROM Books " +
	"UPDATE Toys SET Price=Price*0.9 “ +
	“SELECT ToyName, Price FROM Toys ";

SqlDataReader dreader = myCommand.ExecuteReader();

while (dreader.Read()) // process the first result set
{
	Console.WriteLine(dreader.GetString(0) + ": "
		+ dreader.GetSqlMoney(1).ToDouble());
}

dreader.NextResult(); // Move on to next result set

while (dreader.Read()) // process the second result set
{
   Console.WriteLine(dreader.GetString(0) + ": "
     + dreader.GetSqlMoney(1).ToDouble() + "\n");
}

dreader.Close();

 

而当使用Oracle数据库的时候,这样的写法却会报错:ORA-00911: invalid character

这是因为Oracle不支持Multiple Statements的缘故。

如果你真的要这样写多个select语句而不想用存储过程的话,你可以通过anonymous block和ref cursors的方式来实现,同样,通过DataReader的NextResult方法访问多个Select语句返回的结果集。

string strSql = "begin open :refcur1 for select * from emp;" +
"open :refcur2 for select * from dept;" +
"open :refcur3 for select * from salgrade;end;";
myCommand.CommandText = strSql;
myCommand.Parameters.Add("refcur1", OracleType.Cursor).Direction = ParameterDirection.Output;
myCommand.Parameters.Add("refcur2", OracleType.Cursor).Direction = ParameterDirection.Output;
myCommand.Parameters.Add("refcur3", OracleType.Cursor).Direction = ParameterDirection.Output;

OracleDataReader dreader = myCommand.ExecuteReader();

while (dreader.Read())
{
    //process the first result set
}

dreader.NextResult(); // Move on to next result set

while (dreader.Read())
{
   //process the second result set
}

dreader.NextResult();

while (dreader.Read())
{
   //process the third result set
}

dreader.Close();

 

 


Author: jianyun
十二 20
Digg
Stumbleupon
Technorati
Delicious

HTML5未来发展的六大趋势

HTML5从根本上改变了开发商开发Web应用的方式,从桌面浏览器到移动应用,这种语言和标准都正在影响并将继续影响着各种操作平台。

在移动领域,大家争论不休的一个问题就是开发Web应用还是原生应用?而随着HTML5标准的发展,两者之间的差异已经逐渐变得模糊,今天各大媒体都争相报道与HTML5有关的东西,那么,HTML5未来的发展趋势到底是什么?

  1) 移动优先

前天,appMobi获选ReadWriterWeb2012最具前途的的公司,作为一家初创公司,这个奖公司首先专注于在移动平台上如何实现HTML5的简单易用和无处不在。

从如今层出不穷的移动应用就知道,在这个智能手机和将平板电脑大爆炸的时代,移动优先已成趋势,不管是开发什么,都以移动为主。

如上文所说,此前一直困扰移动领域的问题就是开发Web应用还是原生应用。而如今,我们看见一些大型企业如《金融时报》在冲着HTM L5进军移动市场过程中,从App Store撤掉iPad原生应用而开发Web应用,同样表现出色。

许多游戏开发商也将在移动Web应用中扮演中重要角色,移动Web应用优先的趋势将会持续到移动设备统治信息处理领域。其实用户根本不在乎你用什么工具开发了什么应用,不管是Web应用还是原生应用,只要好用就可以了。

  2) 游戏开发者领衔“主演”

其实移动游戏开发商是从HTML5获益最多的一方,他们可利用这个平台逃脱付费游戏须向苹果支付的30%提成。在某种程度上,游戏就是移动平台销量最好的应用,也是吸引人们购买移动设备的一个重要因素。

许多游戏开发商都被Facebook或者Zynga推动着发展,而未来的Facebook应用生态系统是基于HTML5的,尽管在HTML 5平台开发出游戏非常困难,但游戏开发商却都愿意那么做。通过PhoneGap及appmobi的XDK将Web应用游戏打包整合到原生应用中也是一种方式,Facebook差不多就这么干的——基于Web应用及浏览器,但却将之打包整合进原生应用。

  3) 响应式设计&自动变化的屏幕尺寸

在HTML5真的改变移动开发平台之前,必须要迈出重要一步,那就是“响应式设计”,也就是屏幕可以根据内容而自动调整大小。

响应式设计最好的一个例子就是今年上线的BostonGlobe.com(观看视频),其屏幕能够根据任何内容而调整尺寸大小,在访问过其开发商Filament Group后才了解到,响应式设计也并非易事,一些基本概念设计必须从头开始,比如处理媒体库的RespondJS,而且处理来自第三方的图片和广告也是恼人的问题。

要想做好响应式设计,就必须洞悉内容与屏幕之间的反馈关系,一家来自硅谷的响应式设计公司ZURB称,其实在过去的16年中,开发商就意识到响应式设计就要完全离开“流”,转而注重内容是如何在网页和移动设备中被处理的,这一过程还在继续,HTML5会让它最终成为可能。

  4 )设备访问

消除Web应用与原生应用界限的最大障碍就是浏览器访问移动设备基本特性的能力,比如照相机,通讯录,日历,加速器等,利用HTML5实现此能力方面,上文中提到的appMobi算是行业翘楚,在感恩节后开源了所有API。Mozilla也一直在努力通过移动浏览器Fennec来将强设备访问能力。

对许多移动开发商来说,提高设备访问能力是HTML5最令人激动的革新,这意味着Web应用能够登陆移动设备而无需做任何PhoneGap式打包,游戏开发商当然最开心,因为某些特性对他们来说是封锁的,比如能整合到游戏中的加速器。

这就开启了另一个可能的世界,比如能与云更好地整合(这有利于应用内购买,消息推送等)并提高游戏可玩性,有了HTML5这个平台,开发商可以不再依赖于Java语言,CSS3,HTML及其它程序语言。

  5) 离线缓存

这个概念相当新潮,离线情况下,app也能照常运作,算是HTML5充满魔力的一面,今年最好的离线缓存例子就是亚马逊Kindle的云阅读器,可以通过Firefox6以上版本,Chrome11以上版本,Safari5以上版本及iOS4以上版本浏览器将内容同步到所有Kindle系列设备,并能记忆用户在kindle图书馆的一切。

亚马逊就这么实现了离线使用Web应用,许多专家人声称原生应用的末日即将到来,因为Web应用的使用变得简单,无摩擦,适用于任何一个平台或者无需平台。当然Mozilla的触角也伸到了这里,实际上,Mozilla想涉足任何一个HTML5能渗透的领域,从Mozilla的移动蓝图,可以了解更多。

  6) 开发工具的成熟

  • 在今年八月份,Brian Fling曾写过一篇博文叫HTML5 Web应用开发剖析,提出了几点建议供从事HTML5应用的开发者参考:
  •   要耐心,HTML5项目可能比开发其他任何项目好是都要长
  •   做好预算,这不像建网站那么简单,可能会耗费你大量资金
  •   找对开发者,你要记住,这对许多经验丰富的专家来说都非常难的事,那么你的团队也会觉得困难,所以一定要找对人,找到正确的方向
  •   要自食其力,你要知道,开发HTML5项目,许多工具都要自制,不是现成的
  •   在技术界,按部就班的教条风格在这里行不通,会花掉许多不必要的资金,在移动领域,没有对与错,只有是否适合,一切以用户体验为重。

在工具方面,除了appMobi提供的工具以外,还有Sencha及Appcelerator提供的框架及IDE供应用开发商们使用,虽然这些工具现在算不上成熟,也不如Android和iOS上的开发商框架及工具那般简单强大,但至少它们在演进,将会变得越来越好用。

  总结

HTML 5的其它功能,如表单和新标准还在快速演进,而随着标准化工作的进行,HTML5有可能变回HTML。HTML5开发领域的领军人物包括Sencha,Adobe,Appcelerator,appMobi及Facebook,亚马逊,Google三大巨头。

不管你是想开发出新型视频应用的开发商如Brightcover还是想开发新型音频应用的开发商如Soundcloud,不论是桌面应用还是移动应用,HTML5都是创新的主旋律。

英文原文:RWW:Top 6 Trends In HTML5 In 2011

 

 


Author: jianyun
十二 14
Digg
Stumbleupon
Technorati
Delicious

[VSTO] 区分MailItem的attachment是真正的附件还是内嵌资源

在遍历MailItem的Attachments集合的时候发现,不管是真正的附件还是内嵌资源,比如邮件内容中内嵌的图片(Embedded Image),都是Attachments集合的元素,通过查看attachment元素的属性,并没有发现可以区分它们的方法。

其实如果是Outlook2007及以上的话,可以通过MAPI Attachment Reference for PropertyAcessor取得attachment的ContentID来判断。

比较靠谱的判断方法是,

1)先看attachment的Type属性是不是OlAttachmentType.olByValue,如果不是那么它是内嵌的

2)再通过PropertyAccessor.GetProperty的方法看ContentID(http://schemas.microsoft.com/mapi/proptag/0x3712001E)和ContentLocation(http://schemas.microsoft.com/mapi/proptag/0x3713001E)是不是空的,如果是不为空的字符串,那么它是内嵌的

通常做1)和2)的check就行了,但某些情况下,这样还不保险,可以继续下面的check

3)通过PropertyAccessor.GetProperty的方法看METHOD属性(http://schemas.microsoft.com/mapi/proptag/0×37050003)的值是不是6,类型应该是int,如果是那么它是内嵌的

4)通过PropertyAccessor.GetProperty的方法看FLAGS属性(http://schemas.microsoft.com/mapi/proptag/0×37140003)的值是不是4,类型应该是int,如果是那么它是内嵌的

 

下面是代码判断:

private bool isEmbeddedAttachment(Outlook.Attachment attachment)
{
     if(attachment.Type != Outlook.OlAttachmentType.olByValue)
     {
          return true;
     }

     string ATTACH_CONTENT_ID =
              @"http://schemas.microsoft.com/mapi/proptag/0x3712001E";
     string ATTACH_CONTENT_LOCATION =
              @"http://schemas.microsoft.com/mapi/proptag/0x3713001E";
     if(attachment.PropertyAccessor.GetProperty(ATTACH_CONTENT_ID).ToString()
           != string.Empty ||
        attachment.PropertyAccessor.GetProperty(ATTACH_CONTENT_LOCATION).ToString()
           != string.Empty)
     {
          return true;
     }

     string ATTACH_METHOD =
              @"http://schemas.microsoft.com/mapi/proptag/0x37050003";
     if((int)attachment.PropertyAccessor.GetProperty(ATTACH_METHOD) == 6)
     {
          return true;
     }

     string ATTACH_FLAGS =
              @"http://schemas.microsoft.com/mapi/proptag/0x37140003";
     if((int)attachment.PropertyAccessor.GetProperty(ATTACH_FLAGS) == 4)
     {
         return true;
     }

     return false;
}

 

int count = item.Attachments.Count;
//删除邮件中的附件,保留内嵌资源
for(int i = count; i > 0; i--)
{
    if(!isEmbeddedAttachment(item.Attachments[i]))
    {
        item.Attachments[i].Delete();
    }
}

 

 

 


Author: jianyun