1.查询View 建立的SQL语句(可人工分析与哪个table的Column相关联)
sp_helptext 视图名
2.直接查询与View相关联的Table以及Column
SELECT *
FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE
SELECT *
FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
2009年7月24日星期五
[+/-] |
用SQL语句查询View 跟Table的对应关系 |
2009年7月17日星期五
[+/-] |
Log4Net五步走 |
本文不是教你全面了解log4net,本文只是希望教会你按步就班,照糊芦画瓢般就会用log4net
1,引入log4net.dll组件
2,建立一个配置文件
两种方法,一种是在Web.Config或App.Config里
加入以下配置节
上面的配置节,复制就可以用了
加入log4net配置内容的定义,这个紧接着上面的内容定义在config文件里就可以了,下面是一个范例:
你懒得写的话,复制上面的内容也可以
不过,还是稍做讲解,log4net配置节的XSD层次如下
看不懂?其实很简单啦
log4net是log4net配置节的根标记
root标记定义一个根级别的记录者,log4net的记录者采用层级组织的, 两个logger,A的名字叫loggerA,B的名字叫loggerA.B的话,那么B就是A的儿子,B会自动继承A的一些定义,例如LEVEL定 义,appender-ref定义等,root就是总的logger,其余定义的logger都是他的后代,都会继承他的设置
包括ROOT在内的每一个LOGGER(ROOT也是一个LOGGER,只不过,他是祖先而已,别的方面,跟其他LOGGER一样),都可以定义Level
level定义记录的日志级别,就是说,你要记录哪个级别以上的日志,级别由高往低依次是:
None
Fatal
ERROR
WARN
DEBUG
INFO
ALL
级别的定义要注意,如果你定义DEBUG,那么低于DEBUG级别以下的信息,将不会记入日志,啥意思呢?就是说,就算你在程序里,用 log.info()来写入一个日志信息,可是你在配置中指定level为DEBUG,由于INFO级别低于DEBUG,所以,不会被记入日志.这样的处 理非常灵活
Logger还有一个配置就是appender-ref了,ref是参照的意思,log4net的架构非常有意思,可扩展性非常高非常值得借鉴,他分为四个要素:
logger
appender
layout
filter
logger是负责日志的记录者
appender提供记录的介质
layout负责把记入的内容格式化
filter负责把内容进行筛选
可以说,整个过程就是一个日志流水线,每个成员负责其中的一个环节
logger发出记录信息,appender接到信息,根据内部的layout配置对记录信息格式化,根据filter决定此信息是否被过滤掉,最后,将其序列化
因此,logger的appender-ref就是定义说,LOGGER要找谁去将内容写入磁盘,流或其他介质,因此,十分重要吧
既然是ref引用,那肯定要定义这个被引用的appender对象了呀
每个appender都代表了一个输出介质
name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质
log4net支持的appender类型有十几种,最常用的有rollingFileAppender,AdoNetAppender,EventLogAppender,FileAppender,分别把日志记入文件,系统日志和数据库
除此之外,appender内的其他参数都用param标记,以key/value形式定义于其内
这里有个小提示,每一个appender,log4net并没有在文档中提出他们需要哪些参数,那么,我们怎么知道呢?
原来,这些param的名称,你可以直接查对应的appender类的属性名即可,例如,使用EventLogAppender时,通过查看类的属性,我们知道其有
LogName,ApplicationName属性,那么,意味着,你可以直接在这个APPENDER的param里加入以下内容:
定义了appender的NAME及TYPE属性,以及使用param为其指定参数后,一个appender就建立了,你可以使用他的名字在 LOGGER的
另外,appender中可以定义可选的layout,layout的定义非常有必要,如果你不想将来看到你的日志会感觉头晕的话,虽然log4net帮你写入日志,但是,日志信息的格式却是我们使用者自行定义的
layout的type参数指定使用哪个类的定义来格式化,常用的有XmlLayout,SimpleLayout,PatternLayout,这个当然要根据你的需要,以及你要产生的格式来选啦,如果你要输出成XML文档格式,你肯定不能用simplelayout吧
layout使用param以KEY/VALUE形式定义其参数
各个Layout类使用的参数当然不一样啦,具体的,你可以去看各个Layout类的属性
其中,PatternLayout可以使用ConversionPattern参数来指定一个格式化字符串
以及可以指定一个Header参数,做为日志开头的字符串,Footer来指定结尾字符串
这里有一个小技巧,日志中开头和结尾总想产生回车符吧,虽然logger在写入一条日志会自动回车,可是Header和FOOTER却不会,咋办?用\n \r吗?(我从别人的BLOG上看到过)经实践,\n\r会原样定改日志,根本不会转换.其实,我们可以用XML实体呀,使 用
就可以在指定位置插入一个回车换行符了
最后,像log4net的文档中说的那样,如果你不想你的日志文件变得很大,使读写的性能下降的话,建议你还是分级管理日志,把粒度变小点,也就是 说,除了定义ROOT外,最后,对每一个模块或每一个实体,依据用途,目的,定义各自的LOGGER配置,这样的好处是日志被分散了,日志文件增长就没那 么快了.每一个LOGGER的结构跟ROOT是一模一样的,这里不再叙述了.像前面说的那样,如果你相让日志产生层级关系,你可以跟他们的NAME属性像 C#中的namespace那样命名就可以了
要说明的是,LOGGER的定义是非必须的,只是一种建议罢了,Log4net的配置中,除了必须定义一个ROOT和一个APPENDER外,其他的都是可选的
另一种配置log4net的方法,是在单独的XML文件中配置,这个时候,只要把log4net标记中的内容复制过来就行了,不需要configSections
3,在应用程序代码中读取配置
这一步非常简单,你可以在应用程序集的assemblyInfo.cs文件中读取log4net配置
对于WINFORM应用程序,你可以加入
[assembly:log4net.Config.DOMConfigurator()]或
[assembly:log4net.Config.XmlConfigurator()]
对于WEBFORM你可以加入
[assembly:log4net.Config.DOMConfigurator(ConfigFile="web.config",Watch=true)]
注意:如果使用NUNIT测试的朋友,要用生成后事件,copy "$(ProjectDir)app.config" "$(TargetPath).config"
4.在应用程序中获取ILog对象
在需要使用LOGGER功能的类中,引入log4net空间,为类加入静态只读成员(静态的目的是只用一个对象,只读是防止误改)
private static readonly ILog logger=LogManager.GetLogger(typeof(类))
这里就可以获取配置文件中与类名同名的LOGGER对象了
5,写入日志
很简单 logger.Deub(写入的内容)
其他的还有info,warn,error等,很容易理解的
[+/-] |
NUnit使用方法 |
NUnit使用方法
转载地址》http://hi.baidu.com/ztf704/blog/item/6050aaaf06298bcf7dd92a39.html
NUnit的官方网站下载地址为:www.nunit.org,如果是结合.net使用,最好下载win.net版。我一开始下载的是win版本的,结果无论我怎么加载.net的dll或是exe文件都不对,而且花费了大量的时间查找资料,修改NUnit的配置文件,结果还是不行。幸好后来突然发现是NUnit的版本问题。
在vs2005中新建一个class library工程,add 一个class,定义一个取数组最大值的函数,具体定义如下:
public class Class1
{
public int FindMax(int[] arr)
{
int i;
int max=arr[0];
for(i =1; i
if(arr[i]>max)
{
max =arr[i];
}
}
return max;
}
}
第二步:就该编写test code了。add 一个新的class,命名为Class1Test。再编写code之前,需要给该工程添加一个NUnit的引用,具体为:右键点击 reference->add reference->选择nunit.framework,然后在Class1Test文件中添加一个引用:using NUnit.Framework。当然,添加引用的前提是已经安装了NUnit了。下面我们就可以开始code test了。
[TestFixture]
public class Class1Test
{
[Test]
public void FindMaxTest()
{
int[] arr1 ={ 1, 3, 10, 4 };
int[] arr2 ={ 3, 10, 4, 1 };
int[] arr3 ={ 1, 10, 4, 3 };
int[] arr4 ={ -1, -3, -5 };
Class1 myclass =new Class1();
Assert.AreEqual(10, myclass.FindMax(arr1));
Assert.AreEqual(10, myclass.FindMax(arr2));
Assert.AreEqual(10, myclass.FindMax(arr3));
Assert.AreEqual(-1, myclass.FindMax(arr4));
}
}
我们先来解析一下这个类吧:[TestFixture]是NUnit的一个重要的属性,可以说是NUnit的一个标记吧,它向编译工具“宣布”:我要测试啦。[Test]一般用在一个函数之前,而且这个函数必须是public类型,而且无返回值,即void。
好了,我们的类与测试类都已经写完了(也可以把测试函数与源代码写在一个文件中,但我相信没有几个人会喜欢那样的方式的)。编译好之后,可以得到一个dll文件。
打开NUnit,点击file->open,选择刚刚编译的dll文件,这样就把文件加载到NUnit了,在它的界面的左边,我们可以看到刚 才编写的测试函数FindMaxTest,选择工程项目,或是文件,或是测试函数,然后点击界面右边的Run,如果一路绿灯,OK,我们的测试通过拉!
NUnit属性
TestFixture 属性
本属性标记一个类包含测试。做为一个测试的类,这个类还有一些限制:
1、必须是Public,否则NUnit看不到它的存在。
2、它必须有一个缺省的构造函数,否则是NUnit不会构造它。
3、构造函数应该没有任何副作用,因为NUnit在运行时经常会构造这个类多次。
Test 属性
Test属性用来标记一个类(已经标记为TestFixture)的某个方法是可以测试的。
1、测试方法必须为Public。
2、测试方法必须没有参数。
3、测试方法不返回任何参数。
SetUp/TearDown 属性
用于在测试开始时初始化,和测试后清除。标记为SetUp/TearDown 属性方法必须为public。
ExpectedException属性
这里是一个验证这个假设的测试。在这个属性里,你可以在执行过程中捕获你期望的异常类型。如果这个方法在没有抛出期望异常的情况下完成了,这个测试失败。使用这个属性帮助我们写程序员测试验证边界条件(Boundary Conditions)。
Ignore 属性
由于种种原因,有一些测试我们不想运行。当然,这些原因可能包括你认为这个测试还没有完成,这个测试正在重构之中,这个测试的需求不是太明确。但你有不想破坏测试,不然进度条可是红色的哟。怎么办?使用Ignore属性。你可以保持测试,但又不运行它们。
TestFixtureSetUp / TestFixtureTearDown属性
有时,一组测试需要的资源太昂贵。例如,数据库连接可能是一个关键资源,在一个test fixture的每个测试中,打开/关闭数据库连接可能非常慢。这就是我在开始提到的问题。
如何解决?NUnit有一对类似于前面讨论的SetUp/TearDown的属性: TestFixtureSetUp/TestFixtureTearDown。正如他们名字表明的一样,这些属性用来标记为整个test fixture初始化/释放资源方法一次的方法。
例如,如果你想为所有test fixture的测试共享相同的数据库连接对象,我们可以写一个打开数据库连接的方法,标记为TestFixtureSetUp属性,编写另外一个关闭数据库连接的方法,标记为TestFixtureTearDown属性。
Explicit属性
本属性忽略一个test和test fixture,直到它们显式的选择执行。如果test和test fixture在执行的过程中被发现,就忽略他们。所以,这样一来进度条显示为黄色,因为有test或test fixture忽略了。
Category属性
对于测试来说,你有的时候需要将之分类,此属性正好就是用来解决这个问题的。
测试生命周期
FixtureSetUp
SetUp
Test Method1
TearDown
SetUp
Test Method2
TearDown
FixtureTearDown
Assert Class
提供了一系列的 static methods,让你可以用来验证主要程序的结果与预期的是否一样。
常用的 Assert 断言有:
1、Assert.AreEqual(object expected,object actual[string message]):验证两个对象是否相等,如Assert.AreEqual(2,1+1);
2、Assert.AreSame(object expected,object actual[string message]):验证两个引用是否指向同一对象,如
object expected=new object();
object actual =expected;
Assert.AreSame(expected,actual);
3、Assert.IsFalse(bool):验证bool值是否为false,如Assert.IsFalse(false);
4、Assert.IsTrue(bool):验证bool值是否为true,如Assert.IsTrue(true);
5、Assert.IsNotNull(object):验证对象是否不为null,如Assert.IsNotNull(new object());
6、Assert.IsNull(object):验证对象是否为null,如Assert.IsNull(null);
2009年7月3日星期五
[+/-] |
德语常用动词 Kommen |
kommen
m.
Ⅰ (V.i.)(sein)
m.
Ⅰ (V.i.)(sein)
⑴;,;去
⑵席,
⑶(zu jmdm. ~) 拜访,...那去
⑷(jmdm. ~)(某种)待
⑸(auf jmdn.[etw.] ~) 落,摊
⑹ 轮,挨
⑺ (etw.kommt) 临,临;,
⑻ (etw. kommt üher jmdn.)袭击,攫住
⑼(es kommt zu etw.) ,爆
⑽ 被...,被置...,
⑾ (zu etw. ~) ,获,
⑿ (um etw. ~) 丧,去
⒀[口](etw. kommt (jmd( n )jmd( m )))价值,花费
⒁ 自,自
⒂ (aus etw. ~)消
⒃ (auf (hinter)etw. ~) 探,,想
⒄ (unter etw. ~)被...压死