c#一步一步实现ORM(二)

上一篇描述了简单的思路,这一片我们来稍微细化一下

1插入的时候忽略某些字段

       public int Insert<T>(T o, params string[] except)
{ //有时候我们添加的时候只想添加部分字段,或者有的字段是自增的方式,那么要去掉这个字段(在sqlserver里面是这样,在mysql里面 是插入 null) try
{ Type type = typeof(T);
var tablename = "dbo.[" + typeof(T).Name + "]"; string fields = "";
string values = "";
List<SqlParameter> paras = new List<SqlParameter>(); object v = null;
foreach (var item in type.GetProperties())
{ bool flag = true; if (except != null && except.Contains(item.Name))
{ flag = false;
} if (flag)
{
v = item.GetValue(o, null);
if (v != null)
{
fields += "," + "[" + item.Name + "]";
values += ",@" + item.Name;
paras.Add(new SqlParameter("@" + item.Name, v));
}
}
}
string sql = string.Format("insert into {0} ({1}) values({2})", tablename, fields.Substring(1), values.Substring(1)); return ExcuteSql(sql, paras);
}
catch (Exception e)
{
Console.Write(e.ToString());
return 0;
} }

2批量插入

       public int InsertArray<T>(IEnumerable<object> o, params string[] except)
{
if (o.Count() == 0)
{ return 0;
} Type type = typeof(T);
var tablename = "dbo.[" + typeof(T).Name + "]";
List<SqlParameter> paras = new List<SqlParameter>(); string sql = ""; int count = 0;
foreach (var i in o)
{
count++;
string fields = "";
string values = ""; //object v = null;
foreach (var item in type.GetProperties())
{ bool flag = false; if (!flag)
{
var vitem = item.GetValue(i, null); if (vitem != null)
{
fields += ",[" + item.Name + "]";
values += ",@" + count + item.Name; paras.Add(new SqlParameter("@" + count + item.Name, vitem));
}
} } sql += string.Format("insert into {0} ({1}) values({2});", tablename, fields.Substring(1), values.Substring(1));
} return ExcuteSql(sql, paras); }

  

   private int ExcuteSql(string sql, IEnumerable<SqlParameter> paras)
{
using (SqlConnection conn = new SqlConnection(this.sqlConnStr))
{ SqlCommand cmd = new SqlCommand();
cmd.Connection = conn; cmd.CommandText = sql; cmd.Parameters.AddRange(paras.ToArray()); conn.Open();
int flag = 0;
try
{ flag = cmd.ExecuteNonQuery(); }
catch (Exception e)
{
throw e; }
conn.Close();
return flag;
}
}

  下一篇我们开始学习修改,删除,和解析lambda表达式

c#一步一步实现ORM(二)的更多相关文章

  1. 一步一步跟我学DeviceOne开发 - 仿微信应用(一,二,三)

    这是一个系列的文档,长期目标是利用DeviceOne开发一些目前使用广泛的优质手机应用,我们会最大化的实现这些应用的每一个功能和细节,不只停留在简单的UI模仿和Demo阶段,而是一个基本可以使用的实际 ...

  2. 一步一步来做WebQQ机器人-(二)(第一次登陆)

    // 预计会有这些步骤,当然某些步骤可能会合并: 验证码 第一次登陆 第二次登陆 保持在线和接收消息 获取好友和群列表 发送消息 变成智能的(*゚∀゚*) webqq的登陆,分为2步,本文主要讲第一次 ...

  3. 如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单

    阅读目录 前言 解决数据一致性的方案 回到DDD 设计 实现 结语 一.前言 之前的十一篇把用户购买商品并提交订单整个流程上的中间环节都过了一遍.现在来到了这最后一个环节,提交订单.单从业务上看,这个 ...

  4. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)

    前言: 在本系列第一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](一)>中,我为大家介绍了搭建空白解决方案以 ...

  5. 一步一步搭建oracle 11gR2 rac+dg之环境准备(二)【转】

    一步一步在RHEL6.5+VMware Workstation 10上搭建 oracle 11gR2 rac + dg 之环境准备 (二) 一步一步搭建oracle 11gR2 rac+dg之环境准备 ...

  6. 一步一步实现web程序信息管理系统之二----后台框架实现跳转登陆页面

    SpringBoot springboot的目的是为了简化spring应用的开发搭建以及开发过程.内部使用了特殊的处理,使得开发人员不需要进行额外繁锁的xml文件配置的编写,其内部包含很多模块的配置只 ...

  7. 一步一步造个IoC轮子(二),详解泛型工厂

    一步一步造个Ioc轮子目录 一步一步造个IoC轮子(一):Ioc是什么 一步一步造个IoC轮子(二):详解泛型工厂 一步一步造个IoC轮子(三):构造基本的IoC容器 详解泛型工厂 既然我说IoC容器 ...

  8. Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码

    在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能 ...

  9. 一步一步开发Game服务器(三)加载脚本和服务器热更新(二)完整版

    上一篇文章我介绍了如果动态加载dll文件来更新程序 一步一步开发Game服务器(三)加载脚本和服务器热更新 可是在使用过程中,也许有很多会发现,动态加载dll其实不方便,应为需要预先编译代码为dll文 ...

随机推荐

  1. CloseHandel(_beginthreadex): 只是关闭了线程句柄对象,并不会结束线程。

    今天在测试程序的时候,在[任务管理器]中发现进程序的句柄随着多线程的不断运行,会不断的 +1. 发现原来在我的代码中,启动线程后都没有显式的调用 CloseHandle() 来关闭线程句柄. 当我准备 ...

  2. latex 一些使用

    texlive安装 https://blog.csdn.net/qq_38386316/article/details/80272396 管理员权限打开.bat 语言的安装可以减少 texwork 一 ...

  3. 通过nginx访问linux目录

    http { ...... autoindex on; autoindex_exact_size off; autoindex_localtime on; server { listen 80; .. ...

  4. mysql5.7 修改root密码无法登陆原因

    升级的mysql5.7修改完root账户密码后仍然无法登陆,查阅资料可能和user表的plugin 字段为空有关. 1.首先将my.ini中加入在[mysqld]节点上加skip-grant-tabl ...

  5. 关于ehcache缓存中eternal及timeToLiveSeconds和timeToIdleSeconds的说明

    今天发现开发项目启动时有警告提示:cache 'xx' is set to eternal but also has TTL/TTI set,发现是ehcache缓存设置冲突 所以决定在此mark一下 ...

  6. Battery Historian 使用常用命令

    一.重置电池数据收集数据 打开电池数据获取:adb shell dumpsys batterystats --enable full-wake-history 重置电池数据: adb shell du ...

  7. CMDB服务器管理系统【s5day90】:API构造可插拔式插件逻辑

    1.服务器端目录结构: 1.__init__.py from django.conf import settings from repository import models import impo ...

  8. Entity Framework入门教程(14)---DbFirst下的存储过程

    EF6中DbFirst模式下使用存储过程 我们已经知道EF可以将L2E或Entity SQL的查询语句自动转换成SQL命令,也可以根据实体的状态自动生成Insert/update/delete的Sql ...

  9. 18、cookies与session学习笔记

    本文记录学习 cookies 和 session 的一些小练习和知识点   知识点1    cookies 和 session 的由来   HTTP协议是无状态的协议,因为一旦浏览器和服务器之间的请求 ...

  10. python学习03

    字符串的基本使用 1.字符编码集 ASCII编码:外国人常用的大小写英文字母.数字和一些符号,一共127个字符,用1个字节(byte)可以涵盖完,也就是8个位,它将序列中的每个字节理解为一个字符. U ...