技术

有趣有趣 专栏收录该内容
11 篇文章 0 订阅

2011.10.9

异步与多线程的使用场景

 

当需要执行I/O操作时,使用异步操作比使用线程+同步 I/O操作更合适。I/O操作不仅包括了直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.net Remoting等跨进程的调用。

而线程的适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。但是往 往由于使用线程编程的简单和符合习惯,所以很多朋友往往会使用线程来执行耗时较长的I/O操作。这样在只有少数几个并发操作的时候还无伤大雅,如果需要处 理大量的并发操作时就不合适了。

 

 

2010.10.14

 

C# winform 编程

 

PointToClient方法的意思
这方法是把屏幕绝对坐标映射到父控件的工作区坐标
this.PointToClient(this.Location)
等于把form自己的左上角屏幕绝对坐标映射到自己的工作区坐标上去那肯定是固定的

所谓屏幕绝对坐标就是屏幕的坐标,屏幕左上角是(0,0)
所谓工作区坐标就是form的内部坐标,form工作区的左上角坐标是(0,0),
所谓工作区就是form除了边框和标题栏外可以放控件的地方
也就是说工作区坐标和form的location是无关的
this.PointToClient(this.Location)
等于求form的左上角对于工作区来说的坐标是什么,那就总是返回(-边框宽度,-标题栏高度)

 

 

Control.PointToClient

将指定屏幕点的位置计算成工作区坐标。

下面的代码示例使用户能够将图像或图像文件拖到窗体上,并使它在放置点显示。每次绘制窗体时,都重写 OnPaint 方法以重新绘制图像;否则图像将保持到下一次重新绘制。DragEnter 事件处理方法决定拖到窗体中的数据的类型,并提供适当的反馈。如果 Image 可以从该数据中创建,则 DragDrop 事件处理方法就会在该窗体上显示此图像。因为 DragEventArgs..::.XDragEventArgs..::.Y 值为屏幕坐标,所以示例使用 PointToClient 方法将它们转换成工作区坐标

PointToScreen

将指定工作区点的位置计算成屏幕坐标。

下面的代码示例演示如何使用 BackColorRectangleToScreenPointToScreenMouseButtonsControlPaint..::.DrawReversibleFrameRectangle..::.IntersectsWith 成员。要运行该示例,请将以下代码粘贴到一个包含多个控件的称为 Form1 的窗体中。此示例要求 MouseDownMouseMoveMouseUp 事件已连接到该示例中定义的事件处理程序。

 

from:msdn.microsoft.com/zh-cn/library/system.windows.forms.control.pointtoclient.aspx

 

 

 

这是控件的容器和父控件的是指同一个概念吗? - .NET技术 / C#的详细页面,介绍了和c/c++,控件的容器和父控件的是指同一个概念吗? - .NET技术 / C#有关的知识,加入收藏请按键盘ctrl+D,要查看更多相关信息,请点击此处

C#中, 控件的容器和父控件是指同一个概念吗?如果是,为什么有时候控件明明在一个容器上,可是它的父控件为null,如果不是,那么如何取得控件的容器呢?
答案 1 



------其他回答(10分)---------

容器和父控件应该是两个概念

------其他回答(10分)---------

件的容器和父控件是不同概念
------其他回答(10分)---------

父控件未必是容器控件...WinForm中只有实现了IContainer接口的控件才是容器控件,WPF中只有Panel类的派生类才是容器控件...

反过来,容器控件也未必是父控件...除非设置了子控件的Parent属性...

另外,所谓父子级关系只是逻辑关系...
------其他回答(10分)---------

这就要看"控件明明在一个容器上"这句话是怎么解释了,如果是通过Controls.Add,将一个控件添加到容器中,那么容器就应该是它的父窗口。

 

 

2010.9.29

 

dxdiag 运行该命令,能显示主板信息等,很好用.

 

 

2010.9.1

 

局域网和广域网相比,性能方面的差别主要在于传输速度和网络延迟。但是这对于所有的通信协议来说都是一样的。

和RMI, Corba等相比,WebService在性能上的问题主要是由于对于传输数据的解析带来的。RMI和Corba都是传输序列化数据,和对象之间进行转换的速度要比处理XML格式的数据快。当然对于一般应用来说,这个差别也不会有太大影响。

另外就是在底层是否保持连接。如果不保持连接,那么每次调用建立TCP/IP连接的开销对性能的影响也比较大。不过这个主要取决于具体的实现方式。

 

桌面应用,除了工作量的因素外,还有以下优点:
执行速度快;
支持复杂的交互场景;
成熟的框架支持。

支持离线工作
行为更受控
不能跨平台
安装有一定复杂性

可能开发工作量是最不重要的一个考虑因素。

 

.net在开发windows RichClient上还是相对有优势的。
如果这样子的话,关键是客户端服务器的通信协议定义了,用XML封装通信消息,走Socket,需要自己定义一个框架简化Socket开发;或者服务端用websercice了。

 

今天听个东软的说在做项目,100人!前段PB,后端Java + Oracle,说是要序列化通过Socket通信(具体怎么弄没问),感觉.....,好别扭啊! 其实这种东西嘛,用.NET的话,前后端Remoting通信,还是还不错。主要的问题是,那里的resource懂.NET的不多。

另外大家一直在强调性能,我是见有人写分布式程序就象写本地调用一样,一个button click后面,往返4,5次后台,老大,DTO啊;还有那个一次性拿500条记录的同志,是否仔细考虑过,用户是否需要在一个界面中从500条记录里面选一条数据出来?即使是C/S的程序也是需要考虑分页的,最好是设置些filter尽量缩小用户所获取的数据量。我是商业系统写得多,做国内的系统时还没觉得性能是主要问题,大部分都是后台直接就跑数据库了;做国外的项目时,问题就比较大了,后台的Service层,还要访问其它WebService, 在后台传递两三层的跨进程跨网络访问是很平常的事,这个时候效率想高也搞不起来了.....,金融方面的系统没怎么做过,不知道对性能要求到什么程度。

分析下消耗时间的主要地方---
数据库端的时间(尤其是查询)
跨进程跨网络访问的次数
后台进程内逻辑处理
序列化(大数据量or小数据量)

看看效率的降低主要是哪一块引起的

 

2010.8.25

 

IIS版本对应的windows版本信息

  2000 iis版本是5.0

  xp 版本是5.1

  2003版本是6.0

  2008版本是7.0

 

2010.8.24

 

组件是可以将生成的DLL文件随意的放在另一套系统中使用,不用拷贝源代码。
用户控件,只能在本项目内使用。
组件可以添加到Tool工具箱内,而用户控件则不能。
他们的使用方法都是拖拽。

一).用户控件和自定义控件概述  
       用户控件(UserControl):  扩展名为*.ascx,跟*.aspx在结构上相似,是指页面中  
加载的功能块,只是用户控件不能单独作为页面运行,必须嵌入到*.aspx页面或其它用  
户控件中使用.  
       自定义控件,跟HtmlControl或WebControl相似,编译后可以添加引用到工具栏里  
面,直接用鼠标拖动使用.  
 
(二).使用        
       在一个大系统中,有时候会只能几个*.aspx页面,其余的都是做成*.ascx页面,  
这样可以增强页面之间的藕合性,一个用户控件*.ascx都作为一个独立的功能块.  
       自定义控件是指编译后直接可以放到工具箱中用,就像TextBox,DataGrid一样  
在设计器中可以用鼠标拖动到页面上使用.  
       自定义服务器控件分为两种:    
               1.一种是用*.aspx代码和*.cs代码编译后生成DLL,再添加引用到工具箱使用.          
                   一般用于WebForm中.        
               2.另一种是只用*.cs实现,再编译生成DLL,添加到工具箱使用.  
                   一般用于WinForm中.  
       自定义控件生成步骤:  
             比如:    
               1.  将一个Button从设计器拖到页面中,  
                     对按钮大小,颜色或文本设置一个固定值,保存文件名为:  a.cs  
               2.  csc  /r:System.dll  /t:library/out:../../A.dll    a.cs  
               3.  右击工具箱空白处,弹出右击菜单后,选“添加移除项”,将刚生成的DLL  
                     添加到工具箱里面来,这样,就可以像一般的Button一样拖动使用了

 

 

 

2010.8.6

 

详细设计是为了更好的进行代码编写,需要包括接口说明,表结构字段说明,资源文件,有界面的话要说清楚界面元素,
概要设计是为了更好的进行业务分析,需要包括需求描述,需求分析,程序逻辑,数据库表设计,模块划分等。

 

2010.8.3

 

我们所有人都知道那句明言:在软件开发中,要花90%的时间完成90%的项目,然后再用90%的时间完成剩下的10%的项目。为什么呢?计划不科学。

  在管理学中,计划,也有叫规划的,定义是"为组织确定目标、实现目标的战略与手段、步骤、程序的过程。"打个比方说,我想要把一个箱子推倒一个地方,这个地方就是我的目的,我为了到达那里,我是不是要估计一下按什么路线推,要推多快。然后我就开始推,还要不时的和原先的计划比较比较,需不需要调整路线和速度。这个估计就是计划。

  计划的目标不是消除错误,而是让所有错误变成一堆经过细心规划后的小错误。研究四种设计方式后,最终放弃三种,最多不过是三个小错误而已,但因没有做好设计而将程序重写三遍,却可能造成三个大错误。

 

2010.6.12

 

生成GUID的方法

 

Oracle平台   char(32) SYS_GUID()

Sybase平台 char(36)  newid()

 

 

2010.5.2

 

outlook2007中修改了附件直接保存后文件丢失的解决方法


倒了个大霉,
费了一个下午编辑的文件,
由于是从附件直接打开的, 然后没有另存为直接保存的.
然后回去再打开, 发现, 妈的没了!!!!! ----------------这不是我的原话,但这是我的心情

费了很多劲, 从网上都找不到怎么方法找回原来的文件,
不过经过我自己的尝试, 终于想出了下面这个方法:

1.打开文件, 选择'other actions', 里面有个'Edit message', 点它
2.随便找个.html文件作为附件, 拖进这个信件里去.
3.打开刚刚拖进去的.html文件.
4.在打开的html文件的窗口的路径中去掉这个文件名, 然后回车.

好了, 你现在定位的这个目录下就有你想要的文件. 保存吧.

 

2010.3.22

 

///开始深深怀疑这到底是不是人话:)我觉得是.恩,不过,最近说话一股子文档味道,这倒是真的...//

 

利用eclipse重构代码生成工厂方法实际上就是将一个类的构造函数转变成静态构造函数的过程。

这个静态构造函数就叫做工厂方法。

假设有下面的一个类:

view plaincopy to clipboardprint?
/** 
 * Test For FactoryMethod! 
 * 
 * @author rk 
 * 
 */ 
public class FactoryOne extends FactorySuper {  
    public FactoryOne(){  
    }  
    public FactoryOne(String smg){  
    }  

/**
 * Test For FactoryMethod!
 *
 * @author rk
 *
 */
public class FactoryOne extends FactorySuper {
 public FactoryOne(){
 }
 public FactoryOne(String smg){
 }
}  
用光标选中构造方法FactoryOne, 然后从eclipse选择「refactoring」 - 「Create Factory Method」就会出现一个对话框。

在对话框里面填入相应的: 工厂方法名,工厂方法类。确认以后就会生成相应的工厂方法。

如下类所示:

view plaincopy to clipboardprint?
/** 
 * Test For FactoryMethod! 
 * 
 * @author rk 
 * 
 */ 
public class FactoryOne extends FactorySuper {  
    public static FactoryOne createFactoryOne() {  
        return new FactoryOne();  
    }  
    private FactoryOne(){  
    }  
    public FactoryOne(String smg){  
    }  

/**
 * Test For FactoryMethod!
 *
 * @author rk
 *
 */
public class FactoryOne extends FactorySuper {
 public static FactoryOne createFactoryOne() {
  return new FactoryOne();
 }
 private FactoryOne(){
 }
 public FactoryOne(String smg){
 }
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jackyren007/archive/2009/11/23/4859092.aspx

 

 

 

2010.3.10

 

在本工程下建立一个lib文件夹(叫别的名字也行),和src,bin同级,然后专门用来加入jar包,这样的好处

1.export出自己的jar包时, 方便选择和这些jar包同时导出.

2.添加引用的时候,选择properties-->build-->add jar,即相对路径(而不是external jar指明的绝对路径),这样jar包可以在project迁移时跟着走,不会乱

 

 

在每一个function的定义上方加入

/**         -----以后每当调用该方法的时候,都会出现参数提示
      * @param LogSource
      * @param CurrentUserName
      * @param LogKeyWord
      * @param LogContent
      */

2010.2.24

 

卸载vs2008,解决办法是找到源安装盘的vs_setup.msi,用Admin进入cmd,进入该文件夹,然后运行msiexec /x vs_setup.msi,它似乎就什么都不检查,就能卸载了。

之后重装也没问题。

 

2010.2.5

 

做什么事情都要有依据
能回答老板的凭什么就成功一半了

 

//

 

我不能说TDD对于一个人的技术要求高了1倍,但是至少高了50%。我最近写了一个将普通的图片进行简单转化(用于按图选择材料和进行加工)的很简单的图形翻译功能,我实际上最后用了30分钟就将最终的功能代码实现了,手工测试查看看上去一点问题都没有,但是我之前写了4个TDD测试,有1个真正核心的检测原型图纸与最后生成的图纸匹配的功能我却用了3天也没有写好,我能实现需求功能是靠另外3个TDD来驱动的,但是这3个其实只是测试一点点功能而测试不出关键的功能,只是驱动了接口而已。我可以正向地产生加工图纸,却竟然无法让逆向检查程序按照我想当然的逻辑思路通过。我知道这是我绘图技术上有些搞不明白的问题,通过这个我知道我技术上缺陷在哪里。好比如说一个工厂具有的能力可以用手工打造好了两辆红旗轿车,而且可以开上路跑,但是他就是无法开发一套汽车检测系统,他的红旗轿车拿到人家大工厂里一检测肯定让人笑掉大牙。所以写不出自动化测试,就好像中国人最初造轿车、农民造飞机之类,手工打造出产品只是完成了一个起点,不要以为这就可以交差了。
0 请登录后投票
 
   发表时间:2009-03-14   最后修改:2009-03-14
对于是否有时间进行TDD的问题,可以想象,如果只是手工打造轿车,老工人用手中的锤子“Review”产品(意思是这种Review其实并不太靠谱),一年才能生产几辆车,能跟那一年生产几十万辆、甚至可以灵活定制的丰田相比吗?

所以花精力放在流程的柔性化、敏捷化,只做必要的工序而不做无用的工序,甜头是很多的。
我不能说TDD对于一个人的技术要求高了1倍,但是至少高了50%。我最近写了一个将普通的图片进行简单转化(用于按图选择材料和进行加工)的很简单的图形翻译功能,我实际上最后用了30分钟就将最终的功能代码实现了,手工测试查看看上去一点问题都没有,但是我之前写了4个TDD测试,有1个真正核心的检测原型图纸与最后生成的图纸匹配的功能我却用了3天也没有写好,我能实现需求功能是靠另外3个TDD来驱动的,但是这3个其实只是测试一点点功能而测试不出关键的功能,只是驱动了接口而已。我可以正向地产生加工图纸,却竟然无法让逆向检查程序按照我想当然的逻辑思路通过。我知道这是我绘图技术上有些搞不明白的问题,通过这个我知道我技术上缺陷在哪里。好比如说一个工厂具有的能力可以用手工打造好了两辆红旗轿车,而且可以开上路跑,但是他就是无法开发一套汽车检测系统,他的红旗轿车拿到人家大工厂里一检测肯定让人笑掉大牙。所以写不出自动化测试,就好像中国人最初造轿车、农民造飞机之类,手工打造出产品只是完成了一个起点,不要以为这就可以交差了。
0 请登录后投票
 
   发表时间:2009-03-14   最后修改:2009-03-14
对于是否有时间进行TDD的问题,可以想象,如果只是手工打造轿车,老工人用手中的锤子“Review”产品(意思是这种Review其实并不太靠谱),一年才能生产几辆车,能跟那一年生产几十万辆、甚至可以灵活定制的丰田相比吗?

所以花精力放在流程的柔性化、敏捷化,只做必要的工序而不做无用的工序,甜头是很多的。
我不能说TDD对于一个人的技术要求高了1倍,但是至少高了50%。我最近写了一个将普通的图片进行简单转化(用于按图选择材料和进行加工)的很简单的图形翻译功能,我实际上最后用了30分钟就将最终的功能代码实现了,手工测试查看看上去一点问题都没有,但是我之前写了4个TDD测试,有1个真正核心的检测原型图纸与最后生成的图纸匹配的功能我却用了3天也没有写好,我能实现需求功能是靠另外3个TDD来驱动的,但是这3个其实只是测试一点点功能而测试不出关键的功能,只是驱动了接口而已。我可以正向地产生加工图纸,却竟然无法让逆向检查程序按照我想当然的逻辑思路通过。我知道这是我绘图技术上有些搞不明白的问题,通过这个我知道我技术上缺陷在哪里。好比如说一个工厂具有的能力可以用手工打造好了两辆红旗轿车,而且可以开上路跑,但是他就是无法开发一套汽车检测系统,他的红旗轿车拿到人家大工厂里一检测肯定让人笑掉大牙。所以写不出自动化测试,就好像中国人最初造轿车、农民造飞机之类,手工打造出产品只是完成了一个起点,不要以为这就可以交差了。
0 请登录后投票
 
   发表时间:2009-03-14   最后修改:2009-03-14
对于是否有时间进行TDD的问题,可以想象,如果只是手工打造轿车,老工人用手中的锤子“Review”产品(意思是这种Review其实并不太靠谱),一年才能生产几辆车,能跟那一年生产几十万辆、甚至可以灵活定制的丰田相比吗?

所以花精力放在流程的柔性化、敏捷化,只做必要的工序而不做无用的工序,甜头是很多的。
我不能说TDD对于一个人的技术要求高了1倍,但是至少高了50%。我最近写了一个将普通的图片进行简单转化(用于按图选择材料和进行加工)的很简单的图形翻译功能,我实际上最后用了30分钟就将最终的功能代码实现了,手工测试查看看上去一点问题都没有,但是我之前写了4个TDD测试,有1个真正核心的检测原型图纸与最后生成的图纸匹配的功能我却用了3天也没有写好,我能实现需求功能是靠另外3个TDD来驱动的,但是这3个其实只是测试一点点功能而测试不出关键的功能,只是驱动了接口而已。我可以正向地产生加工图纸,却竟然无法让逆向检查程序按照我想当然的逻辑思路通过。我知道这是我绘图技术上有些搞不明白的问题,通过这个我知道我技术上缺陷在哪里。好比如说一个工厂具有的能力可以用手工打造好了两辆红旗轿车,而且可以开上路跑,但是他就是无法开发一套汽车检测系统,他的红旗轿车拿到人家大工厂里一检测肯定让人笑掉大牙。所以写不出自动化测试,就好像中国人最初造轿车、农民造飞机之类,手工打造出产品只是完成了一个起点,不要以为这就可以交差了。 . 
 
  
 对于是否有时间进行TDD的问题,可以想象,如果只是手工打造轿车,老工人用手中的锤子“Review”产品(意思是这种Review其实并不太靠谱),一年才能生产几辆车,能跟那一年生产几十万辆、甚至可以灵活定制的丰田相比吗?

所以花精力放在流程的柔性化、敏捷化,只做必要的工序而不做无用的工序,甜头是很多的。 

 

/

 

第一点:项目经理既要考虑公司的整体利益,也要考虑团队的利益,这样才是合格的项目经理。很显然,经常加班加点是不可取的,特别是需要其他部门也要一起配合的时候。
第二点:对于需要协调同级部门的资源,最好找项目主管去协调,因为只有项目主管才能协调得动他们。
第三点:可以在项目验收之后,请一起工作的其他部门同事聚餐,表示感谢。

 

2010.2.1

 

属  性  Window       Frame       Dialog
模式化   不是          不是       不是(可设置)
可调大小 不可          可         可
标题栏   无            有         有
边界     无            有         有
标题     无            有         有
菜单栏   无            有         无
焦点管理器 有          有         有
警告字符串 有          有         有
图表       无          有         无
定位到框架 可          不可       可

 

2010.1.27

 

个人认为,项目中涉及到的文档大致可分为三类:
1、项目本身需要的、随着项目过程必然会形成的文档:比如方案、计划、会议纪要等等。这些文档对项目至关重要,意义不用多说。
2、客户高层要求的:比如验收指标体系,或某某方法论的总结。这些文档对于做好项目本身,既不必须也不紧急,但客户高层点名要要,还是只能挤时间完成,否则项目做得再好也交不了差的。这跟领导的个人风格有很大关系。
3、顾问公司要求的:比如项目阶段汇报等。这种汇报跟项目本身向客户及项目组内部提供的阶段汇报,无论在内容还是格式上又有所不同,是站在顾问公司内部管理角度出发的。一般来说优先级放到最后,但还是不能不写,因为这是自己老板要看的东西,呵呵。

 

 

 

2010.1.11

 

监控操作系统的方法:

 

1.使用GAC类库,功能较少

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;
using System.Diagnostics;

namespace manage_process1
{
    class Program
    {
        static void Main(string[] args)
        {

            System.Diagnostics.Process[] processes;
           
            processes = System.Diagnostics.Process.GetProcesses();
            foreach (System.Diagnostics.Process instance in processes)
            {
                Console.WriteLine(instance.ProcessName);//进程名

            }
            System.Threading.Thread.Sleep(5000);

        }
    }
}

2.在程序中嵌套操作系统管理命令行,不同操作系统命令行不同.

 

windows WMIC(windows 2000不支持,95/xp/其他都支持),察看进程cpu使用不支持

UNIX/LINUX PS

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime;
using System.Diagnostics;

namespace manage_process2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("pls input :/n");

            string s=Console.ReadLine();//input a command line

             Process p = new Process();

            //察看process PID,mem,
             //p.StartInfo.FileName = "cmd.exe";
             //p.StartInfo.Arguments = s;

            //wmic process,察看进程和路径,process where name="QQ.exe" delete
            p.StartInfo.FileName = "wmic.exe";
            //s="process where name='"+s +"' delete";

             //input process name,kill process,BUT,在win2K里有一个杀死进程的命令:ntsd -q c -p PID,
             //p.StartInfo.FileName = "Taskkill.exe";
             //s = " /f /im  "+s;

            //获得进程当前占用的内存和最大占用内存的大小:
            
             //p.StartInfo.FileName = "wmic.exe";
            // s = " process where caption='" + s + "' get WorkingSetSize,PeakWorkingSetSize";

            //建立新的进程
             //wmic process call create notepad
             //p.StartInfo.FileName = "wmic.exe";
            // s = "process call create " + s;


            //运行服务
             //wmic SERVICE where name="Spooler" call startservice
           // s = "SERVICE where name='" + s + "' call stopservice";
            //中止服务
             //wmic SERVICE where name="Spooler" call stopservice

            //暂停服务
             //wmic SERVICE where name="Spooler" call PauseService

            //删除服务
             //wmic SERVICE where name="test123" call delete

            //在远程机器上创建新进程:
            //wmic /node:192.168.1.10 /user:administrator /password:123456 process call create cmd.exe

                //priority
            //s = " process where caption='" + s + "' get priority";

           //   threadcount
          // s = " process where caption='" + s + "' get threadcount";

           // s = " process where caption='" + s + "' get handle,priority,executablepath,threadcount";//,kernelmodetime,usermodetime,description";
          //  s = "process where caption='" + s + "' get status";

           // pid handlecount threadcount priority workingsetsize
          // s = "process list brief";

            s = "process where caption='" + s + "' get kernelmodetime,usermodetime,description";

          
            //etcetcetc

             p.StartInfo.Arguments = s;

            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
           // p.StartInfo.CreateNoWindow = true;
            try
            {
                p.Start();
                p.StandardInput.WriteLine(s );
                p.StandardInput.WriteLine("exit");
                string ss=p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                p.Close();
                Console.WriteLine(ss);
                Console.ReadLine ();
            }
            catch
            {
                 Console.WriteLine("命令执行失败");
                 Console.ReadLine();
               // return ss;
            }

 

        }

       
    }
}

3直接调用WIN32 API,功能最全面

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

using System.Diagnostics;
using System.Threading;

namespace test_process
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [DllImport("Psapi.dll")]//windows/system32下的dll,不同的功能用不同的dll
        static extern bool GetProcessMemoryInfo(IntPtr hProcess,out PROCESS_MEMORY_COUNTERS lpCreationTime, int cb);
        private void btn1_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process[] processes;
   processes = System.Diagnostics.Process.GetProcesses();
   foreach (System.Diagnostics.Process instance in processes)
   {
      //Console.WriteLine(instance.ProcessName);
       rtb1.Text = instance.ProcessName.ToString();
   }
   //System.Threading.Thread.Sleep(5000);

           
           
        }

 

    }
}

 

 

 

2010.1.5

 

判断用户会话已经结束是Context.User.Identity.Name还是Session?

是用if (Context.User.Identity.Name == null || Context.User.Identity.Name == "")
还是if(Session["xxxxx"]==null) 好呢?

 

(1)如果设置cookie是非持久性的,使用Context.User.Identity.Name == null和Session["xxxxx"]==null判断等效,即会话过期或者关闭网页,这两者都会变成null。
(2)如果设置cookie是持久性的,两者效果不同。Session["xxxxx"]在会话过期或者关闭网页后将变成null,而Context.User.Identity.Name 会根据cookie失效时间到期后变成null的。
结论:到底选择哪个,根据实际需求选择。如果碰到Session容易丢失并且安全要求比较高的话,可以考虑使用SQL Server存储session。

 

 

If Anonymous access is allowed, the User.Identity Name will always be an
empty string. Otherwise it returns the user's login name.

venki

"vvenk" wrote:

> Hello:
>
> I am running IIS 6.0 on a Windows 2003 Server (Standard). I have a simple
> webpage to display the User.Identity Name
>
> <HTML>
> <%=User.Identity.Name%>
> </HTML>
>
> I checked IIS Manager and under Directory Security, Enable Anonymous Access
> is checked.
>
> But the above property results in an empty string.
>
> What am I doing wrong?
>
> Thanks.


///

想实现Windows和Forms混合验证模式:当用户处于局域网时执行Windows验证,在Internet上使用Forms验证

 

 

 

Form验证可以指定一个登录页面,并禁止匿名用户登录,这样用户访问任何页面时,如果没有登录过,会自动转到登录页面,登录成功以后,也能跳到原来的页面。      
     
  步骤:      
  1、修改web.config文件,使其包含如下内容。      
  <system.web>      
                        <authentication     mode="Forms">      
                                <forms     name=".ASPXUSERDEMO"     loginUrl="login.aspx"     protection="All"     timeout="60"     />      
                        </authentication>      
                        <authorization>      
                                <deny     users="?"     />      
                        </authorization>      
  </system.web>      
  上面的配置信息的意思是采用Form验证,登录页面是login.aspx,登录后如果空闲60分钟,必须重新登录。禁止匿名用户使用系统(必须登录)。      
     
  2、编写login.aspx,提供必要的登录内容,并在登录按钮的事件代码中作如下处理。      
  //根据输入的用户名和密码,和数据库中的账户信息进行比较,代码略      
  if(ok)//如果成功      
  {      
                FormsAuthentication.SetAuthCookie(sUserName,false);      
                //如果是从其他页面自动调转到本页面,Request["ReturnUrl"]必然有      
                object     oUrlRet=Request["ReturnUrl"];      
                this.Response.Redirect(oUrlRet==null?"Default.aspx":oUrlRet.ToString());//如果一开始就进入login.aspx,成功以后,应该自动跳到某个页面,如default.aspx      
  }      
  else      
  {      
                //提示登录失败      
  }      
     
  3、在需要注销的时候,执行一下代码,比如在logout.aspx页面中。      
  FormsAuthentication.SignOut();//注销      
  Session.Abandon();//结束Session      
     
  注意引用System.Web.Security      
  Top

7 楼jackjiyu(jack)回复于 2004-04-21 11:48:07 得分 0

我要的二种混合验证模式,如果在Windows验证失败则采用Form验证Top

8 楼wacle([Smile!])回复于 2004-04-21 11:52:23 得分 5

在web.config里设置windows验证,写一个通用的类用来实现Forms验证,程序里调用 

 

2009.12.29

 

在asp.net中试图实现发邮件确认用户名和密码,在web.config中使用smtp服务器和邮箱的情况如下

1.公司邮箱:建一个帐号,用户名和密码在web.config中出现

2.gmail:client.Enablessl=true;client.port=587

3.qq:要注册12天后才能激活smtp功能

4.hotmail:

SMTP服务器:smtp.live.com (端口25或者587)
·是否需要身份识别:是
·是否需要TLS/SSL:是

 5.雅虎(yahoo)免费邮POP3和SMTP开通时默认不开通的,要技术处理,或者注册VIP邮箱,具体方法及POP和SMTP如下:
”步骤一:登录你的yahoo.com.cn账户邮箱
步骤二:打开 http://edit.my.yahoo.com/config/set_popfwd 什么都别动,直接选“提交”,完成。(第一个页面里有个问是否注册开通POP和SMTP,默许是否,改成点是,再点完成,进入下个页面,点提交。就可开通POP和SMTP)

接收邮件(POP)服务器:POP.MAIL.YAHOO.COM.CN
发送邮件(SMTP)服务器:SMTP.MAIL.YAHOO.COM

 

 

2009.12.28

 

win7+iis7+vs.net2008+access 2007开发

 

1>win7对localhost127.0.0.1一律识别为::1,方法,在hosts文件中将::1  127.0.0.1用#注释掉

 

2>access的连接字符串为

 

连接access2007的字符串:

 

数据库库引擎问题,方法一在使用程序的机器上安装access2007,方法二上MS网站下载access2007的相关驱动...


没有密码:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/myFolder/myAccess2007file.accdb;Persist Security Info=False;
有密码:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/myFolder/myAccess2007file.accdb;Jet OLEDB:Database Password=MyDbPassword;

试试如下代码:

VB code
   
   dim cn as connection    ' 连接数据库    set cn = new connection cn.open " Provider=Microsoft.ACE.OLEDB.12.0;Data Source=你数据库路径和名称;Jet OLEDB:Database Password=数据库密码; " if cn.state = adstateopen then msgbox " 连接成功 " else msgbox " 连接失败 end if set cn = nothing

 

3>IIs7上面没有smtp服务啦

 

4>IIs6 iusr_wpg                     IIS 7 IUSR_IUSRS

           iusr_computername            IUSR

 

 

 

2009.12.24

 

QQQ:

 

public   class   PageCar:System.Web.UI.Page  
  {  
  public   DataCar   dcon;  
  public   PageCar()  
  {  
  dcon   =   new   DataCar();  
  //System.Web.  
  }  
  }  
   
  我继承了Page   类,添加了一个成员变量。DataCar是一个具有数据库功能的类。  
  我想在每个aspx页中能获得到这个对象,不知道怎么样获得?

 

AAA:

 

public   static   PageCar   GetPage()  
  {  
  System.Web.HttpContext   ht=System.Web.HttpContext.Current;  
  return   (PageCar)ht.Handler;  
  }

 

 

 

通过实现 IHttpHandler接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。对于这个IHttpHandler接口,我暂时建议大家去关注一下,这个东东非常有用,我们可以利用它来做很多事情,比如,我们可以利用它来防止图片被盗链,或者重写URL。

       说明这个是个入口点,对于Web请求的处理,通过此方法开始,那么我们就知道了Page类的入口点在哪里了。^_^

 

public virtual void ProcessRequest(HttpContext context) 

     不知道大家发现没有,整个是虚函数,那就是我们可以在自己的页面中Override它,那么这个对我们有甚么用呢?主要的一点就是我们控制了生命周期开始的开关。如果我们不需要这个过程,我们就可以Override了,然后不调用后面的过程。

 

2009.12.17

 

 

有关谈判

 

我不是不让你挣钱,只不过你挣的每一分钱,都要通过谈判获得.

 

在Java的Web编程领域,也可以类似方法对诸多技术进行分类。如果把Servlet看成是Web编程的“汇编语言”,那么,建立在Servlet之上的JSP技术就相当于Web编程的“C语言”了。而引入了component模型和事件驱动模式的JSF则更贴近业务端,几乎可以视同Web编程的“C++语言”了。

    Servlet是Java动态网页的鼻祖,为Java Web带来了生成动态内容的能力。Servlet允许程序员干预服务器返回给浏览器的每一个字节,就像汇编语言允许程序员访问CPU寄存器一样。这给了程序员极大的权力,同时也带来了沉重的负担,程序员不但需要生成业务相关的信息,还要给这些信息加上诸如<td></td>之类的HTML标签,以使信息能以适当的方式显示在用户的浏览器上。在我看来,这种“一点技术含量都没有”的事情,不应该浪费程序员宝贵的时间。

    JSP比Servlet向前迈进了一步,至少,程序员可以不用再为静态的HTML内容操心,那些难看的HTML标签现在可以交给工具去处理了。程序员的工作,简化为根据业务逻辑生成动态信息,然后插入到JSP文件的适当位置

    JSF又如何呢?构建在Servlet和JSP技术基础之上的JSF,除了拥有二者的全部优点之外,更引入了组件模型和事件驱动模式,这给Java的Web编程带来了巨大的变革,如同C++在C领域里所带来的震撼一样。

 

初涉JSF的程序员,根本没有必要浪费精力在生命周期晦涩的概念里纠缠,不懂生命周期,照样可以用JSF来编程。花很少的时间看看各个UI组件的功能和属性,然后弄明白各类事件的含义以及应该如何响应这些事件,了解一下JSF可配置的页面导航机制,再搞清楚Managed Bean是什么东西,马上就可以动手编写你的第一个JSF程序了!

 

 

///

 

我在Java 1.0正式问世前就开始学习Java,这么多年过去了,到现在我的Java学习历程还没有停过。我阅读原文书,研究原始码,撰写程序,自认为走得扎实,不奢望一步登天。像我这样老式的学习方式,显然和现在的快餐主义背道而驰。从许多读者的来信和学生的反应中,我发现大多数的人对于Java的学习历程都差不多是:因为公司需要使用Java来进行服务器的计画,所以急急忙忙地学习Java语言,然后就开始使用J2EE的API,开始写起程序来了。如此急就章的学习方式,程序员基础能力根本就不够,对于对象导向精髓不能掌握,对于Java语言内部的运作机制毫无所悉,对API的整体连贯性懵懵懂懂。 

    当然,我们也不好因此责怪程序员,毕竟软件技术变动得太快。公司不可能给程序员足够的训练之后才开始做计画。程序员一下子被指派使用A技术,还没弄懂A技术是怎么回事,又被指派使用B技术,而且都是缝缝补补的方式边学边用,每次都像是全新的开始,遑论技术能量的累积。 

    我很庆幸的是,我不太有这样的困扰。因为我是资讯工程系出身(而且我大学时上课一向很认真),所以理论基础稳固,学习新技术对我来说不是难事。我就读大学时,周遭许多同学都瞧不起数据结构、程序语言、操作系统这些所谓「学院派」的课程,以为这些课程一点都不实用。他们认为到了外面公司,这些信息科系所学的一切都派不上用场,「只要会Visual Basic和数据库就够了」。这种偏差的心态,恐怕会使得他们在知识经济时代吃足了苦头。 

    另外还有一派同学很瞧不起程序设计工作,他们告诉我,像我这样会写程序的人,未来进了社会「还不是被他们这些走管理的人踩在脚下」。所以,他们很轻忽理工课程的学习,甚至还有人相当热衷「成功学」,认为这是迈向成功的快捷方式,却因此把学校的课业弃之不顾。我不敢相信有人竟然如此地本末倒置。 

    前一类的人太过于短视近利,后一类的人太过于好高骛远。我一直很不能理解这些人的想法为什么会这样,或许是因为社会环境的风气使然。我很庆幸我到目前还没被社会的大染缸给玷污了(最好这辈子都不要)。我不认为我的学习方式是一种典范,但是一路走来,倒也颇有进展。许多读者来信问我的学习历程,虽然我个人的学习方式不见得适用于每个人,但或许还有一些参考价值(特别是对于那些有志进入信息行业的年轻学子),我想透过本文简短地叙述一下。 

    我一向是采用先深后广(也称为Bottom-Up,Deep-First)的学习方式。比方说,当我在学A技术的时候,学到一半发现需要B技术的基础,我会到书局找出一两本B技术的书,然后把A先搁着,开始看起B技术的书。甚至,我在技术书籍上看到不太熟悉的英文句构时,我会找出一本英文文法书详细读过。这种先深后广的学习方式,适合学生时代全面地自我能力提升,但不适合业界人士。试想,老板要你开发的ERP系统已经延迟了,你怎有空研究J2EE原文书中的英文文法。先深后广的好处是,学习很扎实;缺点是有时候会偏离主题太多。有一次我发现我原本是要学某软件技术,几次「先深后广」下来,我居然看起老子的道德经了。 

    在技术上,我一直都是一个喜新厌旧的人,很少有软件技术能让我持续研究半年以上,我几乎每隔几个月就要换一次领域。Java 能让我持续这么久,也正是因为Java的领域广。透过Java,我的技术视野变开阔了。这些年来,我换过的 Java 相关领域包括了:虚拟机器、数据库、企业运算、多媒体、2D/3D图学、网络.…..等。 

    我的学习完全是兴趣导向的,所以压力并不大。因为有兴趣,所以我会很想充分理解一切细节。又因为理解,所以许多原本片片断断的知识都可以渐渐互相融会贯通,累积技术能量,理论和实务之间的藩篱被打破了,学习效率倍增。 

    我多年来的学习触觉很敏锐,我常常会抢先一步学好有前瞻性的技术。比方说,Java还在beta时、UML还在0.8时、XML还在draft时,我都已经透过网络下载技术文件回来每天抱着猛读了。而在Java、UML、XML当红之后,我已经差不多把这些技术都摸熟了。 

    至于该学什么技术,我的判断方式是以技术的优劣来决定。优秀而有独到之处的技术是我的最爱,虽然这类的技术不见得会在市场上胜出,但学习这些技术所得到的启发,对于技术能量的累积与能力的提升会有相当大的助益。至于技术差,但市场需求甚殷者,我还是懒得碰。(好吧!我承认我曾因为市场需求的缘故而学过MFC。越清楚MFC的技术细节,越是讨厌它,这真是个不堪回首的经验。) 

    我通常只看英文技术资料,毕竟大部分第一手的技术信息都是以英文来传播。所以我很早就开始阅读英文技术资料。读英文技术资料的好处是,就算没有学到书中的专业知识,至少也累积培养了英文阅读能力,我一直都是抱着这样的态度。一开始是正襟危坐的看英文技术书籍,字典、翻译机随侍在侧;几年下来,现在是躺着看、趴着看、很随性地看英文技术书籍,因为看英文技术书籍变成一种习惯了。现在,我可以用很快的速度吸收英文技术书籍的知识(有人叫我「吃书的机器」,我把这称号当作是一种恭维)。 

    近年来,我花在写程序的时间不多,因为时间对我来说很宝贵,而写程序很浪费时间。对初学者来说,大量地写程序是必要的,但过了某个阶段之后,写程序所带来的技术能力成长已经到了极限,还不如多花一点时间看书,学新技术和新观念。
我从国小时期开始学习写程序,迄今已有近十八年的时间;采取上述的方式密集学习,迄今也有近十年的光景。迩来数年,我接触的领域越来越广,而且学习速度正在加快,我认为是以前那些努力植下的根苗开始成长了。看看现在的我,或许你会觉得羡慕,但回顾这段学习的岁月,何尝不是一条漫长的道路。

 

2009.12.16

 

设定一个合理的时间(比如说5min),如果某个用户在这段时间内没有发送任何请求,就认为它离线的。   

或者让用户隔5min发一个空请求,以此判断用户是否正常在线.

    
一般论坛都这么做的.

 

在Application中添加一个变量。这个变量专门用来保存在线用户(建议用HashTable)。

  
  用户登录时(Session_start())把用户添加到变量中(先检查用户是否在线)。在Session_end()中把用户从变量中删除。  
  如果你要知道在线用户就读这个变量就可以了。  
  如果用户不是正常退出超时后就可以从变量中删除。。  
  限制一个用户多登录就是这么干的。
 

 

2009.12.15

 

通常扩展表空间的方法有添加数据文件、改变数据文件的大小、允许数据文件自动扩展三种方法
1.添加数据文件:
ALTER TABLESPACE MYTBS01 ADD DATAFILE 'E:/BBB.DBF' SIZE 3M;
ALTER TABLESPACE MYTBS01 ADD TEMPFILE 'E:/BBB.DBF' SIZE 3M;
2.改变数据文件大小:
ALTER DATABASE DATAFILE 'E:/AAA.DBF' RESIZE 4M;
3.允许数据文件自动扩展:
ALTER DATABASE DATAFILE 'E:/BBB.DBF' AUTOEXTEND ON NEXT 1M MAXSIZE 20M;

 

用下面的sql语句查一下究竟system表空间中是什么比较占用资源,然后在想办法解决.

  select /*+parallel(t,8)*/
    segment_name, sum(bytes) / (1024 * 1024 * 1024), count(*) ext_quan
     from dba_extents t
    where tablespace_name = 'SYSTEM'
    group by tablespace_name, segment_name
    order by sum(bytes) / (1024 * 1024 * 1024) desc;

--------------- 

eg:

初始空间大小是7GB。在高并发的测试环境下,数据文件增长的非常快。当实际使用的空间超过7GB后,过一定时间就看到死锁。如果一开始就分配一个20GB的表空间,同样的测试(例子和时间)就不会遇到死锁。
我感觉应该是Oracle在申请磁盘空间的过程,导致一个DDM的请求(insert etc)的资源得不到满足,从而导致死锁。不过我没有找到这方面的资料,向大家求助, 谢谢!
-----------------

个人理解, 对于表空间,我们会开启它的自动增加功能,但是这只是保险,以防唯一空间满了,而导致数据库hang住了。 当表空间使用率超过90%的时候,我们会手动在加一个数据文件。

根据楼主描述的情况,猜测,因为数据增常较快,而自动增加的速度有限。 在超过7G的时候,数据就无法写入磁盘文件,然后进程就不停的在那等待数据的写入。 造成了死锁现象。 这个也算是数据库hang住了。 所以当表空间超过90%的时候,我们最好就给它加一个数据文件,或者开始把表空间就设大点。

---------------

如果表空间不够了,我们可以一次添加一个大点的数据块。如果原来是1000m,表空间满了,那我们在添加一个1000m的数据文件,这样数据文件在磁盘的位置是连续的。在IO的读取速度上要快点。如果说,一次加几百兆,那么它的空间不一定是连续的,这样影响IO的读取速度。

表空间一般根据业务来。如果表空间使用率超过了90%,我们就可以添加另一个数据文件了。

 

-------------

 

每次增加2G可以.

将数据保存在多个数据文件中,可以避免一个数据文件过大,数据文件可以放在不同的盘里面,降低竞争和数据丢失的风险,减少I/O读取次数,提高i/o性能。

不过自动增加表空间的功能还是建议开启,假如没有注意到表空间满了,又没有自动增长,数据就不能写入磁盘了。数据库就hang住了. 

------------------ 

 

表空间大小应该根据数据总量,以及增速来定,当然也要考虑存储条件。自动扩展相对方便,但如果不合适(比如:数据量增速很快,导致tablespace一小时扩展一次)就会影响性能了; 反过来,如果不使用自动扩展,直接设置大一些,也有可能好几年用不完,浪费空间,还影响性能

 

---------------------

 

 

 

2009.12.9

 

viewstate,session,cookie的区别

viewstate 

 viewstate的值保存在浏览器的html代码中 , 当浏览器关闭 , 则值消失 , 即viewstate是在本页面之内各函数间进行传值的 , 至于为什么要使用这种方法 , 因为在一个事件发生之后 , 页面可能会刷新 , 如果定义全局变量会被清零 , 所以要使用 viewstate.

 

  1、ViewState是存放在客户端,因此会减轻服务器的负担,是一种比较好的保存数据的方式。
   2、因为ViewState本身的限制,只能保存可以序列化的对象,而且最好不要放太多东西,能省则省,以免在减慢传输的速度,以及加重服务器解析的负担。
   3、我们通过很简单的方式就可以把ViewState里面的值获取出来,我们上面讨论了一些,虽然没有把解析的代码写出来,但是利用 LosFormatter可以得到ViewState反序列化后的对象,那么要解析出来简直是易如反掌;所以ViewState在安全性上面还是比较差,建议不要
存放比较机密和敏感的信息,尽管ViewState可以加密,但是由于ViewState要保存在客户端,天生就有安全性的隐患。
   4、实际从技术角度,ViewState没有任何新意,但是结合服务器控件的设计还是很巧妙的。

 

session

Session采用键值对 , 也就是说ID存放客户端 , 而值放在服务器端 , 是通过用户的ID去找服务器上对应的值 , 这种方式值放置在服务器端 ,有个时间限制 ,时间到则服务器自动释放.

cookie

Cookies则有两种方法 , 一种方法是把值保存在浏览器的变量中 , 当浏览器关闭时结束 , 另一种方法是保存在硬盘中 , 只要时间不过期 , 下次还可使用.

2009.12.1

 

数据挖掘的度量通常分为以下三类:准确性、可靠性和有用性。

准确性、可靠性和有用性

“准确性”是模型与所提供数据中的属性的结果相关联程度的度量值。准确性有各种度量值,但准确性的所有度量值都依赖于所使用的数据。事实上,值可能缺少或近似,数据可能已被多个进程更改。特别是在探索和开发阶段,您可能决定允许数据中存在一定数量的错误,尤其是在数据的特征非常统一时。例如,基于过去的销售额来预测特定商店的销售额的模型可能非常相关,并且非常准确,即使该商店一直使用错误的会计方法。所以,准确性的度量值必须通过评估可靠性来平衡。

 

“可靠性”评估数据挖掘模型处理不同数据集的方法。如果无论提供哪些测试数据,数据挖掘模型都生成相同类型的预测,或者发现相同常规类型的模式,则该数据挖掘模型是可靠的。例如,为使用错误会计方法的商店生成预测的模型将不适用于其他商店,因此该模型是不可靠的。

 

“有用性”包括说明模型是否提供了有用信息的各种指标。例如,将商店位置与销售额相关联的数据挖掘模型可能既是准确的,也是可靠的,但可能是无用的,因为不能通过在同一位置增加更多商店来推广该结果。而且,它没有回答为什么某些位置销售额较高这一基本商业问题。您可能还会发现,如果模型基于数据中的交叉关联,它看起来是成功,但实际上没有意义。

 

2009.11.30

 

所谓asp.net认证的通过与否,其实质就是检测有无发放有效的 Cookie ,使用 Form 也好,运用 Passport 也罢,都是 Cookie 在起作用。也就是说,我们只要把有效的 Cookie 在登录后一次性发放给客户端就得了。

 

///

 

DataSet相当于存储在内存中的数据库,内部含有DataTable二维表,根据数据写入的表名与字段名进行操作。DataSet有其优势所在,我们可以像对待数据库一样对它进行操作,而且类型化后的DataSet也能获得智能感知,排序,过滤的功能,并且可以对它进行序列化,这些特性使它在基于桌面的智能客户端应用程序大有作为。但是相对于Web应用程序来说,它还是有很大的局限性的:由于它是驻留在内存中的小型数据库,所以需要一定的系统开销,若只需要传递一行数据,仍需要创建与传递一个完整的DataSet/DataTable;数据表现形式很差,不够清晰友好;并且要添加自定义的业务验证逻辑非常困难。

 

采用实体类替代DataSet,这个实体类基本上是与数据库表字段一一对应的关系,也会根据业务需求进行增添属性,这就做到了简单的数据持久化,而且表现形式明了,可以用智能感知,加强了OO,占用较少的内存。数据访问层只用ADO.NET与数据库间进行CRUD操作,返回了数据实体或泛型集合。逻辑层写一些业务逻辑需求的方法,调用数据访问层的方法与数据,将业务逻辑的处理与数据访问分开,逻辑清晰,并且当一部分业务变化时,并不会影响到数据访问层。表示层时最终用户看到的地方,表示层不与DAL相联系,它调用BLL的方法,并且会有后台代码进行与页面操作相关的处理,如数据验证、事件等操作。而在数据库中,会有一些存储过程供DAL调用。这样下来的话,整个Web应用程序便于合作开发,方便维护,复用,结构清晰。每层都会有每层独特的应用。三层也有许多演变,但万变不离其宗,目的都是做松耦合的结构,使系统达到可扩展,可复用等优点。

 

那么这里就有一个思考了,既然实体类是做数据持久化的第一选择,而且它是与数据表中的字段一一对应的关系,那么就可以做一个工具将建好的数据库中的表直接生成实体类,开发人员只需要将精力投入在业务逻辑上,不再需要去写大量的不易调试、维护的Sql语句与存储过程(有存储过程即会有逻辑,将逻辑处理放在数据库中就没有了OO),所以这就产生了ORM(对象关系映射),它抛弃了存储过程与ADO.NET,将数据库映射为实体类并写好了CRUD操作,开发人员只用调用它的方法进行如Insert、Update等操作即可。目前最流行的第三方工具是nHibernate,再利用代码生成工具生成Entity与.hbm文件,可以很快建成一套ORM体系,但它是利用反射获取数据的,就会有20%的性能损失,这相对于它所带来的便利,基本可以忽视了。ORM的流行,微软也在寻找自己的ORM,.Net3.5内的LINQ是一个轻量级的ORM框架,而之后号称ADO.Net 2代的ADO.NET Entity Framework是更成功的ORM解决方案,再加上LINQ TO ENTITY的帮助,已在事实上为微软的追随者们指了一条光明大道。个人认为,以理解nHibernate工作原理为辅,学习ADO.NET Entity Framework为主。但是对于还在VS05时代的人,nHibernate只能成为必选了。


这里顺带说一下,随着让开发人员更多的关注业务逻辑上的开发,出现了一条完全针对业务开发的架构分支---领域模型驱动设计(DDD)(有又一个从Java那边搞过来的东西)。以前我们所有的设计都是先建立数据库,然后再根据数据库写代码,也就是数据表驱动设计。而DDD得做法是先编写持久化类和映射文件,然后使用SchemaExport工具等生成数据库架构。当在设计时,我们的领域模型需要改变,只需修改NHibernate结构和应用程序,不需要修改数据库架构,只要利用SchemaExport工具重新生成数据库架构就可以了。当然DDD的架构在.Net应用的还很少,不过在Java国如火如荼的名词势必也会烧到.Net国的。

而后,网站开发因为MVC得影响(包括Java内的早已成熟的Struct、Spring MVC框架的影响),ASP.NET3.5也推出了MVC模板框架(目前已经退出1.0正式版,代码将会开源的形式放出,并且有类似PetShop的采用此框架Oxit博客系统开源可以学习)。Model,View,Conntrol其实更多的是真正解决与界面分离,ASp.NET MVC没有后台代码,没有事件驱动,它有更清晰的职责分离,更方便的单元测试。
Controller与用户进行交互,调用Model,选择View返回;Model进行数据存储、持久化;View展现页面。ASP.NET MVC相对于传统的Web Forms还不够成熟,它更适用于大型的Web开发。

 

 2009.11.20

 

对于性能来说,单机性能高不能代表多机性能高。直接写存储过程的效率是最高的,但是扩展性和伸缩性也是最差的。对于通常项目来说,成功率、稳定性、扩展性、伸缩性我感觉要大于单机的性能。现在服务器很便宜。

 

设计就是为了变化.分层当然不是越多越好,还要无缝的衔接在一起,要成为一个系统工程,那才行,每一层都要发挥那一层存在的效果。

 

用户不关心技术,用户只关心界面操作是否方便友善/功能是否符合业务要求/运行是否稳定/运行性能是否高.

 

2009.11.23

 

维度:如果把维度理解为颜色也可以,如果粒度继续变小,还可以继续分为浅颜色,深颜色等等.颜色是一个维度,而由不同一个分析问题角度的不同粒度组成的表叫维度表.   

度量:不是衡量的单位.是一个事实的数据,如某天某地某人在某时刻销售某种商品的销售数量(或金额).这个销售数量(或金额)才是度量.   

 立方体是作为数据仓库储备库的名称.数据仓库立方体由任意数量的维度定义(并不限于三维,有时数据仓库立方体可能少于三维)   

 多维数据集是OLAP工具的对象,一个数据仓库可以建立很多的多维数据集.多维数据集不仅仅由维度和度量组成,它是由数据源、维度、度量值和分区组成的。   
    
 一般来说,维度表中不存数据,数据都是在事实表中存放的。

 

度量值的理解应该是一个事实的数据,如某天某地某人在某时刻销售某种商品的销售数量是200,那么.这个销售数量200就是度量值.这个200存在那个字段里,这个字段就是度量值字段。

我们的统计都可抽象成一个函数(因为是多维的,无法在现实的三维世界描绘,只能用数据公式抽象):  
  f(x,y,z.......)=??  
  这其中,x,y,z....这些就是维度。  
  统计的指标就是??,也就是度量。不过严格说,??应该是度量的集合,因为一次你可能统计多个指标(这里的比喻不太恰当,我承认)。  
  整个模型(也就是上面的数学公式)就是多维数据集。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值