chao's profile清凉水都PhotosBlogListsMore Tools Help

chao zhou

Occupation

订阅我的空间

优秀开源软件推荐

Firebug - Web Development Evolved

清凉水都

蓝色的起源,清凉的心情,畅游水都中
感谢访问!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.
Betty Wongwrote:
留爪~
Mar. 5
Peng Yangwrote:

  我来过了!嘿嘿!  

  这里弄得不错,很多内容对我来说还是挺新鲜的,我慢慢看,哈!眨眼掌声鼓励一下
Aug. 5
October 22

IT非技术人员也要学一点技术

Technorati 标签: ,

    这年头,做技术的是苦命的,做IT技术就更是苦命的。IT技术人员既要智商,又要情商。不光要技术过硬,还要有一定的艺术细胞,最好懂得各种行业的行业知识。而反观我们的IT内非技术人员呢?自诩是在高新技术产业中的高级人才,比编程这种民工级的活动要高级的多,对技术不屑一顾,反倒以不关注技术为荣。而反观其他行业,非技术人员都还是要懂得一些技术的,例如房屋格局的设计,你再异想天开也要符合物理学原理吧。那么IT行业真的是这么独特吗?技术人员可以拯救一切的吗?至少从我自身的经历来看,技术人员的能力真的有限的可怜,下面我就谈谈我的感受。

    首先说说需求分析人员或者叫客户专员,总的来说这些人还真的不需要特意学习一些技术,只要平时用软件的时候留留心就够用了,知道哪些能做哪些不能做就行了;但是,如果项目中存在着不需要二次设计的东西时,就大不一样了,例如报表。国内的报表是出了名的难啊,对于一些古怪的报表,不是无法完成,就是制作成本太高(成分是老板控制的,技术人员做不了主),最终往往流产,给项目的验收带来麻烦。作为一个需求分析人员,是要对这种拿来就用的需求背后的技术有一定了解的,因为这些需求只有一道关,过了你这关,后续的其他环节就只有放行了。

   接下来咱们再说说功能设计人员和UI设计人员,这部分设计人员往往是本业务很熟,会一些数据分析和流程控制相关的知识,深知客户的习惯。按理说只要最大满足客户需求,符合一般的设计规则进行设计就好了,不过这样设计往往会给整个软件或者项目带来意想不到的结果。

    例如在功能页面的设计上,设计人员大多是知道不能设计过多的功能的,往往一个页面一个功能,但是就是这么简单的设计,也会让技术人员头痛不已。我就以一个简单的查询为例,为了满足当天的实时需求与月详细报告,设计人员将这两个需求合二为一,增加了时间范围的查询条件,从而满足了需求。从设计上看这没什么问题,但是从技术上看,问题就大了。实时数据属于联机事务,而月详细报告属于数据仓库,而这两者的技术配置完全相反,换句话说如果实时数据查询速度快了,那么月详细报告就慢了,反之亦然。从技术上说二者是不能合并的统一的。此外还有更来气的UI设计,光考虑用户体验了,完全不考虑如何获取和控制数据,经常出现只知道事件开始,不知道事件结束的UI设计,就好比你打个电话说你不久就回来,给你留门,却没有说什么时候回来一样。最后的技术解决办法只有定时监听来解决,多了的话大大降低软件的执行效率,好的UI效果也显示不出来了,反而带来更差的客户体验。更让人头痛就是横表显示的数据表格,从界面设计上看,完全没问题,但技术人员就犯难了,要不牺牲可扩展性,要不牺牲性能,没有一个两全的办法,更头痛的是开发体力劳动高,对于程序员这种四肢不勤的人来说简直是地狱。

    所以我还是建议功能设计和UI设计人员学一些技术,至少要知道自己所设计软件的技术信息,如果有能力的话可以学学如何编程,设计完成后,可以简单的实现一下,看看是否可行,减少设计文档辗转于几个部门,返工的事件的发生。

    最后就要谈谈项目经理了,这个已经是老生长谈了,在项目经理这个问题上,就不是懂不懂技术的问题了,项目经理不懂技术那软件基本就废了,就好比开车的人不知道开的是自动挡的还是手动挡的,不出事才怪呢。重点是项目经理是否懂得最新的技术发展,我就曾经遇到过这样一个项目经理,是从技术员提上来的,对自己过去的技术实力十分自豪,经常向我们讲述10年前利用Dephi开发的故事,可惜的是这位项目经理之后完全没有学习新的技术,管理方式还是Dephi开发的管理方式,对技术开发本身的评估不正确,基本上没有给技术人员改进现有模板和平台时间,大大降低了开发进度,还影响了质量。在软件生存周期中,开发和测试是项目中是很占时间的(现在开发已经占时间很少了,但要组织好才行),如果对现有开发技术不太了解的话,就会出现由于时间安排不合理造成的软件质量问题,这是公司高层最不愿看到的现象,项目经理的位子就危了。毕竟项目经理这个职位多数都不愿低下头来主动听取技术部门的意见,所以还是项目经理只好自己学学吧。

   IT并不独特,和其他行业一样,设计与管理最终的目的都要通过IT技术实现,无法实现的设计与管理都是浪费时间与金钱,而技术人员还多是长颈鹿,看着精明,却不善言谈。所以为了自己,也为了别人,还是学点技术好,至少下次和技术人员吵架时不会被术语搞蒙,你说对不。

PS:最近被调到一个老项目组做扫尾工作,天天忙碌于由于非技术人员不懂技术所造成的技术问题,有所感触,特写此文,以发泄心中不快。

July 16

ORACLE DBA/USER操作

获取数据表主键SQL(Oracle)
SELECT   D.COLUMN_NAME   AS   COLNAME   FROM 

USER_CONS_COLUMNS   D,USER_CONSTRAINTS   M  
WHERE   M.CONSTRAINT_NAME=D.CONSTRAINT_NAME  
AND   M.CONSTRAINT_TYPE='P'  
AND   M.TABLE_NAME= :P_TableName

ORACLE
特殊
Ø    ORACLE只能连接特定数据库,不能自动扫描数据库对象。
Ø    ORACLE表必须用用户来区别,否则表可能重名。
Ø    ORACLE不能区别系统表或者是用户表,因此只能由管理员选择扫描某些特定用户的表。
取得数据库名的方法
只能由用户指定数据库,不能自动扫描到特定数据库服务器上的所有数据库。
取得表的方法
存储数据库表的系统表/视图主要有:
DBA_ALL_TABLES
描述数据库中所有的对象以及相关的表。
ALL_ALL_TABLES
描述数据库中所有的用户可以访问的对象以及相关的表。
USER_ALL_TABLES
描述数据库中当前用户拥有的对象以及相关的表。

DBA_ TABLES
描述数据库中所有相关的表。
ALL_ TABLES
描述数据库中所有的用户可以访问的相关的表。
USER_ TABLES
描述数据库中当前用户拥有的相关的表。

因此,可以从ALL_TABLES中取得隶属于指定用户的表:
SELECT TABLE_NAME FROM SYS.ALL_TABLES WHERE OWNER = 'DBAUDIT';
取得隶属于指定表空间的表:
SELECT TABLE_NAME FROM SYS.ALL_TABLES WHERE TABLESPACE_NAME = 'DBAUDIT';

也可以不指定用户名,从而取得所有的表。
SELECT TABLE_NAME FROM SYS.ALL_TABLES;
取得列的方法
存储数据库表的列属性的系统表/视图主要有:
DBA_TAB_COLUMNS
描述数据库中所有的表的列属性。
ALL_TAB_COLUMNS
描述数据库中所有的用户可以访问的表的列属性。
USER_TAB_COLUMNS
描述数据库中当前用户拥有的表的列属性。
ALL_TAB_COLS
描述数据库中所有的用户可以访问的表的列属性。

因此,可以从ALL_TAB_COLUMNS中取得隶属于指定用户的表:
SELECT COLUMN_NAME FROM SYS.ALL_TAB_COLUMNS WHERE TABLE_NAME = 'TASK' AND OWNER = 'DBAUDIT';
取得视图的方法
存储数据库视图的系统表/视图主要有:
DBA_VIEWS
描述数据库中所有的视图的属性。
ALL_VIEWS
描述数据库中所有的用户可以访问的视图的属性。
USER_VIEWS
描述数据库中所有的当前用户拥有视图的属性。

因此,可以从ALL_VIEWS中取得隶属于指定用户的视图:
SELECT VIEW_NAME FROM SYS.ALL_VIEWS WHERE OWNER = 'DBAUDIT';
取得存储过程的方法
存储系统对象的系统表/视图有:
DBA_OBJECTS
描述数据库中所有的对象。
ALL_OBJECTS
描述数据库中所有的可以访问的对象。
USER_OBJECTS
描述数据库中所有的当前用户拥有的对象。
SYS_OBJECTS
描述数据库中所有的系统对象。?

对象类型有:
CONSUMER GROUP
CONTEXT
DIRECTORY
FUNCTION
INDEX
INDEX PARTITION
INDEXTYPE
JAVA CLASS
JAVA DATA
JAVA RESOURCE
JAVA SOURCE
LIBRARY
LOB
MATERIALIZED VIEW
OPERATOR
PACKAGE
PACKAGE BODY
PROCEDURE
QUEUE
SEQUENCE
SYNONYM
TABLE
TABLE PARTITION
TRIGGER
TYPE
TYPE BODY
VIEW

因此,取得存储过程可以用:
SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'PROCEDURE';
取得隶属于某个用户的存储过程可以用:
SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'PROCEDURE' AND OWNER = ‘DBAUDIT’;

同样,取得其他的对象也可以用这个方法,包括表,视图等。
取得存储过程内容的方法
对象类型为类型、类型体、过程、函数、包、包体,JAVA源代码的所有对象的源代码都存储在几个系统表/视图中:
DBA_SOURCE
存储所有数据库对象的源代码。
ALL_SOURCE
存储所有可以访问的数据库对象的源代码。
USER_SOURCE
存储所有当前用户拥有的数据库对象的源代码。

因此,取得存储过程源代码的方法:
SELECT TEXT FROM SYS.ALL_SOURCE WHERE NAME = ‘XXX’ AND TYPE = ‘PROCEDURE’;
取得函数的方法
同上,取得函数可以用:
SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'FUNCTION';
取得隶属于某个用户的函数可以用:
SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'FUNCTION' AND OWNER = 'DBAUDIT';

取得函数内容可以用:
SELECT TEXT FROM SYS.ALL_SOURCE WHERE NAME = 'XXX' AND TYPE = 'FUNCTION';
取得触发器的方法
存储数据库触发器的系统表/视图主要有:
DBA_TRIGGERS
描述数据库中所有的触发器的属性。
ALL_ TRIGGERS
描述数据库中所有的用户可以访问的触发器的属性。
USER_ TRIGGERS
描述数据库中所有的当前用户拥有触发器的属性。

因此,可以从ALL_ TRIGGERS中取得隶属于指定用户的触发器:
SELECT TRIGGER_NAME FROM SYS.ALL_TRIGGERS WHERE OWNER = 'DBAUDIT';

取得触发器内容的方法:
SELECT TRIGGER_BODY FROM SYS.ALL_TRIGGERS WHERE TRIGGER_NAME = 'XXX';
取得索引的方法
存储数据库索引的系统表/视图主要有:
DBA_INDEXES
描述数据库中所有的索引的属性。
ALL_ INDEXES
描述数据库中所有的用户可以访问的索引的属性。
USER_ INDEXES
描述数据库中所有的当前用户拥有索引的属性。

因此,可以从ALL_ INDEXES中取得隶属于指定用户的索引:
SELECT INDEX_NAME,TABLE_NAME FROM SYS.ALL_INDEXES WHERE OWNER = 'DBAUDIT';

取得索引相关的列的方法:
SELECT COLUMN_NAME FROM SYS.ALL_IND_COLUMNS WHERE INDEX_NAME = 'XXX' AND TABLE_OWNER = 'DBAUDIT';
用户
存储数据库用户的系统表/视图主要有:
DBA_USERS
描述数据库中所有的用户的属性。
ALL_USERS
描述数据库中所有的用户的属性。
USER_USERS
描述数据库中当前用户的属性。

因此,可以从ALL_USERS中取得用户:
SELECT USER_ID, USERNAME FROM SYS.ALL_USERS;
角色
存储角色的表/视图有:
DBA_ROLES
描述数据库中所有角色。

取得角色方法:
SELECT ROLE FROM SYS.DBA_ROLES;
表空间
SELECT TABLESPACE_NAME FROM SYS.DBA_TABLESPACES;
数据文件
SELECT FILE_NAME, FILE_ID, TABLESPACE_NAME FROM SYS.DBA_DATA_FILES;
数据库连接
存储数据库连接的系统表/视图主要有:
DBA_LINKS
描述数据库中所有的连接的属性。
ALL_LINKS
描述数据库中所有的用户可访问的连接的属性。
USER_LINKS
描述数据库中当前用户的连接属性。

因此,可以从DBA_DB_LINKS中取得连接:
SELECT * FROM SYS.DBA_DB_LINKS;

同义词
SELECT * FROM SYS.ALL_SYNONYMS WHERE TABLE_OWNER = 'DBAUDIT';
程序包
取得程序包可以用:
SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'PACKAGE';
取得隶属于某个用户的程序包可以用:
SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'PACKAGE' AND OWNER = 'DBAUDIT';

取得程序包内容可以用:
SELECT TEXT FROM SYS.ALL_SOURCE WHERE NAME = 'XXX' AND TYPE = 'PACKAGE';
程序包体
取得程序包体可以用:
SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'PACKAGE BODY';
取得隶属于某个用户的程序包可以用:
SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'PACKAGE BODY ' AND OWNER = 'DBAUDIT';

取得程序包内容可以用:
SELECT TEXT FROM SYS.ALL_SOURCE WHERE NAME = 'XXX' AND TYPE = 'PACKAGE BODY ';

用VisualStudio自动生成WCF 双工协议配置文件的注意事项

Technorati 标签: ,

最近后朋友问关于WCF的问题,于是就看了看,本来自己是要做WPF的,做到后面发现太需要美工的能力了,于是就放慢速度,分些精力看其他的东西。起先想先看看WF的,不过文献太少,而且MSDN上写的好深奥,于是就借着朋友的机会开始尝试使用WCF,试用了一下,发现在客户端自动生成配置文件上会有些问题,于是就写个网志记录一下。

双工中自动生成的配置文件不会自动生成ClientBaseAddress的地址,要自己写,否则连不上服务的。

WCF服务端发送自定错误

[ServiceContract]

[FaltException(typeof(CustomException))]

CustomException是序列化数据

ServiceDebugBehavior debug = new ServiceDebugBehavior();

debug.IncludeExceptionDetailInFaults = fales;

ServiceHost.Description.Behaviors.Add(debug)前要先清除自动生成Debug行为

ServiceHost.Description.Behaviors.Remove<ServiceDebugBehavior>();因为会自动生成而Behaviors是一个KeyTypeOfCollection,因此无法容下两个同类型的对象。

 

客户端截获用Cath(FaultException<CustomException> ex),注意这个ex的类型是FaultException,如果想要用自己的错误类型,需要这样:ex.Details,这样返回的就是CustomException了,之后就可以获取自定的信息和操作了。

March 21

PL/SQL FORALL语句的一些注意事项

Technorati 标签: ,

1.对于引用的处理
FORALL在使用集合的时候无法用引用的方式调用数据,例如:

Forall i in tab.First .. tab.Last
   delete  Table where col = tab(i).col

这样是无法编译通过的,所以不要指望用Selete * Bulk Collecte into row_tab到一个记录集合,在通过FORALL的方式来快速处理表格数据了,要做的话只能用标准SQL语句解决了,或者一列一列的改(注:多集合的情况下,FORALL会默认按FOR……LOOP的方式处理数据,就谈不上优化了)。

2.关于异常处理的一些例外和机制猜想
虽然Forall可以通过调用Save Exceptions和块的Exception来跳过错误继续执行后面DML,但是当因为调用的集合缺失数据而发生错误的时候并不一定会跳过继续进行,下面举个简单的例子:

Declare
TYPE t_tab IS TABLE OF Varchar2(3);

v_tab  t_tab := t_tab('1','2','3','4','5','6');

BEGIN
v_tab.DELETE(1);
v_tab.DELETE(2);
v_tab.DELETE(5);

FORALL i IN v_tab.FIRST .. v_tab.LAST SAVE EXCEPTIONS
UPDATE  TestTable  SET t_value = 'Changed'
WHERE   t_id = v_tab(i);

DBMS_OUTPUT.PUT_LINE('END');

EXCEPTIONS
WHEN others THEN
NULL;
END;

最终结果是: 1: Unchanged
  2: Unchanged
  3: Changed
  4: Changed
  5: Unchanged
  6: Unchanged

 

这个结果是不是看起来很奇怪,如果按照无SAVE EXCEPTIONS的情况下去想,那么结果都应该为Unchanged,如果按照有SAVE EXCEPTIONS的一般情况来想则6应当为Changed。

根据FORALL的处理流程和上面的结果,我个人认为FORALL在执行的时候是这样的:

1.生成所有集合记录执行的DML语句
2.将所有语句一起发送给执行器执行
3.执行器逐条执行语句,和For……Loop的方式相似,自动提交和回滚每条记录

因为只提交一次DML所以在集合中有多条集合时,效率会大大优于For……Loop。那么产生上述问题的原因就在第一步生成DML语句的时候了。由于1和2的数据不存在,无法产生DML语句,于是继续检索后面的集合,到3的时候可以正常生成。到5的时候又不能生成了,关键点就在这之后的处理了,引擎并没有尝试去生成后面的语句,而是直接跳出的生成环节,所以6理所当然的没有被更新了,因为根本没有生成对应的语句。

因此对于添加SAVE EXCEPTIONS的FORALL的错误处理,是分为两个部分的:

1.在生成语句阶段,引擎是从生成第一个正常语句开始到再遇到错误截止,换句话说只能跳过头部的连续错误,而中间的错误会影响其后面的操作。
2.在执行阶段,各个语句相对独立,任何错误都不影响其他语句的执行。

最后,建议各位在使用FORALL的时候最好用变长数组(VARRAY)不要用 嵌套表(TABLE),嵌套表是不连续的,而且变长数组(VARRAY)可以避免删除操作,如果实在需要用嵌套表(TABLE)的话,一定要记得检查是否有空数据,然后用TRIM彻底删除后,再用FORALL执行,以避免发生上述问题。

 
Photo 1 of 3

Feed

The owner hasn't specified a feed for this module yet.

Windows Media Player