Nhibernate学习之起步篇-1

1. 学习目的
学习Nhibernate基础知识。掌握Nhibernate的配置方法,实现对单表的简单操作,如:创建表,查询,添加,删除,修改。
2. 开发环境+前期准备
开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition
前期准备: Nhibernate框架,我用的目前最新版NHibernate-1.2.0.CR1, 下载地址:        http://downloads.sourceforge.net/nhibernate/NHibernate-1.2.0.CR1.msi?modtime=1172161735&big_mirror=0
3. 开发步骤:
1).双击下载下来的NHibernate-1.2.0.CR1.msi,将其安装到某个目录,我的目录为: E:\download project\orm\nhibernate.,打开该目录,即可以看到bin,doc,src三个子目录,分别为Realse好的dll或者exe目录,文档说明目录,和源程序目录.
2).打开visual studio 2005,创建类库项目NhibernateSample1
3).在解决方案管理其中,右键点击引用-添加引用,在选项卡种选择浏览,设定查找范围为:E:\download project\orm\nhibernate\bin,添加对Nhibernate.dll,log4net.dll, Iesi.Collections, HashCodeProvider四个dll的引用.
4).打开SQL Server Management Studio,创建数据库nhibernate。
5).在解决方案管理器中添加hibernate.cfg.xml文件。将下面代码粘贴到此文件: 

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
    
<session-factory name="NHibernate.Test">
        
<!-- properties -->
        
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        
<property name="connection.connection_string">Server=127.0.0.1;initial catalog=nhibernate;uid=sa;pwd=123;</property>
        
<property name="show_sql">false</property>
        
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
        
<property name="use_outer_join">true</property>
        
<!-- mapping files -->
        
<mapping assembly="NhibernateSample1" />
    
</session-factory>    
</hibernate-configuration>

 该文件是Nhibernate的配置文件,其中connection.connection_string为数据库连接字符串,Dialect项因为我用的是SQL2005,所以为:MsSql2005Dialect注意:<mapping assembly=”NhibernateSample1”/>表示映射NhibernateSample1程序集下的所有类,所以以后不要需要Configuration.AddClass(..)了;

6).添加类文件:User.cs,添加代码

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

namespace NhibernateSample1
{
    
public class User
    
{
        
private int _id;
        
private string _name;
        
private string _pwd;
        
/// <summary>
        
/// 编号
        
/// </summary>

        public virtual int Id
        
{
            
get
            
{
                
return _id;
            }

            
set
            
{
                _id 
= value;
            }

        }


        
/// <summary>
        
/// 名称
        
/// </summary>

        public virtual string Name
        
{
            
get
            
{
                
return _name;
            }

            
set
            
{
                _name 
= value;
            }

        }


        
/// <summary>
        
/// 密码
        
/// </summary>

        public virtual string Pwd
        
{
            
get
            
{
                
return _pwd;
            }

            
set
            
{
                _pwd 
= value;
            }

        }

    }

}

 6).编写User类的映射配置文件:User.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  
<class name="NhibernateSample1.User,NhibernateSample1" table="Users" lazy="false">
    
<id name="Id" column="Id" unsaved-value="0">
      
<generator class="native" />
    
</id>
    
<property name="Name" column="Name" type="string" length="64" not-null="true" unique="true"></property>
    
<property name="Pwd"  column="Pwd"  type="string" length="64" not-null="true"></property>
  
</class>
</hibernate-mapping>

  注意:该映射文件的属性中的生成操作必须为:嵌入的资源.

7).编写管理ISession对象的辅助类: NHibernateHelper.cs,代码为:

using System;
using System.Web;
using NHibernate;
using NHibernate.Cfg;

namespace NhibernateSample1
{
    
public sealed class NHibernateHelper
    
{
        
private static readonly ISessionFactory sessionFactory;

        
static NHibernateHelper()
        
{
            sessionFactory 
= new Configuration().Configure(@"E:\my project\nhibernate study\simle 1\NHibernateStudy1\NhibernateSample1\hibernate.cfg.xml").BuildSessionFactory();
        }


        
public static ISession GetCurrentSession()
        
{             
            ISession currentSession 
= sessionFactory.OpenSession();
            
return currentSession;
        }


        
public static void CloseSessionFactory()
        
{
            
if (sessionFactory != null)
            
{
                sessionFactory.Close();
            }

        }

    }

}

:因为我用的是单元测试,所以这里的配置文件路径写成固定的了。如果换成windows或者Web程序,可以直接去掉该路径。

8) 编写测试CRUD:UserFixue

using System;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
namespace NhibernateSample1
{
    
public class UserFixure
    
{
        
private ISession session;
        
public UserFixure()
        
{
            
        }

        
/// <summary>
        
/// 创建表
        
/// </summary>

        public bool ExportTable()
        
{
            
try
            
{
                Configuration cfg 
= new Configuration().Configure(@"E:\my project\nhibernate study\simle 1\NHibernateStudy1\NhibernateSample1\hibernate.cfg.xml");
                session 
= NHibernateHelper.GetCurrentSession();
                ITransaction transaction 
= session.BeginTransaction();
                
new SchemaExport(cfg).Create(truetrue);
                transaction.Commit();
                
return true;
            }

            
catch(Exception ex)
            
{
                
throw ex; 
            }

            
finally
            
{
                session.Close();
            }

        }

        
/// <summary>
        
/// 添加
        
/// </summary>

        public int Add()
        
{
            
try
            
{
                User u 
= new User();
                u.Name 
= Guid.NewGuid().ToString();
                u.Pwd 
= "124";
                session 
= NHibernateHelper.GetCurrentSession();
                ITransaction transaction 
= session.BeginTransaction();
                session.Save(u);
                transaction.Commit();
                
return u.Id;
            }

            
catch (Exception ex)
            
{
                
throw ex;
            }

            
finally
            
{
                session.Close();
            }

        }

        
/// <summary>
        
/// 更新
        
/// </summary>
        
/// <param name="uid"></param>

        public bool Update(int uid)
        
{
            
try
            
{
                session 
= NHibernateHelper.GetCurrentSession();
                ITransaction transaction 
= session.BeginTransaction();
                User u 
= session.Load(typeof(User), uid) as User;
                
if (u != null)
                
{
                    u.Name 
= "updatedName";
                    session.SaveOrUpdate(u);
                    transaction.Commit();
                    u 
= session.Load(typeof(User), uid) as User;
                    
if (u.Name == "updatedName")
                    
{
                        
return true;
                    }

                }

                
return false;
            }

            
catch (Exception ex)
            
{
                
throw ex;
            }

            
finally
            
{
                session.Close();
            }

        }

        
/// <summary>
        
/// 删除
        
/// </summary>
        
/// <param name="uid"></param>
        
/// <returns></returns>

        public bool Delete(int uid)
        
{
            
try
            
{
                session 
= NHibernateHelper.GetCurrentSession();
                ITransaction transaction 
= session.BeginTransaction();
                User u 
= session.Get(typeof(User), uid) as User;
                
if (u != null)
                
{
                   session.Delete(u);
                   transaction.Commit();
                   u 
= session.Get(typeof(User), uid) as User;
                   
if (u == null)
                   
{
                       
return true;
                   }

                }

                
return false;
            }

            
catch (Exception ex)
            
{
                
throw ex;
            }

            
finally
            
{
                session.Close();
            }

        }

        
public System.Collections.IList Query()
        
{
            
try
            
{
                session 
= NHibernateHelper.GetCurrentSession();
                ITransaction transaction 
= session.BeginTransaction();
                System.Collections.IList list
= session.CreateQuery("select u from User as u").List();
                transaction.Commit();
                
return list;
            }

            
catch (Exception ex)
            
{
                
throw ex;
            }

            
finally
            
{
                session.Close();
            }

        }

    }

}


9)创建新单元测试项目: TestProject1,添加NhibernateSample1的引用
10)创建单元测试类: UnitTest1.cs,并输入如下代码:
using System;
using System.Text;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NhibernateSample1;

namespace TestProject1
{
    
/// <summary>
    
/// UnitTest1 的摘要说明
    
/// </summary>

    [TestClass]
    
public class UnitTest1
    
{
        
public UnitTest1()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }


        
其他测试属性

        
int uid;
        [TestMethod]
        
public void TestMethod1()
        
{
            UserFixure userFixure 
= new UserFixure();
            Assert.IsTrue(userFixure.ExportTable());            
        }

        [TestMethod]
        
public void TestMethod2()
        
{
            UserFixure userFixure 
= new UserFixure();
            uid 
= userFixure.Add();
            Assert.IsTrue(uid
>0);
        }

        [TestMethod]
        
public void TestMethod3()
        
{
            UserFixure userFixure 
= new UserFixure();
            Assert.IsTrue(userFixure.Update(uid));
        }

        [TestMethod]
        
public void TestMethod4()
        
{
            UserFixure userFixure 
= new UserFixure();
            Assert.IsTrue(userFixure.Delete(uid));
        }

        [TestMethod]
        
public void TestMethod5()
        
{
            UserFixure userFixure 
= new UserFixure();
            Assert.IsTrue(userFixure.Query().Count
>0);
        }

    }

}


11)在菜单-测试-加载元数据文件 选择NHibernateStudy1.vsmdi,然后按顺序执行TestMethod1-TestMethod5,全部成功!
4.总结
 通过使用Nhibernate,基本上可以使开发人员不在接触繁琐的数据库表和数据库操作代码,您唯一需要关心的就是如何设计好类,让这些类满足您的业务需求。从扩展性来说Nhinernate具有非常好的扩展性。与代码生成比较,Nhibernate更改数据表结构对代码的影响要远远小于代码生成。
如果您想下载Demo:/Files/jillzhang/simle.rar
作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2007-03-21 22:51 Robin Zhang 阅读(15013) 评论(59)  编辑 收藏 网摘 所属分类: ORM

  回复  引用  查看    
#1楼2007-03-21 22:56 | flyingchen      
好,期待下文。长期关注!:)
  回复  引用  查看    
#2楼2007-03-21 23:12 | JesseZhao      
nhibernate我用的是封装他的castleproject的activerecord,感觉也是很方便。不过感觉效率方面没有nbear好
  回复  引用  查看    
#3楼[楼主]2007-03-21 23:14 | jillzhang      
@JesseZhao
我原来也用Nbear,不过最近对Nhibernate源码感兴趣,所以准备系统学习一下

  回复  引用  查看    
#4楼2007-03-21 23:17 | Phinecos(洞庭散人)      
不错,
  回复  引用  查看    
#5楼2007-03-21 23:32 | Clingingboy      
支持,直接看hibernate就好了,呵呵
  回复  引用  查看    
#6楼2007-03-22 05:40 | Jeffrey Zhao      
最近在了解iBATIS.net中
  回复  引用  查看    
#7楼2007-03-22 08:16 | 补丁      
对NHibernate的性能一直持谨慎态度....
  回复  引用  查看    
#8楼2007-03-22 08:35 | 队长      
多谢博主,准备借您的文章入门了!
  回复  引用  查看    
#9楼[楼主]2007-03-22 09:02 | jillzhang      
@补丁
性能和扩展就像天平的两端。Nhibernate能实现这样强大的功能,肯定依赖于反射,性能肯定没有Ado.Net好,但是不是所有的系统都要求性能,性能也不单纯的依赖于数据访问方式,更适合分布的系统才真正有价值,所以有人喜欢数据表的横向切割-数据表分区镜像。这些在常理看来都是浪费性能的做法,但是如果数据达到一定量的时候,这相反会提高性能。因为这样,只要我增加服务器就能解决问题。

  回复  引用    
#10楼2007-03-22 09:13 | 茄子[未注册用户]
nhibernate 是一个不错的工具
  回复  引用  查看    
#11楼2007-03-22 09:33 | zhuweisky      
可以试试DataRabbit数据访问框架,使用起来比NHibernate简单,也不需要配置。http://www.cnblogs.com/zhuweisky/archive/2007/03/19/680013.html">http://www.cnblogs.com/zhuweisky/archive/2007/03/19/680013.html
  回复  引用    
#12楼2007-03-22 10:20 | je[未注册用户]
@zhuweisky
恐怕这里的人更喜欢用开源的产品

  回复  引用  查看    
#13楼2007-03-22 10:30 | 补丁      
@jillzhang
相对于NHibernate提供的功能和扩展性,我对其性能真的是不满意
大道理大家都明白,用到实际中,很多条件制约了框架的选择
看看NBear的性能,再看看NHibernate...

  回复  引用    
#14楼2007-03-22 12:32 | Axel[未注册用户]
NHibernate性能不会有问题,关键是如何去做,如何去实现。反射难道是问题吗?只要你不要一直去反射。就是数据库连接一样。如果没有连接池,代价不是一样很大。
  回复  引用    
#15楼2007-03-22 12:35 | Axel[未注册用户]
Ado vNext 一样也用反射。反射不会是问题。
  回复  引用  查看    
#16楼[楼主]2007-03-22 13:04 | jillzhang      
这个问题可谓是耿古不变的争论话题。一句话,看业务需求。
  回复  引用  查看    
#17楼2007-03-22 13:17 | 金色海洋(jyk)      
代码好多呀,比我自己写的代码多多了。

八个配置文件xml的是要手动去写吗?太麻烦了呀,100多个表怎么办呀?

  回复  引用  查看    
#18楼2007-03-22 14:03 | Zhongkeruanjian      
反射不是性能的原因。

用MyGeneration生成XML文件

  回复  引用  查看    
#19楼[楼主]2007-03-22 14:21 | jillzhang      
最近这么多人做广告。BS
  回复  引用  查看    
#20楼2007-03-22 15:08 | Leepy      
我还是更喜欢用NBear.
  回复  引用  查看    
#21楼2007-03-22 16:50 | reonlyrun      
不错,正在学习这个东东,支持你继续写下去
  回复  引用    
#22楼2007-03-22 20:55 | Gary[未注册用户]
感觉和Java的Hibernate没什么区别,配制文件太麻烦,限制太多,还是谨慎着用
  回复  引用    
#23楼2007-03-23 14:30 | harry[未注册用户]
我的试了一下,出这个错误Unknown entity class: DAL.User
不能识别实体类。为什么?

  回复  引用    
#24楼2007-03-23 17:26 | harry[未注册用户]
请问
我想用三层结构,
我持久类user和User.hbm.xml放在model里,将hibernate.cfg.xml和其它类放在DAL里。
出错了这个错误Unknown entity class: Model.User 不能识别实体类。
请问我应该怎么做?

  回复  引用  查看    
#25楼[楼主]2007-03-23 17:56 | jillzhang      
@harry
你的hinernate.cfg.xml中有<mapping assembly="Model" />么 ?
没有加上或者在初始化Configuration后cfg.AddClass(..);

  回复  引用  查看    
#26楼[楼主]2007-03-24 09:43 | jillzhang      
@harry
还有注意你的hbm.xml映射文件生成类型必须为嵌入的资源

  回复  引用    
#27楼2007-03-26 11:06 | harry[未注册用户]
@jillzhang
你好。我的hinernate.cfg.xml是这样的
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<!-- properties -->
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Server=127.0.0.1;initial catalog=test;uid=sa;pwd=123456;</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="use_outer_join">true</property>
<!-- mapping files -->
<mapping assembly="Model" />
</session-factory>
</hibernate-configuration>

hbm.xml映射文件生成类型也是嵌入的资源
但好像还是不可以!

  回复  引用    
#28楼2007-04-04 16:10 | 新手[未注册用户]
请问一下,我的程序可以更新,删除,却不能插入,错误提示:
could not insert: [DAL.Inventory][SQL: INSERT INTO Inventory (Qty) VALUES (?)]
显示出了插入的值是空值,但是映射的对象的属性是存在值的,为什么生成sql语句时,值就变空了呢?
我用的1.2版

  回复  引用  查看    
#29楼[楼主]2007-04-04 16:36 | jillzhang      
@新手
是不是映射文件有问题?

  回复  引用    
#30楼2007-04-06 19:51 | 啊啊[未注册用户]
还是不错的 正好我们要根据业务需要判断持久层的处理方案
  回复  引用  查看    
#31楼[楼主]2007-04-06 20:27 | jillzhang      
@啊啊
赫赫,多谢支持

  回复  引用    
#32楼2007-04-09 15:23 | 追鱼[未注册用户]
lz你好:
我安装好工具,在目录文件夹找不到D:\NHibernate\bin\net-2.0\HashCodeProvider.dll的dll文件是什么原因啊?

  回复  引用  查看    
#33楼[楼主]2007-04-09 15:40 | jillzhang      
@追鱼
在nhibernate安装文件夹的bin目录里面有此dll

  回复  引用  查看    
#34楼2007-04-11 12:08 | Bryant      
是非常感谢LZ,通过这个简单的实例,让我初步知道是咋个回事了!
谢谢

@追鱼
目录文件夹 D:\NHibernate\bin\net-1.1\HashCodeProvider.dll
这个引用也是可以的!

  回复  引用    
#35楼2007-04-14 23:25 | JAMES[未注册用户]
请问这个命名空间有什么用?using NHibernate.Tool.hbm2ddl;
  回复  引用  查看    
#36楼[楼主]2007-04-16 20:43 | jillzhang      
@JAMES
new SchemaExport(cfg).Create(true, true);

  回复  引用    
#37楼2007-05-29 09:30 | qiekong[未注册用户]
我在win2003,sql server2000,vs2003下
配置写在 web.config中,
当执行 sessionFactory = new Configuration().Configure().BuildSessionFactory();发生了下面的错误,
希望抽空帮忙解决一下
邮箱:qiehuaiyan@163.com
先谢了!

未处理的“NHibernate.HibernateException”类型的异常出现在 nhibernate.dll 中。


其他信息: problem parsing configuration : System.Xml.Schema.XmlSchemaException: 元素“urn:nhibernate-configuration-2.2:hibernate-configuration”有无效的子元素“urn:nhibernate-configuration-2.2:sesion-factory”。应为“urn:nhibernate-configuration-2.2:session-factory”。 , (1, 68)处发生了错误。
at System.Xml.XmlValidatingReader.InternalValidationCallback(Object sender, ValidationEventArgs e)
at System.Xml.Schema.Validator.SendValidationEvent(XmlSchemaException e, XmlSeverityType severity)
at System.Xml.Schema.Validator.SendValidationEvent(XmlSchemaException e)
at System.Xml.Schema.Validator.ValidateElementContent(XmlNodeType nodeType)
at System.Xml.Schema.Validator.Validate()
at System.Xml.Schema.Validator.Validate(ValidationType valType)
at System.Xml.XmlValidatingReader.ReadWithCollectTextToken()
at System.Xml.XmlValidatingReader.Read()
at System.Xml.XmlLoader.LoadCurrentNode()
at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
at System.Xml.XmlDocument.Load(XmlReader reader)
at NHibernate.Cfg.Configuration.Configure(XmlTextReader reader)

  回复  引用    
#38楼2007-08-21 19:50 | 请教[未注册用户]
各位兄弟有遇到过 flush during cascade is dangerous 这个错误吗?我qq: 190410824 邮箱 :tanyuanzhen@126.com有遇到过一起讨论
  回复  引用  查看    
#39楼2007-09-06 16:07 | 徐少侠      
博主同志

本人最近关心ORM的东西
不过一直有个疑惑

在.net中要这个东西干吗?
今天早上发了个感慨贴,不过估计是要遭ORM前辈扁的。

没办法,冒死到这里来请教一下。

  回复  引用    
#40楼2007-10-08 17:23 | 小鸟哥哥[未注册用户]
好东西
  回复  引用    
#41楼2007-11-17 03:16 | lc329857895[未注册用户]
谢谢LZ
  回复  引用    
#42楼2007-11-26 22:10 | wbb[未注册用户]
请问这是什么原因:
测试方法 TestProject1.UnitTest1.TestMethod3 引发异常: NHibernate.ObjectNotFoundException: No row with the given identifier exists: 0, of class: NhibernateSample1.User。

还有这个
Assert.IsTrue 失败。
初学这个郁闷ING 望不吝赐教

  回复  引用  查看    
#43楼[楼主]2007-11-27 08:31 | jillzhang      
@wbb
必须安装nunit才能单元测试

  回复  引用  查看    
#44楼2007-12-10 16:37 | 不够谦虚      
在NHibernate中能不能执行数据库存储过程?
如果数据库结构改变了,这个框架如何应对?
新手,希望楼主不吝赐教!

  回复  引用  查看    
#45楼[楼主]2008-01-18 09:30 | jillzhang      
@不够谦虚
数据库结构变化?
ORM是O在前,你提出这个问题,还是没能理解ORM的目的,
ORM是让系统面向对象,而不是面向关系数据库
数据库更改的前提是对象实体有更改,此时更改映射文件可以解决你说的问题

  回复  引用  查看    
#46楼2008-02-28 22:31 | Chris Liu      
小喇叭是怎么弄上去的
  回复  引用  查看    
#47楼2008-05-04 15:08 | Leon916      
博主,我按照你文章上面的例子写了一短程序,但是就是不能在数据库上建立表,但是下载下来你的程序却可以建立User表。不知道为什么我的不行,我测试了一下:数据库连接正常,希望博主能够解答,谢谢!
  回复  引用    
#48楼2008-06-06 15:30 | obbit[未注册用户]
我晕..我得也不行.错误和@harry一样..怎么解决

  回复  引用    
#49楼2008-07-04 16:30 | windfighter[未注册用户]
请教个问题,能不能介绍从数据库生成持久层的一些工具和使用方法
  回复  引用  查看    
#50楼2008-10-24 22:07 | wjx      
能帮我调试一个简单的用asp+hibernet做的添加案例
QQ:595465394 邮箱:wangjixiang00@126.com

  回复  引用    
#51楼2009-04-13 15:54 | roc1988[未注册用户]
Robin 你好!
错误信息:
测试方法 TestProject1.UnitTest1.TestMethod2 引发异常: NHibernate.ADOException: cannot open connection ---> System.Data.SqlClient.SqlException: 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错)。

我用的是vs2008 和SQL Server 2005 Express。
谢谢,我的邮箱是yueweipeng@gmail.com

  回复  引用    
#52楼2009-04-13 16:53 | roc1988[未注册用户]
#42楼 2007-11-26 22:10 | wbb [未注册用户] 请问这是什么原因:
测试方法 TestProject1.UnitTest1.TestMethod3 引发异常: NHibernate.ObjectNotFoundException: No row with the given identifier exists: 0, of class: NhibernateSample1.User。

还有这个
Assert.IsTrue 失败。
初学这个郁闷ING 望不吝赐教
#43楼 [楼主]2007-11-27 08:31 | jillzhang @wbb
必须安装nunit才能单元测试

(我装上了nunit之后还是提示相同的问题,谢谢楼主~~~)

  回复  引用  查看    
#53楼2009-04-23 14:07 | 子风      
留个脚印,有时间再学习。
  回复  引用  查看    
#54楼2009-05-27 11:08 | fdseptember      
厄 那文档有中文的吗?



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 683067




相关文章:

相关链接: