一个简单的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. Cocos2dx 截屏

    void SaveScreenshot() { CCSize size = CCDirector::sharedDirector()->getWinSize(); CCRenderTexture ...

  2. java集合类(四)About Set

    接上篇:java集合类(三)About Iterator & Vector(Stack) 之前,在比较java常见集合类的时候,就了解到一点有关Set的特性.实现类及其要求等,读者可以去温习下 ...

  3. UML: CIM & PIM

    CIM-1:定义业务流程 定义及分析业务流程(Business Process)是为了尽快理清系统范围,以便估算开发成本及时间,可不是为了要改造业务流程.系统分析员千万别误解了此步骤的目的.所以,系统 ...

  4. java.lang.UnsatisfiedLinkError: D:\Tomcat-7.0.59\apache-tomcat-7.0.59\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

    今日上午用Tomcat运行一个小项目,报出以下异常信息: java.lang.UnsatisfiedLinkError: D:\Tomcat-7.0.59\apache-tomcat-7.0.59\b ...

  5. Matlab找二维数组最大值

    1.m先max(x)求出每列最大值,返回行向量,再max对行向量求出最大值,就是max(max(x)). 注意:max(x),不管x是行列向量,只要是向量,那么就返回一个值. 2.先x(:)转为按列的 ...

  6. 各种matrix

    http://www.gamedev.net/topic/602722-worldviewproj/

  7. 【Android自学之旅】 目录

    [Android自学之旅] 目录 [Android自学之旅] Android开发环境的搭建

  8. Unity3dBug - OnEnable

    最近 项目 因为 使用 active 代替 instantiate机制,很多时候 OnEnable 代理 OnStart. 然后发现一个 奇怪的 问题 void Awake() { Debug.Log ...

  9. android C/C++ source files 全局宏定义 .

    \system\core\include\arch\linux-arm AndroidConfig.h * ============================================== ...

  10. POJ 3111

    K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 5177   Accepted: 1411 Case Time ...