Class:DbConnectionManipulator.cs
ylbtech-Class:DbConnectionManipulator.cs |
1.返回顶部 |
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks; namespace DS.JZB.Common {
public abstract class DbConnectionManipulator {
public static string DatabaseConnectionStringName = "DatabaseCs";
public static string IndexDatabaseConnectionStringName = "DatabaseCs";
public const int SplitDatabaseCount = ; protected IDbConnection GetConnection() {
return GetMainDatabaseConnection();
} protected void Run(Action<IDbConnection> work) {
Run(GetConnection(), work);
} protected void Run(IDbConnection connection, Action<IDbConnection> work) {
using (connection) {
work(connection);
}
} protected void RunInTransaction(Action<IDbConnection, IDbTransaction> work) {
RunInTransaction(GetConnection(), work);
} protected void RunInTransaction(IDbConnection connection, Action<IDbConnection, IDbTransaction> work) {
using (connection) {
using (var transaction = connection.BeginTransaction()) {
try {
work(connection, transaction);
transaction.Commit();
}
catch {
transaction.Rollback();
throw;
}
}
}
} public static IDbConnection GetMainDatabaseConnection(string databaseCs = "") {
//if (string.IsNullOrEmpty(databaseCs)) {
// if (UserContext.CurrentUser != null && UserContext.CurrentUser.GlobalTeamId > 0) {
// var teamId = UserContext.CurrentUser.GlobalTeamId;
// DatabaseConnectionStringName = "DatabaseCs" + (teamId % SplitDatabaseCount + 1);
// }
// else {
// DatabaseConnectionStringName = "DatabaseCs";
// }
//}
//else {
// DatabaseConnectionStringName = databaseCs;
//} var connection =
new SqlConnection(ConfigurationManager.ConnectionStrings[DatabaseConnectionStringName].ConnectionString);
connection.EnsureOpen();
return connection;
} public static void RunMainDatabase(Action<IDbConnection> work, string databaseCs = "") {
RunMainDatabase(GetMainDatabaseConnection(databaseCs), work);
} public static T RunMainDatabase<T>(Func<IDbConnection, T> work, string databaseCs = "") {
return RunMainDatabase(GetMainDatabaseConnection(databaseCs), work);
} private static void RunMainDatabase(IDbConnection connection, Action<IDbConnection> work) {
using (connection) {
work(connection);
}
} private static T RunMainDatabase<T>(IDbConnection connection, Func<IDbConnection, T> work) {
using (connection) {
return work(connection);
}
} public static void RunMainDatabaseInTransaction(Action<IDbConnection, IDbTransaction> work,
string databaseCs = "") {
RunMainDatabaseInTransaction(GetMainDatabaseConnection(databaseCs), work);
} public static T RunMainDatabaseInTransaction<T>(Func<IDbConnection, IDbTransaction, T> work,
string databaseCs = "") {
return RunMainDatabaseInTransaction(GetMainDatabaseConnection(databaseCs), work);
} public static void RunMainDatabaseInTransaction(IDbConnection connection,
Action<IDbConnection, IDbTransaction> work) {
#if DEBUG
//var guid = Guid.Empty;
//if (HttpContext.Current.Items.Contains("DUUID")) {
// guid = (Guid)HttpContext.Current.Items["DUUID"];
//}
//else {
// guid = Guid.NewGuid();
// HttpContext.Current.Items["DUUID"] = guid;
//} //var logger = typeof(DbConnectionManipulator).ObtainLog();
//logger.Debug($"[{guid.ToString("n")}] get connection to execute db queries");
#endif using (connection) {
using (var transaction = connection.BeginTransaction()) {
try {
work(connection, transaction);
transaction.Commit();
}
catch(Exception ex) {
transaction.Rollback();
throw;
}
}
} #if DEBUG
//logger.Debug($"[{guid.ToString("n")}] release connection to connection pool");
#endif
} public static T RunMainDatabaseInTransaction<T>(IDbConnection connection,
Func<IDbConnection, IDbTransaction, T> work) {
#if DEBUG
//var guid = Guid.Empty;
//if (HttpContext.Current.Items.Contains("DUUID")) {
// guid = (Guid)HttpContext.Current.Items["DUUID"];
//}
//else {
// guid = Guid.NewGuid();
// HttpContext.Current.Items["DUUID"] = guid;
//} //var logger = typeof(DbConnectionManipulator).ObtainLog();
//logger.Debug($"[{guid.ToString("n")}] get connection to execute db queries");
#endif T result = default(T); using (connection) {
using (var transaction = connection.BeginTransaction()) {
try {
result = work(connection, transaction);
transaction.Commit();
}
catch {
transaction.Rollback();
throw;
}
}
} #if DEBUG
//logger.Debug($"[{guid.ToString("n")}] release connection to connection pool");
#endif return result;
} public static void RunAllSplitDatabase(Action<IDbConnection> work) {
for (var i = ; i <= SplitDatabaseCount; i++) {
RunMainDatabase(work, $"DatabaseCs{i}");
}
} public static void ForEachSplitDatabase(Func<IDbConnection, bool> work) {
for (var i = ; i <= SplitDatabaseCount; i++) {
if (RunMainDatabase(work, $"DatabaseCs{i}")) {
break;
}
}
} public static int GetTeamDatabaseIndex(int teamId) {
return teamId % SplitDatabaseCount + ;
} public static string GetTeamDatabaseName(int teamId) {
return $"DatabaseCs{(teamId % SplitDatabaseCount + 1)}";
} public static string GetIndexDatabaseName() {
return "DatabaseCs";
} protected Task RunAsync(Func<IDbConnection, Task> work) {
return RunAsync(GetConnection(), work);
} protected Task RunAsync(IDbConnection connection, Func<IDbConnection, Task> work) {
#if DEBUG
//var guid = Guid.Empty;
//if (HttpContext.Current.Items.Contains("DUUID")) {
// guid = (Guid)HttpContext.Current.Items["DUUID"];
//}
//else {
// guid = Guid.NewGuid();
// HttpContext.Current.Items["DUUID"] = guid;
//} //var logger = typeof(DbConnectionManipulator).ObtainLog();
//logger.Debug($"[{guid.ToString("n")}] get connection to execute db queries");
#endif Task result = null; using (connection) {
result = work(connection);
connection.Dispose();
} #if DEBUG
//logger.Debug($"[{guid.ToString("n")}] release connection to connection pool");
#endif return result;
} public static Task RunMainDatabaseAsync(Func<IDbConnection, Task> work) {
return RunMainDatabaseAsync(GetMainDatabaseConnection(), work);
} private static async Task RunMainDatabaseAsync(IDbConnection connection, Func<IDbConnection, Task> work) {
#if DEBUG
//var guid = Guid.Empty;
//if (HttpContext.Current.Items.Contains("DUUID")) {
// guid = (Guid) HttpContext.Current.Items["DUUID"];
//}
//else {
// guid = Guid.NewGuid();
// HttpContext.Current.Items["DUUID"] = guid;
//} //var logger = typeof(DbConnectionManipulator).ObtainLog();
//logger.Debug($"[{guid.ToString("n")}] get connection to execute db queries");
#endif using (connection) {
await work(connection);
connection.Dispose();
} #if DEBUG
//logger.Debug($"[{guid.ToString("n")}] release connection to connection pool");
#endif
}
} public static class DbConnectionExtension {
public static void EnsureOpen(this IDbConnection @this) {
if (@this.State == ConnectionState.Closed) {
@this.Open();
}
}
}
}
2.返回顶部 |
3.返回顶部 |
4.返回顶部 |
5.返回顶部 |
6.返回顶部 |
![]() |
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |
Class:DbConnectionManipulator.cs的更多相关文章
- ASP.NET MVC:UrlHelper.cs
ylbtech-funcation-Utility: ASP.NET MVC:UrlHelper.cs 充当表示 ASP.NET Razor 页的类的基类. 1.UrlHelper 类返回顶部 1-1 ...
- ASP.NET MVC:WebPageBase.cs
ylbtech-funcation-Utility: ASP.NET MVC:WebPageBase.cs 充当表示 ASP.NET Razor 页的类的基类. 1.A,WebPageBase 抽象类 ...
- ASP.NET MVC:WebPageRenderingBase.cs
ylbtech-funcation-Utility: ASP.NET MVC:WebPageRenderingBase.cs 提供用于呈现使用 Razor 视图引擎的页的方法和属性. 1.A,WebP ...
- ASP.NET MVC:WebViewPage.cs
ylbtech-funcation-Utility: ASP.NET MVC:WebViewPage.cs 表示呈现使用 ASP.NET Razor 语法的视图所需的属性和方法. 1.A,WebVie ...
- 基本教程篇--第一节:InitialSampleDemo.cs介绍
第一节:InitialSampleDemo.cs介绍 为了讲解方便,我先附上源代码和效果图. 代码如下: using System; using System.Drawing; ...
- C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone
C# Json反序列化 Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...
- .Net魔法堂:AssemblyInfo.cs文件详解
一.前言 .net工程的Properties文件夹下自动生成一个名为AssemblyInfo.cs的文件,一般情况下我们很少直接改动该文件.但我们实际上通过另一个形式操作该文件.那就是通过在鼠标右键点 ...
- .NET Core 项目经验总结:Startup.cs 介绍(二)
原文地址(个人博客):http://www.gitblogs.com/Blogs/Details?id=643c9664-dc4e-42cf-a15f-5368ebfcd7c9 第一次面对 Start ...
- 架构风格:万金油CS与分层
计算机科学家David Wheele曾说过这么一句话: All problems in computer science can be solved by another level of indir ...
随机推荐
- selenium_webdriver(python)控制浏览器滚动条
调过JS脚本控制 #coding=utf-8 from selenium import webdriver import time #访问百度 driver=webdriver.Firefox() d ...
- java的IO流的一些测试
public class Demo02 { public static void main(String[] args) { //获取当前毫秒值,用于测试 long l = System.curren ...
- 根据cookie记录跟踪ID来确定分享对象
一 :思路分析 1:用户注册的时候标记推客 2:推客生成分享链接 分享链接构成 (环境前缀+(此链接打开时需要调用的接口+推客的标记+&url=(商品的链接))) 3:需要写一个分享链接调 ...
- 基本标签-html-1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux上iptables防火墙的基本应用教程
iptables是Linux上常用的防火墙软件,下面vps侦探给大家说一下iptables的安装.清除iptables规则.iptables只开放指定端口.iptables屏蔽指定ip.ip段及解封. ...
- HDU 2426 Interesting Housing Problem (最大权完美匹配)【KM】
<题目链接> 题目大意: 学校里有n个学生和m个公寓房间,每个学生对一些房间有一些打分,如果分数为正,说明学生喜欢这个房间,若为0,对这个房间保持中立,若为负,则不喜欢这个房间.学生不会住 ...
- poj 3067 Japan 【树状数组】
<题目链接> 题目大意: 有两个点集,这两个点集从上至下分别从1~n,1~m编号,现在给出n组数据,(x,y),表示左边点集编号为x的点与右边点集编号为y的点相连,现在要求计算这些线段的交 ...
- vuex那些事儿
vuex适用于大型单页应用.每一个Vuex应用的核心就是store(仓库),store中储存大量状态,Vuex的状态存储是响应式的.vuex使用单一状态树,一个对象包含了全部的应用层级状态,每个应用仅 ...
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)
To 洛谷.1774 最接近神的人 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的 ...
- 1006 Tick and Tick
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1006 题意: 24小时中,三个指针之间超过某个度数的时间占所有时间的百分比是多少. 思路:主要是物理和数学 ...