ORMAPPING出来已经很多年了,之前一直有关注,但一直没有应用到项目中去,众所周知,ORMAPPING的性能是很大一个问题,虽然它节省代码量,为程序员做了很多工作。而且ORMAPPING主要应用在JAVA领域,.NET领域用到的少之又少,最近公司要做一个内部的资产管理系统,我就打算用ORMAPPING来做,对几种ORMAPPING的框架我进行了比较,第一,nhibernate这个我相信大家比较熟悉了,nhibernate在JAVA领域已经应用相当广泛了,nhibernate最持久层性能稳定,本来我也打算采用,但后来选择放弃,主要是他生成的一堆XML我很头疼,不大好管理,这里很多人会给nhibernate辩解,我一直以为nhibernate是JAVA的东西,害怕性能问题。还有一个ORMAPPING的框架ibatis,这个其实也不错,但最终我选择了XPO,XPO是著名软件公司devexpress的产品,它的应用简单方便,好了,废话少说,进入正题,今天就是讲ORMAPPING在XPO框架中的应用。
在讲应用之前,先解析一下ORMAPPING的概念有助于读者更好的理解代码,ORMAPING其实是object ralation mapping其实就是对象关系映射,说白了就是把类映射到表,或者说把表在程序里看成一个对象,更好的面向对象。ORMAAPING最重要的一些概念持久层,持久化工厂等等,各位自己去找资料,在此不详细说明。
下面我做一个例子,实现表的新增修改查询。
这里我建两个表,一个是主表,一个是从表,它们之间是一对多的关系。基于ORMAPPING的概念,我先建两个类,继承于XPOBJECT。

Code
namespace MyFirstMapping
{
public class User:XPObject
{
public User(Session session) : base(session) { }
private string accountName;
private string realName;
private string userPwd = "U";
public string AccountName
{
get { return accountName; }
set { accountName = value; }
}
public string RealName
{
get { return realName; }
set { realName = value; }
}
public string UserPwd
{
get { return userPwd; }
set { userPwd = value; }
}
[Association("MyRalation", typeof(UserDetail))]
public XPCollection UserDetailss { get { return GetCollection("UserDetailss"); } }
}
}

Code
namespace MyFirstMapping
{
public class UserDetail:XPObject
{
public UserDetail(Session session) : base(session) { }
private string accountName;
private string address;
public string AccountName
{
get { return accountName; }
set { accountName = value; }
}
public string Address
{
get { return address; }
set { address = value; }
}
[Association("MyRalation")]
public User user;
}
}
注意这两个类,我在构造函数里注入了Session,同时建立了他们的关系。这样他们之间的映射关系就建立好了。
现在我们对app.config添加数据库的配置信息,然后我们需要建一个类,用来创建SESSION

Code
namespace MyFirstMapping
{
using DevExpress.Xpo;
using DevExpress.Xpo.DB;
/// <summary>
/// 这个类是用于创建新的Session
/// </summary>
public class SessionOperation
{
public Session CreateSession(string conn)
{
AutoCreateOption option = AutoCreateOption.DatabaseAndSchema;
IDataStore connectionProvider = XpoDefault.GetConnectionProvider(ConfigurationManager.ConnectionStrings[conn].ConnectionString, option);
IDataLayer dataLayer = new SimpleDataLayer(connectionProvider);
Session session = new Session(dataLayer);
return session;
}
}
}
这样我们的Session工厂就建立好了,需要用session的时候直接到这个工厂里取就行了,大家注意 AutoCreateOption option = AutoCreateOption.DatabaseAndSchema; 我这里选择的是DatabaseAndSchema,各位可以根据自己需要进行创建,接下来我们开始对表进行增删改查的操作。

Code
//多表新增
private void userNewButton_Click(object sender, EventArgs e)
{
SessionOperation sessionOperation = new SessionOperation();
Session session = sessionOperation.CreateSession("MyCon");
User user = new User(session);
user.AccountName = txtAccount.Text;
user.RealName = txtUserName.Text;
/*这里是单表操作的代码,由于我修改成多表操作了,这里标注一下
* User user = new User(session);
user.AccountName = txtAccount.Text;
user.RealName = txtUserName.Text;
* user.Save();
*/
UserDetail userDetail1 = new UserDetail(session);
userDetail1.AccountName = txtAccount.Text;
userDetail1.Address = txtAddress.Text;
user.UserDetailss.Add(userDetail1);
user.Save();
MessageBox.Show("新增成功");
}
很简单吧,其实ORMAPPING关键是概念的掌握,本人写BLOG比较懒,呵呵,贴上代码,希望能起到抛砖引玉的作用~~~~~~~~~~~
下载请点这里
posted @ 2009-02-27 15:37 刘湛滔 阅读(1544) 评论(10)
编辑
最近一个朋友让我帮他做一个小功能,其实就是把WORD文档里的内容存到数据库里去,可以实现搜索并转EXCEL的功能,需求很简单,想不到加上部署折腾了我一个星期,我先把需求详细描述一下:
提供一个WORD文档的样板,这个WORD文档里大部分是文本,其中插入了一个EXCEL表格,WORD的内容如下:
房地产价值监证确认书
编号:(2009交)价确字第 号
邓征兵 :
根据您的委托,我单位派遣专业评估人员对位于 大祥区翠园 的房地产(《房屋所有权证》)号为 0013210 ,房屋所有权人 邓文兵 房屋所在层次/总层数 6 / 8 ,进行了现场勘估。
评定估价对象房屋的结构等级为 砖混 ,建成年代为 90年代末 ,成新度为 9成 。
确认房屋价值如下表:
这里有个EXCEL表格
监证目的:交易课税
备注:
邵阳市房产产权监理处价格管理科
现场评估:黄生忠
审 批:
2009 年 2 月 10 日
就是把这个文件中相关内容存入数据库,同时要能够实现查询,比如根据委托人查询,同时要把查询的结果能转EXCEL。
功能就是这样的,先把其中用到的技术点挑出来,
一读WORD里的内容,这个并不难;

Code
Microsoft.Office.Interop.Word.ApplicationClass wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();
object file = nam;
object nullobj = System.Reflection.Missing.Value;
try
{
Microsoft.Office.Interop.Word.Document doc = wordApp.Documents.Open(
ref file, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj);
//doc.ActiveWindow.Selection.WholeStory();
//doc.ActiveWindow.Selection.Copy();
//IDataObject data = Clipboard.GetDataObject();
fileContent = doc.Content.Text; //这里读取所有的WORD里的文本
}
二读WORD文件里EXCEL里的数据,这个是比较困难的,我试了很多方式,也没有查到相关的资料,最后在国外论坛上看见了VB的代码,然后修改了一下,可以用;

Code
foreach (Microsoft.Office.Interop.Word.InlineShape ish in doc.InlineShapes)
{
if (ish.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapeEmbeddedOLEObject)
{
if (ish.OLEFormat.ProgID == "Excel.Sheet.8")
{
//ish.OLEFormat.DoVerb(ref nullobj);
ish.OLEFormat.Activate();
Microsoft.Office.Interop.Excel.Workbook objEXl = (Microsoft.Office.Interop.Excel.Workbook)ish.OLEFormat.Object;
buildArea = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[2, 2] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
if (buildArea != "")
{
buildUnitPrice = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[2, 3] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
buildCountPrice = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[2, 4] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
userKind = "住宅";
}
else
{
buildArea = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[3, 2] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
buildUnitPrice = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[3, 3] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
buildCountPrice = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[3, 4] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
userKind = "非住宅";
}
objEXl.Application.Quit();
}
}
}
三正则表达式的应用,我要获取比如邓征兵这个委托人,我不可能用SUBSTRING来取数据吧,这样效果太低了;

Code
Regex reg1 = new Regex("[\u4E00-\u9FFF]+", RegexOptions.IgnoreCase);
userName = reg1.Match(doc.Paragraphs[4].Range.Text).Value.Trim();//委托人
Regex reg2 = new Regex("评估人员对位于([\\S|\\s]+)的房地产", RegexOptions.IgnoreCase);
HouseAddr = reg2.Match(fileContent).Groups[1].Value.Trim();//房子地址doc.Paragraphs[5].Range.Text
Regex reg3 = new Regex("号为([\\S|\\s]+),房屋所有权人", RegexOptions.IgnoreCase);
propertyNo = reg3.Match(fileContent).Groups[1].Value.Trim();//房产证号doc.Paragraphs[5].Range.Text
Regex reg4 = new Regex("房屋所有权人([\\S|\\s]+)房屋所在层次", RegexOptions.IgnoreCase);
propertyUser = reg4.Match(fileContent).Groups[1].Value.Trim();//房屋所有权人doc.Paragraphs[5].Range.Text
Regex reg5 = new Regex("层次/总层数([\\S|\\s]+),进行了现场勘估", RegexOptions.IgnoreCase);
buildCount = reg5.Match(fileContent).Groups[1].Value.Trim();//层次/总层数doc.Paragraphs[5].Range.Text
Regex reg6 = new Regex("建成年代为([\\S|\\s]+),成新度为", RegexOptions.IgnoreCase);
buildYear = reg6.Match(fileContent).Groups[1].Value.Trim();//建成年代doc.Paragraphs[6].Range.Text
Regex reg7 = new Regex("现场评估:([\\S|\\s]+)审", RegexOptions.IgnoreCase);
evaluateUser = reg7.Match(fileContent).Groups[1].Value.Trim();//现场评估doc.Paragraphs[13].Range.Text
Regex reg8 = new Regex("[\\d|\\s]+年[\\d|\\s]+月[\\d|\\s]+日", RegexOptions.IgnoreCase);
evaluateDate = reg8.Match(fileContent).Value.Trim();//doc.Paragraphs[15].Range.Text.Trim()时间
四转EXCEL,网上很多人都是用datagrid直接转EXCEL,这样只能倒出第一页的数据,不适合我的程序;

Code
DataTable dt = GetAllData();
StringWriter sw = new StringWriter();
sw.WriteLine("序号\t委托方\t产权人\t产权证号\t房屋座落\t建筑面积(平方米)\t建成年代\t层次/层数\t使用性质\t评估单价(元/平方米)\t评估总价值(元)\t现场评估人员\t评估日期\t备注");
if (dt != null)
{
foreach (DataRow dr in dt.Rows)
{
sw.WriteLine(dr["id"] + "\t" + dr["userName"] + "\t" + dr["propertyUser"] + "\t" + dr["propertyNo"] + "\t" +
dr["HouseAddr"] + "\t" + dr["buildArea"] + "\t" + dr["buildYear"] + "\t" + dr["buildCount"] + "\t" +
dr["userKind"] + "\t" + dr["buildUnitPrice"] + "\t" + dr["buildCountPrice"] + "\t" + dr["evaluateUser"]
+ "\t" + dr["evaluateDate"] + "\t" + "");
}
}
sw.Close();
Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");
Response.ContentType = "application/excel";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
Response.Write(sw);
Response.End();
五,KILL进程,我在查看WORD里EXCEL里的数据的时候,无法关闭EXCEL,需要用程序来关闭;

Code
public void KillProcess(string processName)
{
System.Diagnostics.Process myproc = new System.Diagnostics.Process();
//得到所有打开的进程
try
{
foreach (Process thisproc in Process.GetProcessesByName(processName))
{
if (!thisproc.CloseMainWindow())
{
if (thisproc != null)
thisproc.Kill();
}
}
}
catch (Exception Exc)
{
throw Exc;
// msg.Text+= "杀死" + processName + "失败!";
}
}
详细技术点请下载我的代码,点这里下载
posted @ 2009-02-11 14:54 刘湛滔 阅读(3160) 评论(26)
编辑