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 增删改查的更多相关文章

  1. android 入门 006(sqlite增删改查)

    android 入门 006(sqlite增删改查) package cn.rfvip.feb_14_2_sqlite; import android.content.Context; import ...

  2. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  3. C#Sqlite增删改查

    说到使用数据库的话,无非也就是对数据的增加,删除和修改以及查询.前文已经 创建好了程序,现在我们就可以来具体实现Sqlite的数据操作,增删改查. 第一步,创建连接字符串来连接数据库: private ...

  4. iOS SQLite 增删改查的封装(关系型)

    在工程里导入libsqlite3.tbd库(Xcode 7) #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder &l ...

  5. C# Dapper 基本使用 增删改查事务等

    using DapperTest.Models; using System.Collections.Generic; using System.Web.Http; using Dapper; usin ...

  6. C# Dapper 基本使用 增删改查事务

    来源:https://blog.csdn.net/Tomato2313/article/details/78880969 using DapperTest.Models; using System.C ...

  7. sqlite 增删改查

    PersonDao1.java package mm.shandong.com.testsqlsqllite.dao; import android.content.Context; import a ...

  8. 回家前的挣扎——SQLite增删改查

    引言 最后一天,公司就两个人,也不知道弄点什么,就在网上找了Sqlite的文档,看了看,这里也是现学现卖,给自己找点事做,感觉时间过得还是比较快的,不然焦急等待,滋味不好受啊. SQLite简介 SQ ...

  9. iOS SQLite增删改查(简单应用)

    // 注意: 在工程里导入libsqlite3.tbd库(Xcode7,如果Xcode7以下的版本则导入libsqlite3.dylib). #import <UIKit/UIKit.h> ...

随机推荐

  1. IDEA -01 -忽略指定文件夹 -防止加载Vue-cli执行"npm install"命令后的项目时卡死

    问题描述 Vue的"npm install" 命令执行后,会生成一个很大的目录层次的"node_modules",文件十分繁多; idea加载这个项目下的文件夹 ...

  2. MongoDB与Python的交互

    驱动模块 pymongo是python里常用的操作MongoDB的驱动模块 可用pip下载安装 pip install pymongo 创建连接 MongoClient是MongoDB的客户端代理对象 ...

  3. LG4351 [CERC2015]Frightful Formula

    Frightful Formula 给你一个\(n\times n\)矩阵的第一行和第一列,其余的数通过如下公式推出: \[f_{i,j}=a\cdot f_{i,j-1}+b\cdot f_{i-1 ...

  4. 做vue项目时,收集的一些有意思的功能

    1. element-ui dialog组件添加可拖拽位置 可拖拽宽高 https://segmentfault.com/a/1190000012940145

  5. nginx添加系统服务(start|stop|restart|reload)

    nginx添加系统服务 1.编写脚本,名为nginx #vim /etc/init.d/nginx #!/bin/bash#chkconfig: - 99 20 #description: Nginx ...

  6. 学习Spring-Data-Jpa(四)---Naming命名策略,源码跟踪

    1.首先在Entity实体中,命名方式有两种: 一种是显示命名,即通过@Table的name属性指定对应的数据库表名称,@Column的name属性指定实体字段对应数据库字段的名称. 另一种是隐式命名 ...

  7. BZOJ 4332: JSOI2012 分零食 FFT+分治

    好题好题~ #include <bits/stdc++.h> #define N 50020 #define ll long long #define setIO(s) freopen(s ...

  8. Random Target Moving~

    测试了一下用向量处理随机目标,还是挺有趣的,源码如下: PVector p1, p2; float gap = 10; void setup() { size(1920, 1080); backgro ...

  9. AttributeError: module 'tensorflow' has no attribute 'set_random_seed'

    anaconda3 python3.7 安装好tensorflow 后出现上面的问题,原因是安装的tensorflow版本是2.0的,所以使用以前的代码tensorflow中的函数不兼容.

  10. flask使用模板

    flask常用代码模板 from flask import Flask, request,jsonify import requests app = Flask(__name__) @app.rout ...