using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Reflection;
using System.Web;
using iPortalActive.DB;
using MySql.Data.MySqlClient;

/// <summary>
/// @author:cst@20140612 modified
/// </summary>

namespace CsUtility
{
public enum OperationType
{
Create,
Remove,
Update,
Delete
}

public class OperationFactory
{
public static AbstractDbFactory CreateFactory(OperationType optType)
{
switch (optType)
{
case OperationType.Create:
return new ExecuteFactory();
case OperationType.Remove:
return new QueryFactory();
case OperationType.Update:
return new UpdateFactory();
case OperationType.Delete:
return new DeleteFactory();
default: break;
}
}
}
public abstract class AbstractDbFactory
{

}

public static class MDbMapper<T> where T : class, new()
{
static MDbMapper()
{
}

public static bool Add(T model)
{
string sql = GenerateInsert(model);
MySqlParameter[] paras = GenerateMysqlParamArray(model);
int rowsAffected = DbHelperMySQL.ExecuteSql(sql, paras);
if (rowsAffected > 0)
{
return true;
}
return false;
}

public static bool Update(T model)
{
string sql = GenerateUpdate(model);
MySqlParameter[] paras = GenerateMysqlParamArray(model);
int rowsAffected = DbHelperMySQL.ExecuteSql(sql, paras);
if (rowsAffected > 0)
{
return true;
}
return false;
}

public static bool Delete(T model)
{
string sql = GenerateDelete(model);
MySqlParameter[] paras = GenerateMysqlParamArray(model);
int rowsAffected = DbHelperMySQL.ExecuteSql(sql, paras);
if (rowsAffected > 0)
{
return true;
}
return false;
}

public static IList<T> Query(T model)
{
string sql = GenerateSelect(model);
MySqlParameter[] paras = GenerateMysqlParamArray(model);
DataSet ds = DbHelperMySQL.Query(sql, paras);
return ReflactorHelper<T>.DsToIList(ds);
}

public static int GetCount(T model)
{
throw new NotImplementedException();
}

#region Update Field

private static string GenerateUpdate(T model)
{
if (typeof(T).GetProperty("Id").Equals(null) || typeof(T).GetProperty("id").Equals(null))
{
throw new ArgumentNullException("Id");
}
string sql = "Update " + typeof(T).Name.ToLower() + " set ";
sql += GetWhereString(model, true);
sql += " where id=?Id";
return sql;
}

#endregion

#region Insert Field

private static string GenerateInsert(T model)
{
string sql = "Insert into " + typeof(T).Name.ToLower();
string cols = GetColsString(model, null);
string vals = GetColsString(model, "?");
sql += cols;
sql += "values";
sql += vals;
return sql;
}

private static MySqlParameter[] GenerateMysqlParamArray(T model)
{
PropertyInfo[] ps = model.GetType().GetProperties();
IList<MySqlParameter> list = new List<MySqlParameter>();
for (int i = 0; i < ps.Length; i++)
{
if (ps[i].GetValue(model, null) == null) continue;
list.Add(new MySqlParameter("?" + ps[i].Name,
Convert.ChangeType(ps[i].GetValue(model, null), ps[i].GetValue(model, null).GetType())));
}
var paras = new MySqlParameter[list.Count];
for (int i = 0; i < paras.Length; i++)
{
paras[i] = list[i];
}
return paras;
}

private static string GetColsString(T model, string prefix)
{
PropertyInfo[] ps = typeof(T).GetProperties();
string cols = "(";
for (int i = 0; i < ps.Length; i++)
{
if (ps[i].GetValue(model, null) == null) continue;
cols += (prefix ?? "") + ps[i].Name + ",";
}
cols = cols.TrimEnd(',') + ")";
return cols;
}

#endregion

#region Delete Field

public static string GenerateDelete(T model)
{
string sql = "Delete from " + typeof(T).Name.ToLower() + " where ";
sql += GetWhereString(model, false);
return sql;
}

private static string GetWhereString(T model, bool isUpdate)
{
PropertyInfo[] ps = typeof(T).GetProperties();
string w = isUpdate ? " " : " 1=1 and ";
for (int i = 0; i < ps.Length; i++)
{
if ((isUpdate && ps[i].Name.ToLower().Equals("id")) || ps[i].GetValue(model, null) == null ||
(ps[i].Name.ToLower().Equals("id") && ps[i].GetValue(model, null).Equals(0))) continue;
w += ps[i].Name + "=?" + ps[i].Name + (isUpdate ? "," : " and ");
}
w = isUpdate ? w.TrimEnd(',') : w.Substring(0, w.Length - 4);
return w;
}

#endregion

#region Select Field

public static string GenerateSelect(T model)
{
string sql = "Select * from " + typeof(T).Name.ToLower() + " where ";
sql += GetWhereString(model, false);
return sql;
}

#endregion

#region SelectCount Field

#endregion
}

public static class MReqMapper
{
public static T GetMdl<T>() where T : class, new()
{
HttpRequest request = HttpContext.Current.Request;

var model = new T();

var keys = new string[request.Form.AllKeys.Length + request.QueryString.AllKeys.Length];
request.QueryString.AllKeys.CopyTo(keys, 0);
request.Form.AllKeys.CopyTo(keys, request.QueryString.AllKeys.Length);
PropertyInfo[] properties = typeof(T).GetProperties();
foreach (PropertyInfo p in properties)
{
try
{
string val = request.Form[p.Name] ?? request.QueryString[p.Name];
p.SetValue(model, Convert.ChangeType(val, p.PropertyType), null);
}
catch (Exception)
{
}
}
return model;
}
}

public class KeyAttribute : Attribute
{
}

public class Singleton<T> where T : new()
{
public static T Instance = new T();
}

public class ReflactorHelper<T> where T : new()
{
public static IList<T> DsToIList(DataSet ds, int tbIndex)
{
DataTable dt = ds.Tables[tbIndex];
IList<T> list = new List<T>();
DataRowCollection rows = dt.Rows;
PropertyInfo[] pis = typeof(T).GetProperties();
foreach (DataRow dr in rows)
{
T m = DrToModel(dr);
list.Add(m);
}
return list;
}

public static IList<T> DsToIList(DataSet ds)
{
return DsToIList(ds, 0);
}

public static T DrToModel(DataRow row)
{
var m = new T();
foreach (DataColumn col in row.Table.Columns)
{
foreach (PropertyInfo pi in typeof(T).GetProperties())
{
try
{
if (row[pi.Name.ToLower()] != DBNull.Value)
{
pi.SetValue(m, Convert.ChangeType(row[pi.Name.ToLower()], pi.PropertyType), null);
}
}
catch (Exception)
{
}
}
}
return m;
}
}

public enum DbType
{
MsSql,
MySql,
Sqlite
}
public interface IDbHelper
{
int ExecuteSql(string sql, params DbParameter[] paras);
DataSet Query(string sql, params DbParameter[] paras);
object GetSingle(string sql, params DbParameter[] paras);
int GetMaxId(string sql, params DbParameter[] paras);
}

public class Connection
{
private readonly string _db;
public Connection(string db)
{
_db = ConfigurationManager.AppSettings[db];
}
public string Db
{
get { return _db; }
}

}

public class MySqlHelper : IDbHelper
{
private Connection _con;
private MySqlConnection _myCon;
public MySqlHelper(Connection con)
{
_con = con;
_myCon = new MySqlConnection(con.Db);
}

#region IDbHelper 成员

public int ExecuteSql(string sql, params DbParameter[] paras)
{
throw new NotImplementedException();
}

public DataSet Query(string sql, params DbParameter[] paras)
{
throw new NotImplementedException();
}

public object GetSingle(string sql, params DbParameter[] paras)
{
throw new NotImplementedException();
}

public int GetMaxId(string sql, params DbParameter[] paras)
{
throw new NotImplementedException();
}

#endregion
}
}

分享一下我写的.net 2.0的orm类,实现mvc。可以用于webform等环境中,这是orm的原理部分。的更多相关文章

  1. 分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。

    转载麻烦声明出处:http://www.cnblogs.com/linguanh/ 目录: 1,前序 2,作用 3,特点 4,代码 1,前序  在开发过程中,client 和 server 数据交流一 ...

  2. 分享一个c#写的开源分布式消息队列equeue

    分享一个c#写的开源分布式消息队列equeue 前言 equeue消息队列中的专业术语 Topic Queue Producer Consumer Consumer Group Broker 集群消费 ...

  3. 分享一个自己写的MVC+EF “增删改查” 无刷新分页程序

    分享一个自己写的MVC+EF “增删改查” 无刷新分页程序 一.项目之前得添加几个组件artDialog.MVCPager.kindeditor-4.0.先上几个效果图.      1.首先建立一个数 ...

  4. JAVA串口开发帮助类分享-及写在马年末

    摘要: 在系统集成开发过程中,存在着各式的传输途径,其中串口经常因其安全性高获得了数据安全传输的重用,通过串口传输可以从硬件上保证数据传输的单向性,这是其它介质所不具备的物理条件.下面我就串口java ...

  5. 分享最近抽空写的一个代码生成器,集成EasyDBUtility数据库访问帮助类

    一直想写一个自己的代码生成器,但是因为工作事情多,一直搁置下来,最近下决心终于利用下班时间写完了,现在分享给有需要的朋友,代码生成器集成EasyDBUtility数据库访问帮助类,暂时只支持sqlse ...

  6. 分享一个nodejs写的小论坛

    引言:作为一个前端小菜鸟,最近迷上了node,于是乎空闲时间,为了练练手写了一个node的小社区,关于微信小程序的,欢迎大家批评指导. 项目架构部分 一.前端架构 作为一个写样式也得无聊的前端狮,我偷 ...

  7. 【分享】自己写的一个可空的DateTimePicker控件-附源码

    最近这段时间在重构以前的一个项目,其中有一项就是要把DateTimePicker控件值可空.大家都知道的DateTimePicker值为DateTime类型,DateTime类型值不能等于Null.但 ...

  8. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  9. 手写一个HTTP框架:两个类实现基本的IoC功能

    jsoncat: 仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架 国庆节的时候,我就已经把 jsoncat 的 IoC 功能给写了,具体可以看这篇文章&l ...

随机推荐

  1. Charles Dickens【查尔斯·狄更斯】

    Charles Dickens In 1812, the year Charles Dickens was born, there were 66 novels published in Britai ...

  2. 使用postMan测试insert或者update接口

    URL : http://localhost:8099/orderVoice/updateAgentLogin?access_token=7f10e803-f886-47df-b3dc-9ed307d ...

  3. 使用CSS3制作各种形状

    CSS3的一个非常酷的特性是允许我们创建各种规则和不规则形状的图形,从而可以减少图片的使用.以前只能在Photoshop等图像编辑软件中制作的复杂图形现在使用CSS3就可以完成了.通过使用新的CSS属 ...

  4. MyBatis---自动创建表

    该项目基于Maven实现 该项目实现了在项目启动时,对数据库表进行操作 源码下载 实现步骤: 1.向pom.xml文件添加maven依赖 <dependency> <groupId& ...

  5. 用(bootstrap)Handsontable做表格,手动实现数据排序

    商品graph帐票时,用(bootstrap)Handsontable做表格,手动实现数据排序待解决的问题: 若使用控件本身的排序,必须指定colHead,colHead不能被copy,若想表头被co ...

  6. form表单提交和重置小结

    1. input标签 1.1>input[type=submit] <form name="form" method="post" action=& ...

  7. laravel5.5用户认证源码分析

    目录 1. 生成相关文件和配置 2. 分析路由文件 3. 以登陆开始为例,分析auth到底是怎么工作的 3.1 分析登录文件 3.2 分析门面Auth. 1. 生成相关文件和配置 快速生成命令 php ...

  8. MySQL数据库基础总结

    来源: 实验楼 链接: https://www.shiyanlou.com/courses/9 一.开发准备 # 打开 MySQL 服务 sudo service mysql start #使用 ro ...

  9. 《1024伐木累》-BUG的通用解决办法

    本周月侠出场,一番侠骨柔情,或许你会为丽姐担忧,或许你也很想知道,发现了一个不该发现的秘密,月侠的未来究竟会怎样,但是一切都只是一个开头,伴随故事成长,伴随故事了解时事,尤其是IT圈子里的事儿,或许真 ...

  10. 剑指Offer - 九度1391 - 顺时针打印矩阵

    剑指Offer - 九度1391 - 顺时针打印矩阵2013-11-24 04:55 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 ...