NHibernate Step by Step(二) 单表操作
接着第一期,我们继续。
为了方便学习测试,从今天开始我将使用MS Test来进行测试,这样就避免了在一个Console工程里不停地添加、注释代码了。
提示:为了在VS2005IDE中获得NHibernate配置文件的代码提示,请将你的$NHibernate/src/NHibernate下的nhibernate-configuration-2.0.xsd、nhibernate-mapping-2.0.xsd拷贝到/Program Files/Microsoft Visual Studio 8/Xml/Schemas下,这样当你编辑配置文件或者映射文件时,你将得到完整的代码提示。
VS2003请拷贝到/Program Files/Microsoft Visual Studio .NET 2003/Common7/Packages/schemas/xml下。
VS2003请拷贝到/Program Files/Microsoft Visual Studio .NET 2003/Common7/Packages/schemas/xml下。
NHibernat内部使用log4net来进行日志操作,今天我们将在配置文件中添加log4net的配置,这样我们在测试的时候将可以清楚地看到NHibernate是如何进行工作的。
应用配置文件修改如下:































请注意添加:

关于log4net的使用,我们这里不做详细的讲解,有兴趣的请参考如下地址:
接着,我们在上次的工程组中添加一个名为Test1的测试项目,将其中的不需要的手动测试去掉。请注意:除了NHibernate/Model引用外,还需要添加如下3个引用:
log4net,System.Data,System.Xml.
修改代码如下:








































































我们在测试的开始对Configuration/SessionFactory/Log进行初始化。在每一个Test的开始获取一个新的session,每一个Test结束后即关闭session。
添加如下一个Get测试:









我们在前面曾经插入一条名为“Jackie Chan”的记录,现在在Test Manager中选中TestRead,运行,ok,Passed!
我们使用了session.Get来获取记录,方法如下:
很简单,一目了然。
我们切换到Test Results窗口,双击测试成功的TestRead方法,这时将会有一个详细的测试结果显示出来,NHibernate将使用我们指定的log4net来输出详细信息,我们仔细观察:
2006-04-15 13:52:13,000 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - opened session
2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - loading [Person#1]
2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - attempting to resolve [Person#1]
2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - object not resolved in any cache [Test.Model.Person#1]
2006-04-15 13:52:13,015 [AdpaterExeMgrThread1] DEBUG NHibernate.Persister.EntityPersister [(null)] - Materializing entity: Test.Model.Person#1
2006-04-15 13:52:13,078 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Opened new IDbCommand, open IDbCommands :1
2006-04-15 13:52:13,078 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Building an IDbCommand object for the SqlString: SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=:id
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.Int32Type [(null)] - binding '1' to parameter: 0
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] INFO NHibernate.Loader.Loader [(null)] - SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=@p0
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=@p0
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - @p0 = '1'
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.Connection.DriverConnectionProvider [(null)] - Obtaining IDbConnection from Driver
2006-04-15 13:52:13,859 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Opened Reader, open Readers :1
2006-04-15 13:52:13,859 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - processing result set
2006-04-15 13:52:13,875 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - result row: 1
2006-04-15 13:52:13,875 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - Initializing object from DataReader: 1
2006-04-15 13:52:13,875 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - Hydrating entity: Test.Model.Person#1
2006-04-15 13:52:13,906 [AdpaterExeMgrThread1] DEBUG NHibernate.Type.StringType [(null)] - returning 'Jackie Chan' as column: name0_
2006-04-15 13:52:13,906 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - done processing result set (1 rows)
2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Driver.NHybridDataReader [(null)] - running NHybridDataReader.Dispose()
2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Closed Reader, open Readers :0
2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Closed IDbCommand, open IDbCommands :0
2006-04-15 13:52:13,937 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Loader [(null)] - total objects hydrated: 1
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - resolving associations for: [Test.Model.Person#1]
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - done materializing entity [Test.Model.Person#1]
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - initializing non-lazy collections
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - closing session
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - disconnecting session
2006-04-15 13:52:13,953 [AdpaterExeMgrThread1] DEBUG NHibernate.Connection.ConnectionProvider [(null)] - Closing connection
2006-04-15 13:52:13,968 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionImpl [(null)] - transaction completion
在其中,我们可以发现:
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - SELECT person0_.id as id0_, person0_.name as name0_ FROM Person person0_ WHERE person0_.id=@p0
2006-04-15 13:52:13,093 [AdpaterExeMgrThread1] DEBUG NHibernate.SQL [(null)] - @p0 = '1'
对了,就是这里,NHibernate替我们构造了一条sql语句,并添加一个参数,然后将我们在代码中赋的id值1来填充,这样,一条完整的可以执行的sql语句产生了。
请注意:在产生sql语句的前面,NHibernate构造了一个IDBCommand,然后在sql语句产生完全后,获取连接,通过一个DataReader来填充Persion对象给我们使用,这就是NHibernate替我们做的事,是不是很简单啊?(真的很简单吗??看看源代码吧!!)
请仔细研究输出的日志。
如法炮制,我们添加另外3个Test,完成单个表的全部CRUD操作,如下完整代码:





















































































































































Delete的方法如下:
直接传入需要delete的对象即可。
好了,基本的操作都完成了,是不是很Easy?
好了,这一篇就讲这么多,我们下次再接着练习。
好了,这一篇就讲这么多,我们下次再接着练习。
Step by Step,顾名思义,是一步一步来的意思,整个教程我将贯彻这一理念。
任何建议或者批评,请e:
abluedog@163.com

评论
强烈支持!
回复
引用
查看
@javac
你可以使用nunit,基本上差别不大。之所以使用MS Test,是因为ms既然在ide里包含了测试框架,那么不管我们喜欢还是不喜欢,它肯定会获得比较广泛的应用——这也是没办法的事。 回复 引用 查看
你可以使用nunit,基本上差别不大。之所以使用MS Test,是因为ms既然在ide里包含了测试框架,那么不管我们喜欢还是不喜欢,它肯定会获得比较广泛的应用——这也是没办法的事。 回复 引用 查看
#6楼 2006-04-16 21:18 SOSOS's BLog
建议:希望abludedog把每次做好的教程也提供下载,这样更能帮助入门者,更好提高大家的水平!谢谢
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
支持。。。。。。。
谢谢abluedog!!!!!!!! 回复 引用 查看
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
支持。。。。。。。
谢谢abluedog!!!!!!!! 回复 引用 查看
[TestClass]等等这些属性都怎么来的。作者也没说清楚啊。......
可能因为我也没用ms test吧,所以总觉得不知所云,突然就出来了个test1,说类也不是类,说工程也不是工程,说应用程序也不是应用程序,而且还那么属性不知从哪里来的饿。。..搞的我赶紧下了个nunit,还没开始用呢,,,正一头雾水中。.. 回复 引用 查看
可能因为我也没用ms test吧,所以总觉得不知所云,突然就出来了个test1,说类也不是类,说工程也不是工程,说应用程序也不是应用程序,而且还那么属性不知从哪里来的饿。。..搞的我赶紧下了个nunit,还没开始用呢,,,正一头雾水中。.. 回复 引用 查看
@SOSOS's BLog
@mzl
目前还是以文章为主,测试程序都是说明性的,等这个系列完了后,我会再重新整理出来一份文档及示例代码,抱歉了。
@和地球人一起
抱歉让您理解不清楚了。
我在前面已经说明是使用的vs2005演示的,可能我忘了一点,我使用的是team suite版,如果您使用的是professional版或者更低的版本,可能不会包含完整的测试框架。
至于mstest,我想您看一下sdk就应该很清楚了,我在这里就不费笔墨在nhibernate外的地方了。 回复 引用 查看
@mzl
目前还是以文章为主,测试程序都是说明性的,等这个系列完了后,我会再重新整理出来一份文档及示例代码,抱歉了。
@和地球人一起
抱歉让您理解不清楚了。
我在前面已经说明是使用的vs2005演示的,可能我忘了一点,我使用的是team suite版,如果您使用的是professional版或者更低的版本,可能不会包含完整的测试框架。
至于mstest,我想您看一下sdk就应该很清楚了,我在这里就不费笔墨在nhibernate外的地方了。 回复 引用 查看
类初始化方法 Test1.UnitTest1.MyClassInitialize 引发异常。NHibernate.MappingException: NHibernate.MappingException: The dialect was not set. Set the property hibernate.dialect. ---> NHibernate.HibernateException: The dialect was not set. Set the property hibernate.dialect.
-----------------
怎么处理啊,大哥? 回复 引用 查看
-----------------
怎么处理啊,大哥? 回复 引用 查看
楼主为什么我的这里没有那条sql语句
我的测试结果如下:
2006-08-30 17:54:18,796 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Environment [(null)] - NHibernate 1.2.0.1001 (1.2.0.Alpha1)
2006-08-30 17:54:18,890 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Environment [(null)] - Bytecode provider name : lcg
2006-08-30 17:54:18,906 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Environment [(null)] - Using reflection optimizer
2006-08-30 17:54:18,906 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - Searching for mapped documents in assembly: Test.Model
2006-08-30 17:54:18,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - Found mapping documents in assembly: Test.Model.Person.hbm.xml
2006-08-30 17:54:19,703 [AdpaterExeMgrThread1] INFO NHibernate.Dialect.Dialect [(null)] - Using dialect: NHibernate.Dialect.MsSql2000Dialect
2006-08-30 17:54:19,843 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.HbmBinder [(null)] - Mapping class: Test.Model.Person -> Person
2006-08-30 17:54:19,890 [AdpaterExeMgrThread1] DEBUG NHibernate.Cfg.HbmBinder [(null)] - Mapped property: Id -> id, type: Int32
2006-08-30 17:54:19,906 [AdpaterExeMgrThread1] DEBUG NHibernate.Cfg.HbmBinder [(null)] - Mapped property: Name -> name, type: String
2006-08-30 17:54:19,921 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - processing one-to-many association mappings
2006-08-30 17:54:19,921 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - processing one-to-one association property references
2006-08-30 17:54:19,921 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - processing foreign key constraints
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Dialect.Dialect [(null)] - Using dialect: NHibernate.Dialect.MsSql2000Dialect
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Connection.ConnectionProviderFactory [(null)] - Intitializing connection provider: NHibernate.Connection.DriverConnectionProvider
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Connection.ConnectionProvider [(null)] - Configuring ConnectionProvider
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.SettingsFactory [(null)] - Optimize cache for minimal puts: False
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.SettingsFactory [(null)] - Query language substitutions: {}
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.SettingsFactory [(null)] - cache provider: NHibernate.Cache.HashtableCacheProvider
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.SettingsFactory [(null)] - Using Isolation Level: ReadCommitted
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - instantiating and configuring caches
2006-08-30 17:54:19,968 [AdpaterExeMgrThread1] INFO NHibernate.Impl.SessionFactoryImpl [(null)] - building session factory
2006-08-30 17:54:19,968 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionFactoryImpl [(null)] - instantiating session factory with properties: {hibernate.connection.driver_class=NHibernate.Driver.SqlClientDriver, hibernate.dialect=NHibernate.Dialect.MsSql2000Dialect, hibernate.connection.provider=NHibernate.Connection.DriverConnectionProvider, hibernate.connection.isolation=ReadCommitted, hibernate.use_reflection_optimizer=true, show_sql=true, hibernate.connection.connection_string=Server=localhost;Initial Catalog=NHibernate;Integrated Security=SSPI}
2006-08-30 17:54:20,125 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionFactoryObjectFactory [(null)] - initializing class SessionFactoryObjectFactory
2006-08-30 17:54:20,125 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionFactoryObjectFactory [(null)] - registered: 356b1fa6d48642e198ec974f094c7385(unnamed)
2006-08-30 17:54:20,125 [AdpaterExeMgrThread1] INFO NHibernate.Impl.SessionFactoryObjectFactory [(null)] - no name configured
2006-08-30 17:54:20,203 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Entity.AbstractEntityLoader [(null)] - Static select for entity Test.Model.Person: SELECT person0_.id as id0_, person0_.name as name0_0_ FROM Person person0_ WHERE person0_.id=:id
2006-08-30 17:54:20,203 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Entity.AbstractEntityLoader [(null)] - Static select for entity Test.Model.Person: SELECT person0_.id as id0_, person0_.name as name0_0_ FROM Person person0_ WHERE person0_.id=:id
2006-08-30 17:54:20,203 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Entity.AbstractEntityLoader [(null)] - Static select for entity Test.Model.Person: SELECT person0_.id as id0_, person0_.name as name0_0_ FROM Person person0_ WHERE person0_.id=:id
2006-08-30 17:54:20,203 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Entity.AbstractEntityLoader [(null)] - Static select for entity Test.Model.Person: SELECT person0_.id as id0_, person0_.name as name0_0_ FROM Person person0_ WHERE person0_.id=:id
2006-08-30 17:54:20,250 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionFactoryImpl [(null)] - Instantiated session factory 回复 引用 查看
我的测试结果如下:
2006-08-30 17:54:18,796 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Environment [(null)] - NHibernate 1.2.0.1001 (1.2.0.Alpha1)
2006-08-30 17:54:18,890 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Environment [(null)] - Bytecode provider name : lcg
2006-08-30 17:54:18,906 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Environment [(null)] - Using reflection optimizer
2006-08-30 17:54:18,906 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - Searching for mapped documents in assembly: Test.Model
2006-08-30 17:54:18,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - Found mapping documents in assembly: Test.Model.Person.hbm.xml
2006-08-30 17:54:19,703 [AdpaterExeMgrThread1] INFO NHibernate.Dialect.Dialect [(null)] - Using dialect: NHibernate.Dialect.MsSql2000Dialect
2006-08-30 17:54:19,843 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.HbmBinder [(null)] - Mapping class: Test.Model.Person -> Person
2006-08-30 17:54:19,890 [AdpaterExeMgrThread1] DEBUG NHibernate.Cfg.HbmBinder [(null)] - Mapped property: Id -> id, type: Int32
2006-08-30 17:54:19,906 [AdpaterExeMgrThread1] DEBUG NHibernate.Cfg.HbmBinder [(null)] - Mapped property: Name -> name, type: String
2006-08-30 17:54:19,921 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - processing one-to-many association mappings
2006-08-30 17:54:19,921 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - processing one-to-one association property references
2006-08-30 17:54:19,921 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - processing foreign key constraints
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Dialect.Dialect [(null)] - Using dialect: NHibernate.Dialect.MsSql2000Dialect
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Connection.ConnectionProviderFactory [(null)] - Intitializing connection provider: NHibernate.Connection.DriverConnectionProvider
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Connection.ConnectionProvider [(null)] - Configuring ConnectionProvider
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.SettingsFactory [(null)] - Optimize cache for minimal puts: False
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.SettingsFactory [(null)] - Query language substitutions: {}
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.SettingsFactory [(null)] - cache provider: NHibernate.Cache.HashtableCacheProvider
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.SettingsFactory [(null)] - Using Isolation Level: ReadCommitted
2006-08-30 17:54:19,953 [AdpaterExeMgrThread1] INFO NHibernate.Cfg.Configuration [(null)] - instantiating and configuring caches
2006-08-30 17:54:19,968 [AdpaterExeMgrThread1] INFO NHibernate.Impl.SessionFactoryImpl [(null)] - building session factory
2006-08-30 17:54:19,968 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionFactoryImpl [(null)] - instantiating session factory with properties: {hibernate.connection.driver_class=NHibernate.Driver.SqlClientDriver, hibernate.dialect=NHibernate.Dialect.MsSql2000Dialect, hibernate.connection.provider=NHibernate.Connection.DriverConnectionProvider, hibernate.connection.isolation=ReadCommitted, hibernate.use_reflection_optimizer=true, show_sql=true, hibernate.connection.connection_string=Server=localhost;Initial Catalog=NHibernate;Integrated Security=SSPI}
2006-08-30 17:54:20,125 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionFactoryObjectFactory [(null)] - initializing class SessionFactoryObjectFactory
2006-08-30 17:54:20,125 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionFactoryObjectFactory [(null)] - registered: 356b1fa6d48642e198ec974f094c7385(unnamed)
2006-08-30 17:54:20,125 [AdpaterExeMgrThread1] INFO NHibernate.Impl.SessionFactoryObjectFactory [(null)] - no name configured
2006-08-30 17:54:20,203 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Entity.AbstractEntityLoader [(null)] - Static select for entity Test.Model.Person: SELECT person0_.id as id0_, person0_.name as name0_0_ FROM Person person0_ WHERE person0_.id=:id
2006-08-30 17:54:20,203 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Entity.AbstractEntityLoader [(null)] - Static select for entity Test.Model.Person: SELECT person0_.id as id0_, person0_.name as name0_0_ FROM Person person0_ WHERE person0_.id=:id
2006-08-30 17:54:20,203 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Entity.AbstractEntityLoader [(null)] - Static select for entity Test.Model.Person: SELECT person0_.id as id0_, person0_.name as name0_0_ FROM Person person0_ WHERE person0_.id=:id
2006-08-30 17:54:20,203 [AdpaterExeMgrThread1] DEBUG NHibernate.Loader.Entity.AbstractEntityLoader [(null)] - Static select for entity Test.Model.Person: SELECT person0_.id as id0_, person0_.name as name0_0_ FROM Person person0_ WHERE person0_.id=:id
2006-08-30 17:54:20,250 [AdpaterExeMgrThread1] DEBUG NHibernate.Impl.SessionFactoryImpl [(null)] - Instantiated session factory 回复 引用 查看
NHibernateStepbyStep(二)单表操作 NHibernateStepbyStep(二)单表操作接着第一期,我们继续。为了方便学习测试,从今天开始我将使用MS...
[引用提示]大冰引用了该文章, 地址: http://www.cnblogs.com/hanbing768/archive/2007/07/15/818679.html 回复 引用 查看
[引用提示]大冰引用了该文章, 地址: http://www.cnblogs.com/hanbing768/archive/2007/07/15/818679.html 回复 引用 查看