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 ...
随机推荐
- seafile+glusterfs 安装部署
今天在虚拟机上搭一下seafile,用于测试环境.此处安装的是社区免费版本的,可以使用一键自动安装(MySQL适用). 官方文档:https://manual-cn.seafile.com/ 1.一键 ...
- redis 配置文件配置
redis的配置和使用 redis的配置的分段的 配置段: 基本配置项 网络配置项 持久化相关配置 复制相关的配置 安全相关配置 Limit相关的配置 SlowLog相关的配置 INCLUDES Ad ...
- Codeforces 1017F The Neutral Zone 数论
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1017F.html 题目传送门 - CF1017F 题意 假设一个数 $x$ 分解质因数后得到结果 $x=p ...
- Codeforces 986C AND Graph dfs
原文链接https://www.cnblogs.com/zhouzhendong/p/9161514.html 题目传送门 - Codeforces 986C 题意 给定 $n,m (0\leq n\ ...
- elementui异步后台校验表单,修改重复校验
elementui简单的form校验这里就不介绍了,这里主要记录下如何通过后台进行指定字段的异步后台校验. 1.导入axios <script src="https://unpkg.c ...
- Java版统计文件中的每个单词出现次数
正则表达式之Pattern和Matcher,请参见转载博客 http://www.cnblogs.com/haodawang/p/5967219.html 代码实现: import java.i ...
- gitment Error:validation failed错误解决办法
点击Initialize comments 突然跳转出一个错误Error:validation failed 经查阅之后发现 issue的标签label有长度限制!labels的最大长度限制是50个字 ...
- Linux学习之后台任务与定时任务(二十)
Linux学习之后台任务与定时任务 目录 后台任务 把进程放入后台 查看后台任务 将后台暂停的工作恢复到前台执行 将后台暂停的工作恢复到后台执行 定时任务 手动启动服务 将服务设置为自启动 用户的co ...
- Socket/ServerSocket 选项
在网络编程中,Socket/ServerSocket有一些选项用来自定义一些行为,现在分享一下. Socket选项 1.TCP_NODELAY 在Socket发送数据时,默认情况下,数据会先进 ...
- 835.Hamming距离
描述 两个整数的Hamming距离是对应比特位不同的个数. 给定两个整数x和y,计算两者的Hamming距离. 0 ≤ x, y < 2^31. 您在真实的面试中是否遇到过这个题? 样例 输入: ...
