Word文档格式从doc转为mht.doc_第1页
Word文档格式从doc转为mht.doc_第2页
Word文档格式从doc转为mht.doc_第3页
Word文档格式从doc转为mht.doc_第4页
Word文档格式从doc转为mht.doc_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Word文档格式从doc转为mht发布时间:2008年12月27日作者:olivertan阅读次数:491次类别:学习永久链接Trackback 一、 Java调用动态链接库的方法 Java以其跨平台的特性深受人们喜爱,但正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决Java对本地操作的一种方法就是JNI。Java通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使Java可以实现和本地机器的紧密联系,调用系统级的各接口方法。 但是Java不能直接调用动态链接库,必须按照JNI的开发步骤,利用C或C+语言生成遵循JNI规范的dll文件。JNI的开发步骤如下所示。1. 编写带有native声明的方法的java类;2. 使用javac命令编译所编写的java类,生成class文件;3. 使用“javah 类名”生成扩展名为h的头文件;4. C/C+程序引用生成的头文件,并实现本地方法;5. 将C/C+编写的文件生成动态链接库;6. 将生成的dll文件放到编译好的java class文件目录下。具体的开发细节请参考JNI规范(Java 本地接口规范),浏览地址:http:/www.iplab.cs.tsukuba.ac.jp/liuxj/jdk1.2/zh/docs/guide/jni/spec/jniTOC.doc.html二、 Java与.Net互操作使用Office COM对象Java使用Office COM对象一般有以下两种途径。 直接使用JNI自定义实现方法 Java通过JNI调用本地方法,该本地方法存放在遵循JNI规范的C+程序生成的dll文件中。由于C+程序不是托管代码,不能直接访问Office PIA,所以必须在C+程序中使用托管代码(C#或VB)访问Office PIA,通过Office PIA使用Office COM组件。 这种方式虽然实现起来比较繁琐,但是可以灵活控制和维护。java程序和C+程序是相互透明的,可以分开维护。当Office升级时,可以方便地更新C+代码,重新生成动态链接库,而不必更新Java代码。 使用Jacob等中间件 Jacob顾名思义,就是JAVA-COM Bridge,Jacob也是间接使用了JNI方式,封装了一些COM对象的功能。Jacob和其它第三方产品一样,只是自定义了若干的功能,并没有完全使用Office COM对象,所以有一定的局限性。另外,当Office升级时,如果这些中间件不能及时更新,将会影响应用系统的正常使用。 本文的示例采用第一种方式,Java利用JNI方法与.Net互操作,通过Office PIA使用Office COM对象。三、 开发环境的配置 Java环境的配置1、安装JDK;2、设置系统变量JAVA_HOME;3、将“%JAVA_HOME%bin”加入系统变量PATH;4、将“%JAVA_HOME%libdt.jar; %JAVA_HOME%libtools.jar”加入系统变量CLASSPATH。 .Net环境的配置.Net环境需要安装以下软件: Microsoft Office 2003 and related SPs Microsoft .NET Framework and related SPs Microsoft Visual Studio .NET 2003 与安装Office XP不同,装好Office 2003后,操作系统就自动装上Office PIA。通过访问PIA(主程序集,Primary Interop Assembly)来使用由 Office 应用程序公开的 COM 组件。在ASP和VB中使用Office的COM组件是很方便的,可以通过形如CreateObject(Word.Application)的方式建立OLE对象并操作它的属性。在.NET中,微软提供了PIA以方便C+和C#程序员,但C+是非托管代码,必须使用托管代码(C#或VB)访问PIA。四、 开发Java程序 程序调用本地方法Convert2mht将folder目录下的doc文件批量转化为mht文件。public class doc2mht public native boolean Convert2mht(String folder); /folder存放要转化的doc文件static System.loadLibrary(doc2mht); public static void main(String args)boolean success = new doc2mht().Convert2mht(D:doc2mht); if(success = true)System.out.println(转化成功!);elseSystem.out.println(转化失败!); 在Java程序中声明和使用本地方法(native)Convert2mht,该方法的实现在doc2mht.dll中,dll文件由C+程序编译而成,和Java的class文件放在同一目录下。 使用命令“javah doc2mht”生成头文件doc2mht.h,C+程序调用该头文件来生成所需的库文件。#include #ifndef _Included_doc2mht#define _Included_doc2mht#ifdef _cplusplusextern C #endifJNIEXPORT jboolean JNICALL Java_doc2mht_Convert2mht(JNIEnv *, jobject, jstring);#ifdef _cplusplus#endif#endif在具体实现的时候,我们只关心函数原型:JNIEXPORT jboolean JNICALL Java_doc2mht_Convert2mht(JNIEnv *, jobject, jstring);这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。而jstring是以JNI为中介使JAVA的String类型与本地的string沟通的一种类型。JNI 接口指针是本地方法的第一个参数,其类型是 JNIEnv。第二个参数随本地方法是静态还是非静态而有所不同。非静态本地方法的第二个参数是对对象的引用,而静态本地方法的第二个参数是对其 Java 类的引用。我们可以在C+程序中用接口指针env来操作 Java 对象。比如通过以下代码将Java中的String转化为C+的字符串类型: const char* directory = env-GetStringUTFChars(folder, 0);五、 开发C+程序打开VS.NET新建项目,在“Visual C+项目”中找“类库”,新建项目“doc2mht”。可以看到源文件中生成了默认的doc2mht.cpp,把java程序生成的doc2mht.h加到项目的头文件列表中覆盖默认文件。添加引用“Microsoft.Office.Interop.Word.dll”。右键单击项目,选“属性”,在“配置属性/常规/使用托管扩展”选择“是”,在“C/C+”中选“常规”,在“附加包含目录”中输入“JAVA_HOMEinclude; JAVA_HOMEincludewin32”,其中JAVA_HOME用你自己的JDK安装主目录代替。在“解析#using引用”中输入“D:VSNETEnterpriseFrameworks”,同样,用你自己的PIA安装目录代替,一般在Microsoft Visual Studio .NET 2003安装目录下。 打开文件doc2mht.cpp,用以下程序覆盖默认代码。#include stdafx.h#include doc2mht.h#include #using mscorlib.dll#using Microsoft.Office.Interop.Word.dllusing namespace System;using namespace System:Reflection;using namespace System:IO;using namespace Microsoft:Office:Interop;/使用Office COM组件将doc文件批量转化为mht文件JNIEXPORT jboolean JNICALL Java_doc2mht_Convert2mht(JNIEnv *env, jobject obj, jstring folder)bool success = false; /转化是否成功 const char* directory = env-GetStringUTFChars(folder, 0); /将Java中的String转化为C+的字符串类型,directory下存放要转化的doc文件 System:String* files = Directory:GetFiles(directory); /获取directory下所有文件的文件名,文件名包括完整的路径信息 System:String* docType = Sdoc; /要转化的格式 System:String* mhtType = Smht; /转化后的格式System:String* split = S.; /用来分割文件名以获取文件格式System:Char splits = split-ToCharArray(); int wdFormatWebArchive = 9; /转化用的参数System:Object* wordSaveAsFormat = dynamic_cast(_box (wdFormatWebArchive); /将非托管数据wdFormatWebArchive强制转化为托管数据 System:Object* oMissing = System:Reflection:Missing:Value; /转化用的参数Word:ApplicationClass* pWord = new Word:ApplicationClass(); /COM对象Word:Documents* pDocs = pWord-Documents;tryConsole:WriteLine(开始转化doc文件.); for(int i = 0; i Length; i+) System:String* inputFile = filesi; /文件名System:String* parts = inputFile-Split(splits); /分割文件名System:String* type = partsparts-Length - 1-ToLower(); /该文件的格式if(System:String:Compare(type, docType) = 0) /判断是否为doc文件System:String* part = inputFile-Substring(0, inputFile-Length-3);System:String* outputFile = System:String:Concat(part, mhtType); /转化后的文件名,包括了路径信息 Console:WriteLine(outputFile);System:Object* inputObj = inputFile; /转化为托管类型System:Object* outputObj = outputFile; /转化为托管类型Word:_Document* pDoc = pDocs-Open(&inputObj, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing);pDoc-SaveAs(&outputObj, &wordSaveAsFormat, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing, &oMissing);pDoc-Close(&oMissing, &oMissing, &oMissing); System:Runtime:InteropServices:Marshal:ReleaseComObject(pDoc); success = true;catch(System:Exception* e)Console:WriteLine(e-GetBaseException()-Message);Console:WriteLine(e-GetBaseException()-StackTrace);System:Runtime:InteropServices:Marshal:ReleaseComObject(pDocs); pWord-Quit(&oMissing, &oMissing, &oMissing); System:Runtime:InteropServices:Marshal:ReleaseComObject(pWord); GC:Collect();System:Runtime:InteropServices:Marshal:ReleaseComObject(pDocs); pWord-Quit(&oMissing, &oMissing, &oMissing); System:Runtime:InteropServices:Marshal:ReleaseComObject(pWord); GC:Collect();return success; 熟悉C+的程序员可能觉得这段代码十分别扭,这是因为使用了C#托管代码。注意使用托管函数时,函数的参数必须为托管类型。比如程序中将非托管的参数wdFormatWebArchive强制转化为托管参数wordSaveAsFormat,使用了动态映射和装箱的方法。_box将托管数据封装成托管对象(_gc对象)。dynamic_cast表示运行时检查,不在编译时检查,用于多态的类型转换(upcast,downcast和crosscast),只能转换指针和引用。 编译项目,将生成的doc2mht.dll放到doc2mht.class的目录下,利用java命令就可以开始将folder目录下的doc文件批量转化为mht文件。看电视学英语发布时间:2008年12月26日作者:olivertan阅读次数:163次类别:学习永久链接Trackback很早就开始看Friends,最开始是从起床开始,就一个人对着电脑,傻笑一天,每天吃一顿饭,傍晚和同学一起吃饭的时候,基本就不会说中国话了,被人说什么第一个反应就是英文。周末同学都回家了,更是变本加厉,因为没有人和我说话,内心独白都是F6里的各种声音,还有那种“哄笑”配乐,一个周下来,感觉人快疯了。大学的时候是为了好玩,没想着真的用它来学英语。后来工作了几年,因为一直野心勃勃的要去美国公干,所以从那个时候开始重新FAN F6,很长一段时间过去,学下来,感觉有些许体会了,上来冒个泡。第一遍,带中文字幕看一遍10季真不是个小数字,看了一遍把当初那种感觉找了回来,所谓的感觉,就是在内心独白的时候都是英语,说话的第一个反应也是英文。第二遍,带英文字母看了一遍我买的是60张的那种DVD,英文字母有几季还是不错的,后面的越做越差,真是没法看,就当了剧本。第二次看,基本都能听懂了,就帮着DVD校对字幕,校对的过程中,听力本身就是一个提升。第三遍,不说你也知道了,去掉字幕,去掉字母有一个好处,就像丢了拐棍,你听起来就不会像看着英文字母那样一下就反映到脑子里,还要想一下,哦,这个单词是什么来着,因为我们很多时候对于掌握了的单词,突然冒出来,还是会思维停滞一下,就在这停滞的一下,新的内容又冲进来了,你就顾此失彼,到最后,前面的没想起来,后面的又忘了听,刚开始的时候是懊丧不已,因为前两遍的信心全被他给摧毁了,不过没关系,很正常的么,这个地方,你就要不停的重复听,所以你买DVD机比较好,有那个A-B重复健,可以无限重复你要听的句子,你总有想起来的那一刻吧第三遍是最痛苦的,也是最能升华的一个阶段。我在做第三遍的时候,是听力口语一起来的,其实这两个本来就是分不开的,口语,要求自己强力模仿!注意这个词哦不是吃干饭的,充分利用了A-B健,一个句子重复放,跟着读,然后跟着说,最后脱口而出,一点也不比他们差,甚至可以在语气,语调上,和他们一模一样。作这一部分的时候,我犯了一个错误,就是跟着读剧本,这是十分错误的,正确的做法是,像学鸟叫一样,学他们的声音,不要把自己原来读英文的习惯带到里面去,剧本只是告诉你他们再说什么内容,只是一个提示的作用,因为他们有很多连度,四个音节,在他们嘴里常常变成了 2个音节,甚至一个音就带过了,你根本就反应不过来,这也就是我们听不懂他们说话的原因,太快了,而你根本不知道他连读了,如果按照自己的读英文的习惯,永远也做不到他们一样快。所以记住,!学他们发出的声音,而不是读他们说出的句子!这第三遍,我可以用老牛拉破车来形容,实在是很慢很无聊,要花费大量的时间,特别是一开始,记得101背到我想吐,莫尼卡的那句 “THERE IS NOTHING TO TELL!#$%# %!%$#%”可以直接当减肥药了,一听到就想吐!但是,有一点保证,以后老外用多快的速度,我都能听懂她在说 “THERE IS NOTHING TO TELL!#$%#%!%$#%”而且可以和她说的一样快,一样纯正的美国纽约音。兄弟们代价惨重阿你可以算一下,一集大约 20分钟,每句话重复10遍,那是什么概念,就是一集学下来要200分钟,折合3个多小时,如果你特别笨的话,多跟几遍,时间又上去了,我经常会思想溜号,A-B的时候不知道想什么去了,就要多重复几遍。我当初算了一下,我大约要跟到第7遍的时候才有感觉,前面不是语速慢了,就是快了,要么就是停顿不对,也可能我比较笨?加上笨的原因,加上溜号,大约有4个小时一集把.下面分析一下他们六个人的口音语速,RACH,我最喜欢的角色,她的口音不很好学,因为她经常会发出很可爱的声音,感情丰富啊,而且连音也比较多,但是学她很有用,因为她的发音很性感,个人认为。CHANDLER这个家伙经常会把我逼疯的,他太贫了,语速又快,最难学了,最好学的是PHEEBS,很喜欢她,她的发音很圆润,语速也很正常,MONIKA 可以用她来练长句子,她经常会一口气说很多,JOEY,他反映慢,语速适中应该是最好学的一个,可是他的声音太低了,不适合女生学,我学他太吃力了,男生的话是个首选这样我整了3季的时候,除了生词,在新天地泡吧的时候,可以和老外自由对话,心理满足了一把过了3季,后面的7季就会块很多,因为很多句子,在你的耳朵里已经是很简单的,根本不需要重复,你要练习的只是特别难的那些长句,记不记得伦敦之行?走之前,莫尼卡的那一口气说完的长句子,呵呵,那就是最高境界,你可以脱口而出,和她一样快,一样不喘气,后面的你就不用跟了,你可以出师了但是,这是3季以后的事了,3季不过,一切免谈而且有一项工作是必须作的,是贯穿10季的工作,那就是笔记!除非你的牛人,不过牛人也就不来看我这个帖子了,呵呵笔记很重要,里面会有生词,特别是“该死的ROSS”,他在里面经常不出好词,你就查吧,再就是俚语,很多俚语这才是地道的美语,你只有作了笔记你才有积累,最重要的是多有成就干啊,看到那么多的笔记,我的笔记可以从地板摞到写字台那么高,因为我字特别大?不是!是我做得很细!细到从头看IS的用法,把它当作一个事业来做,当作一个重整英语的契机,好好的梳理一下自己的存货。说实话,这也很痛苦的看肥皂剧是很开心的,可是学肥皂剧就没那么开心了最后,就是坚持的动力了, 我不知道别人是为什么,要学好英语,但是你的动力要足,而且经常要受受刺激,否则的话很容易坚持不下来。并发处理发布时间:2008年12月25日作者:olivertan阅读次数:482次类别:学习永久链接Trackback一 并发处理 数据库的特点就是数据的集中管理和共享。在通常情况下总是有 若干个事务并发地运行,这些并行的事务可能并发地存取相同的数据。 因此,数据库管理系统的一个重要任务就是要有一种机制去保证这种 并发的存取和修改不破坏数据的完整性,确保这些事务能正确地运行 并取得正确的结果。 我们知道,事务并发执行时若不加控制的话将导致不正确的结果 和数据库的不一致状态。为保证数据库数据正确地反映所有事务的更 新以及在一事务修改数据时其它事务不同时修改这个数据,数据库系 统用锁来控制对数据的并发存取。 二 ORACLE的并发处理机制 无需任何说明,ORACLE自动提供行级锁,它允许用户在没有冲突 的情况下更新表中不同的行。行级锁对联机事务处理非常有用。 1 ORACLE锁的类型 在正常情况下,ORACLE会自动锁住需要加锁的资源以保护数据, 这种锁是隐含的,叫隐含锁。然而,在一些条件下,这些自动的锁在 实际应用时并不能满足需要,必须人工加一些锁。这些人工加的锁叫 显示锁。 下面指明了会产生隐含锁的SQL语句: INSERT; UPDATE; DELETE; DDL/DCL语句。 下面指明了会产生显示锁的SQL语句: SELECT FOR UPDATE; LOCK TABLE IN XXX MODE。 解决读的不可重复性可以用下面的方法。在ORACLE中,用SELECT FOR UPDATE对预期要修改的记录加行排它锁(X),对表加行共享锁 (RS)。它常用于要锁住一行,但不去真的修改这一行。 锁之间是有相互作用的。例如,更新时会对表加RX锁,对行加X锁, 而只有RS锁和RX锁允许再加RX锁。因此,当存在RS和RX锁时,表允许更 新。再比如,当执行DDL和DCL语句时,会对表加排它锁X,而在存在X、 RS、SRX、RX和S锁的前提下,都不能再加X锁。因此,当存在X,RS,SRX, RS或S锁时,不能对表做DCL和DDL操作。这样,数据库会自动防止一个用 户更新表中的数据,而其他用户在同时修改表的结构。 2 ORACLE只读事务 ORACLE支持只读事务。只读事务有以下特点: * 在事务中只允许查询 * 其它事务可修改和查询数据 * 在事务中,其它用户的任何修改都看不见 只读事务的写法为: SET TRANSACTION READ ONLY SQL 语句 COMMIT,ROLLBACK,DDL结束只读事务 3 事务一致性的级别 事务是定义和维护一致性的单位,封锁就是要保证这种一致性。如果 对封锁的要求高会增加开销,降低并发性和效率;有的事务并不严格要求 结果的质量(如用于统计的事务),如果加上严格的封锁则是不必要和不 经济的。因此有必要进行进一步的分析,考察不同级别的一致性对数据库 数据的质量及并行能力的影响。 一致性级别定义为如下的几个条件: (1) 事务不修改其它任何事务的脏数据。脏数据是被其它事务修改过, 但尚未提交的数据。 (2) 在事务结束前不对被修改的资源解锁。 (3) 事务不读其它任何事务的脏数据。 (4) 在读前对数据加共享锁(RS)和行排它锁,直至事务结束。 * 满足条件1的事务叫第0级事务。 * 满足条件1和2的事务叫第1级一致性事务。 * 满足条件1、2和3的事务为2级一致性事务。ORACLE的读一致性保 证了事务不读其它事务的脏数据。 * 满足条件1、2、3和4的事务叫第3级一致性事务。 由ORACLE的三个性质:自动加隐式锁、在事务结束时释放锁和读一致 性,使ORACLE成为自动满足以上的0、1和2级一致性事务。因此,ORACLE 自动防止了脏读(写-读依赖)。但是,ORACLE不能自动防止丢失修改(写 -写依赖),读的不可重复性(读-写依赖),彻底解决并发性中的问题还 需满足第4个条件(3级一致性事务),这需要程序员根据实际情况编程。 方法如下: * 如果想在一段时间内使一些数据不被其它事务改变,且在本事务内 仅仅查询数据,则可用SET TRANSACTION READ ONLY 语句达到这一 目的。 * 如果想在一事务内修改一数据,且避免丢失修改,则应在读这一数 据前用SELECT FOR UPDATE对该数据加锁。 * 如果想在一事务内读一数据,且想基于这一数据对其它数据修改, 则应在读数据前对此数据用SELECT FOR UPDATE加锁。对此种类型 的应用,用这条SQL语句加锁最恰当。 * 如果想避免不可重复读现象,可在读前用SELECT FOR UPDATE对数 据加锁,或用SET TRANSACTION READ ONLY设置只读事务。 三 SYBASE的并发处理机制 SYBASE的并发处理方法与ORACLE类似,但在很多方面不一样。 SYBASE有两种粒度的封锁,一种的粒度是页,另一种的粒度是表。SYBASE 根据SQL语句的情况决定用页封锁还是用表封锁。 1 页级锁 页级锁有以下所始的三类: * SHARED:在读操作时加共享锁。在缺省状态下,在读操作完成后 释放共享锁。 * EXCLUSIVE:在更新操作时加排它锁。在缺省状态下,在事务完成 后释放排它锁。 * UPDATE:在修改和删除操作的初期(读到被修改或删除的页时) 加修改锁。在表上加了修改锁之后,还可以再加共享锁,但不能 再加修改和排它锁。在进行修改和删除操作时,如果没有共享锁 存在,修改锁则转化为排它锁。此锁的目的是为了防止死锁。 SYBASE仅当在WHERE子句中包含索引列时才会使用页级的排它锁和修改锁。 2 表级锁 表级锁有以下所示的三类: * INTENT:当表中存在页级的排它锁和共享锁时,在表上加意向锁。 在所有的页级锁释放后,意向锁随着释放。 * SHARED:在读操作时加共享锁。在缺省状态下,在读操作完成后 释放共享锁。 * EXCLUSIVE:在更新操作时加排它锁。在缺省状态下,在事务完成 后释放排它锁。 3 请求锁 请求锁用以防止共享锁一个接一个无休止地加在表上,从而写事务( 要加排它锁)无法进行。 4 SYBASE的封锁级别 在SYBASE根据ANSI标准定义事务的封锁级别: (1) 级别1:脏读 (2) 级别2:不可重复读 (3) 光标带来的当前值混乱 SYBASE的缺省一致性级别为1。如果要达到一致性级别2和3,必须使用 HOLDLOCK关键字把共享锁持续到事务的结束。方法如下: SELECT * FROM AUTHS HOLDLOCK WHERE AUTHOR_CODE=A00001 SYBASE还可以通过T-SQL的SET命令改变SYBASE的一致性级别,从而使 SYBASE自动在SELECT语句中加HOLDLOCK关键字: SET TRANSACTION ISOLATION LEVEL 3 5 在SYBASE中提高并发效率的方法 * 避免在表中特定的页上多个用户过多的封锁。 * 避免在人机交互的应用中定义事务,这样会使某个用户长时间封锁 住表(如去接电话),使其他用户持续等待。 * 使事务尽量的短。 * 仅当必要时才使用HOLDLOCK关键字。 存储过程介绍发布时间:2008年12月25日作者:olivertan阅读次数:281次类别:学习永久链接Trackback 存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化 后存储在数据库服务器中,使用时只要调用即可。在ORACLE中,若干个 有联系的过程可以组合在一起构成程序包。 使用存储过程有以下的优点: * 存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可 以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的 运算。 * 可保证数据的安全性和完整性。 # 通过存储过程可以使没有权限的用户在控制之下间接地存取数据 库,从而保证数据的安全。 # 通过存储过程可以使相关的动作在一起发生,从而可以维护数据 库的完整性。 * 再运行存储过程前,数据库已对其进行了语法和句法分析,并给出 了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。 由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执 行。 * 可以降低网络的通信量。 * 使体现企业规则的运算程序放入数据库服务器中,以便: # 集中控制。 # 当企业规则发生变化时在服务器中改变存储过程即可,无须修改 任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运 算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序 工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的 运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可 以了,应用程序无须任何变化。 不同数据库存储过程的写法不一,在后面的讲座中将分别介绍ORACLE 和SYBASE存储过程的用法。 二 ORACLE 的存储过程 ORACLE 创建存储过程的语法为: create or replace procedure 过程名 参数1 in|out|in out 数据类型 ,参数2 in|out|in out 数据类型. is|as pl/sql 语句 下面举例说明ORACLE数据库存储过程的写法和用法。 可以建立一个存储过程,每当用户修改数据库的重要数据时,即把 用户的用户名、掌诤筒僮骼嘈图锹枷吕矗?nbsp; create procedure update_log is begin insert into update_log_tab(use_name,update_date,operation) values(user,sysdate,update end; 可以在恰当的位置调用这个存储过程来记录用户对表的修改。例如下面在 表sal_comm上建立一个修改触发器,每当用户修改此表后,用户的名称、修改 时间和操作即被记录在了表update_log_tab中: create trigger audit_update after update on sal_comm for each row begin update_log end -三 Sybase的存储过程 尽管Sybase存储过程的功能和写法与ORACLE类似,但他们之间还是 有一定的差别。下面讲述SYBASE的存储过程。 SYBASE可以用CREATE PROCedure命令生成存储过程: CREATE PROCedure 存储过程名 ;number ( parameter_name datatype =default OUTput , parameter_name datatype =default OUTput.) WITH RECOMPILE AS SQL_statements 下面是一个查询作者编码、名称和生日的存储过程: create proc p_auths author_code varchar(10) as select author_code, name, birthdate from auths where author_code=author_code 下面执行过程p_auths: p_auths author_code=A00001 在CREATE PROC语句中,可以为参数赋缺省值,该值可以是任何常量。 当用户不提供参数值时,该值便作为参数值提供给过程。 视图的作用发布时间:2008年12月25日作者:olivertan阅读次数:376次类别:学习永久链接Trackback一 视图的概念 视图是原始数据库数据的一种变换,是查看表中数据的另外一种 方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的 数据。 视图是从一个或多个实际表中获得的,这些表的数据存放在数据 库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从 另一个视图中产生。 视图的定义存在数据库中,与此定义相关的数据并没有再存一份 于数据库中。通过视图看到的数据存放在基表中。 视图看上去非常象数据库的物理表,对它的操作同任何其它的表 一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反 地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑 上的原因,有些视图可以修改对应的基表,有些则不能(仅仅能查询)。 二 视图的作用 * 简单性。看到的就是需要的。视图不仅可以简化用户对数据的理 解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图, 从而使得用户不必为以后的操作每次指定全部的条件。 * 安全性。通过视图用户只能查询和修改他们所能见到的数据。数 据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用 户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特 定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上: 使用权限可被限制在基表的行的子集上。 使用权限可被限制在基表的列的子集上。 使用权限可被限制在基表的行和列的子集上。 使用权限可被限制在多个基表的连接所限定的行上。 使用权限可被限制在基表中的数据的统计汇总上。 使用权限可被限制在另一视图的一个子集上,或是一些视图和基表 合并后的子集上。 * 逻辑数据独立性。视图可帮助用户屏蔽真实表结构变化带来的影响。 三 视图的安全性 视图的安全性可以防止未授权用户查看特定的行或列,是用户只能 看到表中特定行的方法如下: 1 在表中增加一个标志用户名的列; 2 建立视图,是用户只能看到标有自己用户名的行; 3 把视图授权给其他用户。 四 逻辑数据独立性 视图可以使应用程序和数据库表在一定程度上独立。如果没有视图, 应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上, 从而程序与数据库表被视图分割开来。视图可以在以下几个方面使程序 与数据独立: 1 如果应用建立在数据库表上,当数据库表发生变化时,可以在表 上建立视图,通过视图屏蔽表的变化,从而应用程序可以不动。 2 如果应用建立在数据库表上,当应用发生变化时,可以在表上建 立视图,通过视图屏蔽应用的变化,从而使数据库表不动。 3 如果应用建立在视图上,当数据库表发生变化时,可以在表上修 改视图,通过视图屏蔽表的变化,从而应用程序可以不动。 4 如果应用建立在视图上,当应用发生变化时,可以在表上修改视 图,通过视图屏蔽应用的变化,从而数据库可以不动一个项目cosmos开源框架发布时间:2008年12月22日作者:olivertan阅读次数:296次类别:学习永久链接Trackback一个项目cosmos开源框架框架主要用来做中小项目开发,丢弃了传统的SSH架构,利用纯的Servlet+JDBC实现数据库操作。开发Web项目,可以实现无需写Java代码,而实现业务逻辑,并且由于不需要写Java代码,因此,可以不需要重启和重新部署项目,就可以直接测试,达到了开发-刷新测试的水平。根据目前多个项目的应用实践看来,基本上可以提高一倍到2/3的开发时间,而且性能比起SSH架构还要高,框架还要更加轻量级。因此,这个框架还是比较能够体现敏捷开发的思想的。由于框架摒弃了Hibernate的O/R Mapping工具,因此有一个比较大的问题就是关于数据库移植性的问题,但是,根据公司对于中小项目的经验,一旦客户要移植数据库,几乎就需要重新实现业务逻辑了,因此,对于中小项目来说,这是一个不错的选择。下载地址: /p/cosmos4j/POI操作office文档发布时间:2008年12月13日作者:olivertan阅读次数:254次类别:学习永久链接Trackbackakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于早在Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。它的官方首页是:/poi/,这里可以下载到它的最新版本和文档。下面就来看看如何通过Jakarta POI的HSSF操作Excel文件。操作Excel文件的步骤同JXL类似(关于如何用JXL操作Excel可以看我的另外两篇文章)。HSSF对Excel的操作主要是通过下面几个对象实现:HSSFWorkbook 工作簿对象对应于Excel文件HSSFSheet Sheet对象对应于Excel中的SheetHSSFRow 行对象表示Sheet中的一行(这个对象在JXL中并没有提供)HSSFCell 单元格对象操作步骤就是用HSSFWorkbook打开或者创建“Excel文件对象”,用HSSFWorkbook对象返回或者创建Sheet对象,用Sheet对象返回行对象,用行对象得到Cell对象,有了Ce

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论