一个简单的ORM制作大概需要以下几个类:

  1. SQL执行类
  2. CURD操作类
  3. 其他酱油类

先从SQL执行类说起,可能会涉及数据库的迁移等问题,所以需要定义一个接口以方便迁移到其他数据库,

事务没提供命名,若需要命名可修改为可变参数,IHelper代码如下:

internal interface IHelper:IDisposable
{
int ExecuteQuery(string txt, IEnumerable<IDataParameter> ps, bool issp);//用于执行INSERT,UPDATE
object ExectueScalar(string tex, IEnumerable<IDataParameter> ps, bool issp);//执行COUT()
IDataReader ExectueReader(string tex, IEnumerable<IDataParameter> ps, bool issp);//执行SELECT
void BegTran();//开始事务
void RollBack();//回滚
void Commit();//提交
string CreateSql(string select, string tbname, string where, string orderby, int size, int index);//数据库的不同,产生的SQL也可能不同,所以必须提供不同的生成方案
IDataParameter Cp(string name, object value);//创建参数
string GetIdStr { get; }//获取INSERT产生ID的SQL代码,可能各个数据库不太相同
string ParStr(string name);//参数标示符,比如MSSQL:@NAME, MYSQL:?NAME,ODBC直接返回?无命名
}

以上为我个人能思考到的数据库差异和基础功能,若有其他请大家指教

通用MsSql帮助类代码如下:

class Mssql:IHelper
{
SqlCommand cmd;
SqlConnection con;
SqlTransaction tran;
internal Mssql(string constr)
{
con = new SqlConnection(constr);//test
cmd = new SqlCommand();
cmd.Connection = con;
}
void SetCmd(string str, IEnumerable<IDataParameter> ps, bool issp)
{
cmd.CommandText = str;
cmd.CommandType = issp ? CommandType.StoredProcedure : CommandType.Text;
cmd.Parameters.Clear();
foreach (var n in ps) { cmd.Parameters.Add(n); }
}
void CloseCon(){if (con.State == ConnectionState.Open) { con.Close(); }}
void OpenCon() { if (con.State == ConnectionState.Closed) { con.Open(); } }
int IHelper.ExecuteQuery(string str, IEnumerable<IDataParameter> ps, bool issp)
{
try
{
SetCmd(str, ps, issp);
OpenCon();
return cmd.ExecuteNonQuery();
}
finally{if(tran==null){CloseCon();}}
}
object IHelper.ExectueScalar(string str, IEnumerable<IDataParameter> ps, bool issp)
{
try
{
SetCmd(str, ps, issp);
OpenCon();
return cmd.ExecuteScalar();
}
finally{if(tran==null){CloseCon();}}
}
IDataReader IHelper.ExectueReader(string str, IEnumerable<IDataParameter> ps, bool issp)
{
SetCmd(str, ps, issp);
OpenCon();
return cmd.ExecuteReader(tran==null?CommandBehavior.CloseConnection:CommandBehavior.Default);
}
void IHelper.BegTran() { OpenCon(); tran = con.BeginTransaction(); cmd.Transaction = tran; }
void IHelper.Commit() { if (tran != null) { tran.Commit(); con.Close(); tran = null; } }
void IHelper.RollBack() { if (tran != null) { tran.Rollback(); con.Close(); tran = null; } }
string IHelper.CreateSql(string select, string tbname, string where, string orderby, int size, int index)
{
StringBuilder sb = new StringBuilder();//分页需要排序
sb.Append("SELECT ");
if (index == ) { sb.Append("TOP " + size + " "); }
sb.Append(select+" FROM ");
if (index > ){sb.Append("(SELECT ROW_NUMBER() OVER(" + (!string.IsNullOrEmpty(orderby)?"ORDER BY "+orderby:string.Empty) + ") AS ROWID," + select + " FROM ");}
sb.Append(tbname);
sb.Append(!string.IsNullOrEmpty(where) ? " WHERE " + where : string.Empty);
if (index > )
{
sb.Append(") AS " + tbname + " WHERE ROWID BETWEEN " + ((index - ) * size + ) + " AND " + size * index);
}
else
{
sb.Append(!string.IsNullOrEmpty(orderby) ? " ORDER BY " + orderby : string.Empty);
}
return sb.ToString();
}
IDataParameter IHelper.Cp(string name, object value) { return new SqlParameter(name, value); }
string IHelper.ParStr(string name) { return "@"+name;}
string IHelper.GetIdStr { get { return "SELECT @@IDENTITY"; } }
void IDisposable.Dispose()
{
CloseCon(); con.Dispose(); cmd.Dispose();
}
}

MsSql2005开始支持MARS,默认为关闭状态,也可以重写个支持MARS的Help,默认开启2个连接,一个用于查询一个用于无事物的执行,代码如下:

class MsMars:IHelper//自动开启mars,连接0为查询连接,连接1为执行无事务连接,事务连接为新连接
{
static SqlConnectionStringBuilder ssb;
static SqlConnection[] globalCon;
static object ck = new object();
public MsMars(string constr)
{
if (ssb == null)
{
ssb = new SqlConnectionStringBuilder(constr); ssb.MultipleActiveResultSets = true;
}
}
static SqlCommand GetCmd(int i = )
{
if (ssb == null) { throw new Exception("连接未初始化..."); }
if (i >=
) { return new SqlConnection(ssb.ConnectionString).CreateCommand(); }
if (globalCon != null) { return globalCon[i].CreateCommand(); }
lock (ck)
{
if (globalCon != null) { return globalCon[i].CreateCommand(); }
globalCon = new SqlConnection[] { new SqlConnection(ssb.ConnectionString), new SqlConnection(ssb.ConnectionString) };
globalCon[].Open(); globalCon[].Open();
}
return globalCon[i].CreateCommand();
}
SqlCommand cmd;
void SetCmd(string txt, IEnumerable<IDataParameter> ps, bool issp)
{
cmd.Parameters.Clear();
cmd.CommandText = txt;
cmd.CommandType = issp ? CommandType.StoredProcedure : CommandType.Text;
cmd.Parameters.AddRange(ps.ToArray());
}
public int ExecuteQuery(string txt, IEnumerable<IDataParameter> ps, bool issp)
{
cmd = cmd ?? GetCmd();
SetCmd(txt, ps, issp);
return cmd.ExecuteNonQuery();
}
public object ExectueScalar(string txt, IEnumerable<IDataParameter> ps, bool issp)
{
cmd = cmd ?? GetCmd();
SetCmd(txt, ps, issp);
return cmd.ExecuteScalar();
}
public IDataReader ExectueReader(string txt, IEnumerable<IDataParameter> ps, bool issp)
{
cmd =cmd??GetCmd();
SetCmd(txt, ps, issp);
return cmd.ExecuteReader();
}
public void BegTran()
{
cmd = GetCmd();
cmd.Transaction = cmd.Connection.BeginTransaction();
}
public void RollBack()
{
cmd.Transaction.Rollback();
cmd.Connection.Close();cmd.Dispose();
}
public void Commit()
{
cmd.Transaction.Commit();
cmd.Connection.Close(); cmd.Dispose();
}
public string CreateSql(string select, string tbname, string where, string orderby, int size, int index)...
public IDataParameter Cp(string name, object value)...
public string GetIdStr...
public string ParStr(string name)...
public void Dispose()...

以上代码本人测试通过,Help类只是ORM的一个起步,曾经看过EF的代码想学习下,但微软的代码实在是太高深(恶心),无从下手,所以我还是按照个人的做法来实现自己ORM,,下篇继续讲CURD操作类.读过觉得还不错请留下你的脚印,谢谢

一个简单的ORM制作(SQL帮助类)的更多相关文章

  1. 一个简单的ORM制作(CURD操作类)

    SQL执行类 CURD操作类 其他酱油类 此篇是为上篇文章填坑的,不知道上篇砸过来的砖头够不够,不够的话请大家继续砸. CURD操作类负责将用户提供的条件转换为SQL语句,并提供给IHelper执行, ...

  2. Python 元类编程实现一个简单的 ORM

    概述 什么是ORM? ORM全称"Object Relational Mapping",即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码 ...

  3. 分享一个简单的C#的通用DbHelper类(支持数据连接池)

    每次新项目的时候,都要从头去找一遍数据库工具类.这里分享一个简单实用的C#的通用DbHelper工具类,支持数据连接池. 连接池配置 <connectionStrings> <add ...

  4. 一个简单的游标删除SQL SERVER表

    use databaseName declare @tblname char(100) declare @sql char(5000) declare table_cursor cursor for ...

  5. Mybatis_1(认识)一个简单的HelloWorld

    1. 介绍: MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBatis可以使用简单的XM ...

  6. 基于JUnit3.8的一个简单的测试程序

    实现一个简单的计算 注:目标类和测试类要放在同一包下, JUnit单元测试基础要点 目标类:Calculator.java package com.junit3_8; public class Cal ...

  7. python-元类和使用元类实现简单的ORM

    元类 面向对象中,对象是类的实例,即对象是通过类创建出来的,在python中,一切皆对象,同样,类也是一个对象,叫做类对象,只是这个类对象拥有创建其子对象(实例对象)的能力.既然类是对象,那么类是通过 ...

  8. C#-用Winform制作一个简单的密码管理工具

    为什么要做? 首先是为了练习一下c#. 想必大家都有过记不起某个平台的账号密码的经历,那种感受着实令人抓狂.那这么多账号密码根本记不住!我之前用python写过一个超级简单(连账号信息都写在代码里那种 ...

  9. 实例学习SSIS(一)--制作一个简单的ETL包

    原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SS ...

随机推荐

  1. Careercup - Facebook面试题 - 6685828805820416

    2014-05-02 02:33 题目链接 原题: Given the following by grid ,): , , , , , , , , null we need to find ,) an ...

  2. Ui设计哪里有好的素材

    刚看到花瓣网,的确不错,以后得多逛逛了.(不喷广告,只留作笔记)

  3. 活动 Activity 四种加载模式

    singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例.(注意是栈顶,不在栈顶照样创建新实例!) singleTas ...

  4. BOM-字节序标记

    BOM——Byte Order Mark 字节序标记 首先是什么是字节序? 字节序:与二进制数据在机器存放位置相关的! 可分为两类: 1. 小端字节序: 低地址放低位数据. x86系列的计算机就使用这 ...

  5. jQuery基于ajax实现星星评论代码

    本文实例讲述了jQuery基于ajax实现星星评论代码.分享给大家供大家参考.具体如下: 这里使用jquery模仿点评网的星星评论功能,Ajax评论模块,鼠标点击星星即可评价,下边是分数,可以点击后给 ...

  6. 无废话版本-Asp.net MVC4.0 Rasor的基本用法

    最近工作有点忙,好久没写东西了!废话不多说了,进入主题! 1.在页面中输出单一变量时候,只要在C#语句之前加上@符号即可,For example: <p>Now Time:@DateTim ...

  7. java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

    这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在 ...

  8. [转] ADO.NET实体框架引发争论

    转自:http://developer.51cto.com/art/200811/76356.htm 2008-11-11 14:00 朱永光译 infoq 我要评论(0) 一个在ADO.NET实体框 ...

  9. 2013 Multi-University Training Contest 2 Balls Rearrangement

    先算出lcm(a,b),如果lcm>=n,则直接暴力解决:否则分段,求出0-lcm内的+0-n%lcm内的值. 再就是连续相同的一起计算!! #include<iostream> # ...

  10. 黑马程序员-C#学习笔记

    ---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- C#学习笔记 1..NET/.do ...