C# 使用 Dapper 实现 SQLite 增删改查
Dapper 是一款非常不错的轻型 ORM 框架,使用起来非常方便,经常使用 EF 框架的人几乎感觉不到差别,下面是自己写的 Sqlite 通用帮助类;
数据连接类;
public class SQLiteBaseRepository
{
public static string DbFile
{
get {
return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "VideoInfo.db");
}
}
public static SQLiteConnection SimpleDbConnection()
{ string connString = string.Format("Data Source={0};Password=******;", DbFile);
return new SQLiteConnection(connString);
}
}
数据库访问帮助类
public class SQLiteDbHelper : IDisposable
{
/// <summary>
/// 常量;
/// </summary>
const string INSERT_TABLE_ITEM_VALUE = "insert into {0} ({1}) values ({2})";
const string DELETE_TABLE_WHERE = "delete from {0} where {1}";
const string UPDATE_TABLE_EDITITEM = "update {0} set {1}";
const string UPDATE_TABLE_EDITITEM_WHERE = "update {0} set {1} where {2}";
const string Query_ITEM_TABLE_WHERE = "select {0} from {1} where {2}"; private SQLiteConnection conn; public SQLiteDbHelper()
{
conn = openDataConnection();
}
/// <summary>
/// 打开数据库链接;
/// </summary>
/// <returns></returns>
private SQLiteConnection openDataConnection()
{
var conn = SqLiteBaseRepository.SimpleDbConnection();
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
return conn;
}
/// <summary>
/// 1.1 新增实体;
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="model">实体</param>
/// <param name="autoPrimaryKey">自增主键名称</param>
/// <returns></returns>
public int Add<T>(T model, string autoPrimaryKey = "id")
{
var insertSql = GetInsertSql<T>(model,autoPrimaryKey);
return conn.Execute(insertSql);
}
/// <summary>
/// 批量新增
/// </summary>
/// <typeparam name="T">实休类</typeparam>
/// <param name="addData">实体数据列表</param>
/// <param name="autoPrimaryKey">自增主键名称</param>
/// <returns></returns>
public int Adds<T>(List<T> models, string autoPrimaryKey = "id")
{
var type = typeof(T);
int resultN = ;
var transaction = conn.BeginTransaction();
try
{
models.ForEach(d =>
{
var insertSql = GetInsertSql<T>(d);
resultN += conn.Execute(insertSql);
});
transaction.Commit();
}
catch (Exception)
{
resultN = ;
transaction.Rollback();
}
return resultN;
}
/// <summary>
/// 删除
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="where">删除条件</param>
/// <returns></returns>
public int Delete<T>(string where)
{
var type = typeof(T);
string sqlStr = string.Format(DELETE_TABLE_WHERE, type.Name, where);
return conn.Execute(sqlStr);
}
/// <summary>
/// 删除
/// </summary>
/// <param name="tableName"></param>
/// <param name="where"></param>
/// <returns></returns>
public int Delete(string tableName, string where)
{
string sqlStr = string.Format(DELETE_TABLE_WHERE,tableName,where);
return conn.Execute(sqlStr);
}
/// <summary>
/// 修改;
/// </summary>
/// <typeparam name="T">实体 Type </typeparam>
/// <param name="model">实体</param>
/// <param name="where">修改条件</param>
/// <param name="attrs">要修改的实休属性数组</param>
/// <returns></returns>
public int Edit<T>(T model, string where, params string[] attrs)
{
var sqlStr = GetUpdateSql<T>(model, where, attrs);
return conn.Execute(sqlStr);
} /// <summary>
/// 根据条件查询单一实体;
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="where">查询条件;</param>
/// <param name="attrs">要查询的字段(传入 * 为查询所有字段。)</param>
/// <returns></returns>
public T QeryByWhere<T>(string where,params string[] attrs)
{
Type type = typeof(T);
string item = attrs.Length == && attrs[] == "*" ? "*" : string.Join(",", attrs);
var sqlStr = string.Format(Query_ITEM_TABLE_WHERE, item, type.Name, where);
return conn.Query<T>(sqlStr).FirstOrDefault();
} /// <summary>
/// 根据条件查询符合条件的所有实体;
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="where"></param>
/// <returns></returns>
public List<T> QueryMultiByWhere<T>(string where)
{
Type type = typeof(T);
var sqlStr = string.Format(Query_ITEM_TABLE_WHERE, "*", type.Name, where);
return conn.Query<T>(sqlStr).ToList();
} /// <summary>
/// 生成新增 sql 语句;
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="autoPrimaryKey"></param>
/// <returns></returns>
private string GetInsertSql<T>(T model, string autoPrimaryKey = "id")
{
Type t = typeof(T);
var propertyInfo = t.GetProperties();
var proDic = propertyInfo.Where(s => !s.Name.Equals(autoPrimaryKey, StringComparison.InvariantCultureIgnoreCase))
.Select(s => new
{
key = s.Name,
value = GetValue<T>(s, model)
})
.ToDictionary(s => s.key, s => s.value);
proDic = proDic.Where(s => s.Value != "''").ToDictionary(s => s.Key, s => s.Value);
var items = string.Join(",", proDic.Keys);
var values = string.Join(",", proDic.Values);
return string.Format(INSERT_TABLE_ITEM_VALUE,t.Name,items,values);
} /// <summary>
/// 获取属性值;
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="info">字段属性信息</param>
/// <param name="model">实体</param>
/// <returns></returns>
private string GetValue<T>(PropertyInfo info,T model)
{
Type type = info.PropertyType;
var tempStr = string.Empty;
if (type == typeof(string))
{
tempStr = string.Format("'{0}'",info.GetValue(model));
return tempStr;
}
if (type == typeof(DateTime))
{
tempStr = string.Format("'{0}'", ((DateTime)info.GetValue(model)).ToString("s"));
return tempStr;
}
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
var types = type.GetGenericArguments();
if (types[] == typeof(DateTime))
{
tempStr = string.Format("'{0}'", ((DateTime)info.GetValue(model)).ToString("s"));
}
tempStr = string.Format("'{0}'",info.GetValue(model));
return tempStr;
}
tempStr = info.GetValue(model).ToString();
return tempStr;
} /// <summary>
/// 生成更新 sql 语句;
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="pro"></param>
/// <param name="attrs"></param>
/// <returns></returns>
private string GetUpdateSql<T>(T model,string where, params string[] attrs)
{
Type t = typeof(T);
var propertyInfo = t.GetProperties();
var updateInfo = propertyInfo
.Where(s => attrs.Contains(s.Name))
.Select(s =>
{
if (s.PropertyType == typeof(string))
{
return string.Format("{0}='{1}'",s.Name,s.GetValue(model));
}
if (s.PropertyType == typeof(DateTime))
{
return string.Format("{0}='{1}'",s.Name,((DateTime)s.GetValue(model)).ToString("s"));
}
if (s.PropertyType.IsGenericType && s.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
Type[] types = s.PropertyType.GetGenericArguments();
if (types[] == typeof(DateTime))
{
return string.Format("{0}='{1}'", s.Name, ((DateTime)s.GetValue(model)).ToString("s"));
}
return string.Format("{0}={1}", s.Name, s.GetValue(model));
}
return string.Format("{0}={1}", s.Name, s.GetValue(model));
})
.ToArray();
var setStr = string.Join(",",updateInfo);
var sqlStr = string.Format(UPDATE_TABLE_EDITITEM_WHERE, t.Name, setStr, where);
return sqlStr;
}
/// <summary>
/// 释放数据连接;
/// </summary>
public void Dispose()
{
conn.Close();
conn.Dispose();
} }
https://www.cnblogs.com/llsfast/p/7883357.html
C# 使用 Dapper 实现 SQLite 增删改查的更多相关文章
- android 入门 006(sqlite增删改查)
android 入门 006(sqlite增删改查) package cn.rfvip.feb_14_2_sqlite; import android.content.Context; import ...
- iOS sqlite 增删改查 简单封装(基于 FMDB)
/** * 对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * * 基于 FMDB * * 操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...
- C#Sqlite增删改查
说到使用数据库的话,无非也就是对数据的增加,删除和修改以及查询.前文已经 创建好了程序,现在我们就可以来具体实现Sqlite的数据操作,增删改查. 第一步,创建连接字符串来连接数据库: private ...
- iOS SQLite 增删改查的封装(关系型)
在工程里导入libsqlite3.tbd库(Xcode 7) #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder &l ...
- C# Dapper 基本使用 增删改查事务等
using DapperTest.Models; using System.Collections.Generic; using System.Web.Http; using Dapper; usin ...
- C# Dapper 基本使用 增删改查事务
来源:https://blog.csdn.net/Tomato2313/article/details/78880969 using DapperTest.Models; using System.C ...
- sqlite 增删改查
PersonDao1.java package mm.shandong.com.testsqlsqllite.dao; import android.content.Context; import a ...
- 回家前的挣扎——SQLite增删改查
引言 最后一天,公司就两个人,也不知道弄点什么,就在网上找了Sqlite的文档,看了看,这里也是现学现卖,给自己找点事做,感觉时间过得还是比较快的,不然焦急等待,滋味不好受啊. SQLite简介 SQ ...
- iOS SQLite增删改查(简单应用)
// 注意: 在工程里导入libsqlite3.tbd库(Xcode7,如果Xcode7以下的版本则导入libsqlite3.dylib). #import <UIKit/UIKit.h> ...
随机推荐
- vue项目中要实现展示markdown文件[转载]
转载 版权声明:本文为CSDN博主「齐天二圣」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/nihaoa5 ...
- SQl Server 数据库多表连接
[缘由] 为了防止数据的冗余,我们会将数据库中表进行拆分,这样就产生了多张表,表与表之间通过主外键关联,但这样又造成了我们查找和修改的困难,如何进行多表之间的查找呢? 我们将一个查询同时设计两个或两个 ...
- 黄杉杉 --java第七次作业
题目1:创建一个柱体类,包含矩形对象.高和体积等三个成员变量,一个构造方法进行成员变量初始化,和计算体积.换底两个功能方法,在主类中输入长.宽.高,计算柱体体积,输入新的长.宽.高,创建新的矩形对象, ...
- java中equals和==的使用
==可以用来比较基本数据类型和引用数据类型,在进行基本数据类型的比较时,比较的具体的值,进行引用数据类型比较,比较的是引用指向对象在内存中的地址,但是String进行比较需要注意 package cn ...
- RCNN,Fast RCNN,Faster RCNN 的前生今世:(4) Fast RCNN 算法详解
继2014年的RCNN之后,Ross Girshick在15年推出Fast RCNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度.在Github上提供了源码. 同样使用最大规模的网络,Fast ...
- YAML_01 YAML语法和playbook写法
ansible的playbook采用yaml语法,它简单地实现了json格式的事件描述.yaml之于json就像markdown之于html一样,极度简化了json的书写.在学习ansible pla ...
- 018_Python3 模块
在前面的几个章节中我们脚本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了. 为此 Python 提供了一个办法,把这些定义存放在文 ...
- CF316G3 Good Substrings 广义后缀自动机
太累了,刷刷水~ code: #include <bits/stdc++.h> #define N 500005 #define LL long long #define setIO(s) ...
- 1071 Speech Patterns (25)(25 分)
People often have a preference among synonyms of the same word. For example, some may prefer "t ...
- goland 安装破解
链接:https://pan.baidu.com/s/1vH70CHq122RbfwLwbHewjg 密码:zilv 复制如下注册码: 56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1 ...