当前位置: 首页 > news >正文

C# SQL 辅助工具

{/// <summary>/// sql 辅助工具/// </summary>public class SqlStructureHelps{#region 增删改查/// <summary>/// 截断/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public static string TruncateTable<T>(){try{Type type = typeof(T);var tableName = GetClassName(type);return GetSql(SqlType.TruncateTable, tableName);}catch (Exception ex){throw ex;}}/// <summary>/// 修改/// </summary>/// <typeparam name="T"></typeparam>/// <param name="condition">修改条件 (1=1and2=2)</param>/// <param name="param">更新字段</param>/// <returns></returns>public static string Update<T>(string condition = "", List<string> param = null){try{Type type = typeof(T);var tableName = GetClassName(type);var conditionStr = "";if (!string.IsNullOrEmpty(condition)){conditionStr += " WHERE " + condition;}List<string> arrStr = new List<string>();if (param != null && param.Count() > 0){arrStr = param.ToList();}else{var columns = GetTableNames(type, param);arrStr = columns.Select(x => x.name).ToList();}return GetSql(SqlType.Update, tableName, arrStr, conditionStr);}catch (Exception ex){throw ex;}}/// <summary>/// 新增/// </summary>/// <typeparam name="T"></typeparam> /// <param name="param">新增字段</param>/// <returns></returns>public static string Add<T>(List<string> param = null){try{Type type = typeof(T);var tableName = GetClassName(type);List<string> arrStr = new List<string>();if (param != null && param.Count() > 0){arrStr = param.ToList();}else{var columns = GetTableNames(type, param);arrStr = columns.Select(x => x.name).ToList();}return GetSql(SqlType.Insert, tableName, arrStr);}catch (Exception ex){throw ex;}}/// <summary>/// 删除/// </summary>/// <typeparam name="T"></typeparam>/// <param name="condition">删除条件 (1=1and2=2)</param>/// <returns></returns>public static string Delete<T>(string condition = ""){try{Type type = typeof(T);var tableName = GetClassName(type);var conditionStr = "";if (!string.IsNullOrEmpty(condition)){conditionStr += " WHERE " + condition;}return GetSql(SqlType.Delete, tableName, null, conditionStr);}catch (Exception ex){throw ex;}}/// <summary>/// 查询/// </summary>/// <typeparam name="T"></typeparam>/// <param name="condition">查询条件 (1=1and2=2)</param>/// <param name="v1">当前页</param>/// <param name="v2">条数</param>/// <param name="param">查询指定字段</param>/// <returns></returns>public static string Query<T>(string condition = "", int v1 = 0, int v2 = 0, List<string> param = null){try{// 查询的列var arrStr = new List<string>();// 条件var conditionStr = "";if (!string.IsNullOrEmpty(condition)){conditionStr += " WHERE " + condition;}if (v1 > 0 && v2 > 0){conditionStr += string.Format(@" LIMIT {1} OFFSET ({0} - 1) * {1}", v1, v2);}Type type = typeof(T);var tableName = GetClassName(type);if (param != null && param.Count() > 0){arrStr = param.ToList();}else{var columns = GetTableNames(type, param);arrStr = columns.Select(x => x.name).ToList();}return GetSql(SqlType.Select, tableName, arrStr, conditionStr);}catch (Exception ex){throw ex;}}/// <summary>/// 获取sql/// </summary>/// <param name="sqlType">类型</param>/// <param name="table">表名</param>/// <param name="columns">新增字段 / 更新字段  / 查询字段(默认全部)</param>/// <param name="condition">更新字段条件 / 查询条件 / 删除条件</param>/// <returns></returns>private static string GetSql(SqlType sqlType, string table, List<string> columns = null, string condition = ""){var s = "";switch (sqlType){case SqlType.Insert:if (columns == null || columns.Count < 1){throw new Exception("新增字段为空");}else{s += string.Format(@"INSERT INTO {0} ({1}) VALUES ({2});", table, string.Join(",", columns), string.Join(",", columns.Select(x => "@" + x)));}break;case SqlType.Delete:s += string.Format(@"DELETE FROM {0} {1};", table, condition);break;case SqlType.Update:if (columns == null || columns.Count < 1){throw new Exception("更新字段为空");}s += string.Format(@"UPDATE {0} SET {1} {2};", table, string.Join(",", columns.Select(x => x + "=@" + x)), condition);break;case SqlType.Select:if (columns == null || columns.Count < 1){s += string.Format(@"SELECT * FROM {0} {1};", table, condition);}else{s += string.Format(@"SELECT {1} FROM {0} {2};", table, string.Join(",", columns), condition);}break;case SqlType.TruncateTable:s += string.Format(@"TRUNCATE TABLE {0};", table);break;}return s;}/// <summary>/// 获取表名,默认为类名/// </summary>/// <param name="type"></param>/// <returns></returns>private static string GetClassName(Type type){var name = type.Name;object[] attrClassName = type.GetCustomAttributes(typeof(MyIsStructureAttribute), true);if (attrClassName != null && attrClassName.Length > 0){var myIsStructureAttribute = (MyIsStructureAttribute)attrClassName.First();name = myIsStructureAttribute.TableName;}return name;}/// <summary>/// 获取字段集合/// </summary>/// <param name="type"></param>/// <param name="obj"></param>/// <returns></returns>/// <exception cref="Exception"></exception>private static List<Column> GetTableNames(Type type, object obj = null){var list = new List<Column>();PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);if (properties.Length > 0){foreach (PropertyInfo property in properties){if (property.CanWrite && property.CanRead){var a = property.GetCustomAttributes(typeof(MyIsStructureAttribute), true);var isNext = true;if (a != null && a.Length > 0){var temp = (MyIsStructureAttribute)a.First();isNext = temp.IsStructure;}if (isNext){var tempuu = new Column();tempuu.name = property.Name;tempuu.type = property.GetMethod.ReturnType.Name;if (obj != null){tempuu.value = property.GetMethod.Invoke(obj, null);}list.Add(tempuu);}}}}else{throw new Exception("未查询到字段");}return list;}#endregion#region 扩展/// <summary>/// 获取所有的表信息/// </summary>/// <param name="sqlTypes"></param>/// <param name="database"></param>/// <returns></returns>public static string GetTable(SqlTypes sqlTypes, string database = ""){try{string sql = "";switch (sqlTypes){case SqlTypes.Mysql:if (string.IsNullOrEmpty(database)) throw new Exception("数据库名称不能为空");sql = string.Format(@"SELECT TABLE_NAME AS `TableName`, TABLE_COMMENT AS `TableExegesis` FROM information_schema.TABLES   WHERE   TABLE_SCHEMA = '{0}' ORDER BY   TABLE_NAME;", database);break;case SqlTypes.SqlServer:sql = string.Format(@"SELECT t.name AS TableName, ep.value AS TableExegesis  FROM  sys.tables t LEFT JOIN sys.extended_properties ep ON t.object_id = ep.major_id AND ep.minor_id = 0  AND ep.name = 'MS_Description' AND ep.class = 1 WHERE t.type = 'U'  AND t.is_ms_shipped = 0  ORDER BY  t.name;");break;default:throw new Exception("未扩展的数据库");}return sql;}catch (Exception ex){throw ex;}}/// <summary>/// 获取所有的列信息/// </summary>/// <param name="sqlTypes"></param>/// <param name="database"></param>/// <param name="tablename"></param>/// <returns></returns>public static string GetColumn(SqlTypes sqlTypes, string database, string tablename){try{string sql = "";switch (sqlTypes){case SqlTypes.Mysql:sql = string.Format(@"SELECT   COLUMN_NAME AS `columnName`,  COLUMN_COMMENT AS `columnExegesis`,  DATA_TYPE AS `columnType`,  CHARACTER_MAXIMUM_LENGTH AS `columnMax` FROM     information_schema.COLUMNS   WHERE   TABLE_SCHEMA = '{0}' AND TABLE_NAME = '{1}'; ", database, tablename);break;case SqlTypes.SqlServer:sql = string.Format(@"SELECT   c.name AS columnName,  ty.name AS columnType,  CASE   WHEN ty.name IN ('nchar', 'nvarchar', 'ntext') THEN c.max_length / 2  WHEN ty.name IN ('text') THEN -1 ELSE c.max_length    END AS columnMax,   ep.value AS columnExegesis  FROM  sys.columns c INNER JOIN sys.types ty ON c.user_type_id = ty.user_type_id LEFT JOIN sys.extended_properties ep ON c.object_id = ep.major_id    AND c.column_id = ep.minor_id AND ep.name = 'MS_Description'  WHERE c.object_id = OBJECT_ID('{0}.dbo.{1}'); ", database, tablename);break;default:throw new Exception("未扩展的数据库");}return sql;}catch (Exception ex){throw ex;}}/// <summary>/// mysql 类型  转 c# 类型/// </summary>/// <param name="mysqlType"></param>/// <returns></returns>/// <exception cref="NotSupportedException"></exception>/// <exception cref="ArgumentException"></exception>public static Type MySqlTypeToCSharpType(string mysqlType){switch (mysqlType.ToLowerInvariant()){case "int":case "tinyint":case "smallint":case "mediumint":case "bigint":case "bigint unsigned":case "int unsigned":return typeof(int);case "float":case "double":case "decimal":case "numeric":return typeof(double);case "varchar":case "char":case "text":case "tinytext":case "mediumtext":case "longtext":return typeof(string);case "datetime":case "timestamp":case "date":case "time":case "year":return typeof(DateTime);case "blob":case "tinyblob":case "mediumblob":case "longblob":case "binary":case "varbinary":return typeof(byte[]);case "json":return typeof(string);case "bit":return typeof(bool);default:throw new ArgumentException($"MySQL type: {mysqlType}");}}/// <summary>/// sqlserver类型  转 c#类型/// </summary>/// <param name="sqlType"></param>/// <returns></returns>/// <exception cref="ArgumentException"></exception>public static Type SqlServerTypeToCSharpType(string sqlType){switch (sqlType.ToLowerInvariant()){case "int":case "smallint":case "tinyint":return typeof(int);case "bigint":return typeof(long);case "bit":return typeof(bool);case "decimal":case "numeric":return typeof(decimal);case "float":return typeof(float);case "real":return typeof(float);case "money":case "smallmoney":return typeof(decimal);case "char":case "nchar":case "varchar":case "nvarchar":case "text":case "ntext":return typeof(string);case "datetime":case "smalldatetime":case "date":case "time":case "datetime2":case "datetimeoffset":return typeof(DateTime);case "binary":case "varbinary":case "varbinary(max)":return typeof(byte[]);case "uniqueidentifier":return typeof(Guid);case "sql_variant":return typeof(object);case "xml":return typeof(string);default:throw new ArgumentException($"SQL Server type: {sqlType}");}}#endregion}#region 内部辅助使用/// <summary>/// 类型/// </summary>enum SqlType{/// <summary>/// 增加/// </summary>Insert,/// <summary>/// 删除/// </summary>Delete,/// <summary>/// 更新/// </summary>Update,/// <summary>/// 查询/// </summary>Select,/// <summary>/// 截断/// </summary>TruncateTable}/// <summary>/// 列/// </summary>class Column{/// <summary>/// 名称/// </summary>public string name { get; set; }/// <summary>/// 值/// </summary>public object value { get; set; }/// <summary>/// 类型/// </summary>public string type { get; set; }}#endregion#region 外部配合使用/// <summary>/// 自定义属性/// </summary>public class MyIsStructureAttribute : Attribute{/// <summary>/// /// </summary>/// <param name="isStructure"></param>public MyIsStructureAttribute(bool isStructure = false){IsStructure = isStructure;}/// <summary>/// /// </summary>/// <param name="tableName"></param>public MyIsStructureAttribute(string tableName){TableName = tableName;}/// <summary>/// 是否为表结构中的数据/// </summary>public bool IsStructure { get; }/// <summary>/// 表名称/// </summary>public string TableName { get; }}/// <summary>/// 数据库类型/// </summary>public enum SqlTypes{/// <summary>/// mysql/// </summary>Mysql,/// <summary>/// SqlServer/// </summary>SqlServer}/// <summary>/// 表/// </summary>public class Tables{/// <summary>/// 名称/// </summary>public string TableName { get; set; }/// <summary>/// 注释/// </summary>public string TableExegesis { get; set; }}/// <summary>/// 列/// </summary>public class Columns{/// <summary>/// 名称/// </summary>public string columnName { get; set; }/// <summary>/// 注释/// </summary>public string columnExegesis { get; set; }/// <summary>/// 类型/// </summary>public string columnType { get; set; }/// <summary>/// 最大长度/// </summary>public string columnMax { get; set; }}#endregion}

相关文章:

C# SQL 辅助工具

{/// <summary>/// sql 辅助工具/// </summary>public class SqlStructureHelps{#region 增删改查/// <summary>/// 截断/// </summary>/// <typeparam name"T"></typeparam>/// <returns></returns>public static …...

eNSP简单用法

建立一个简单的拓扑图 点击绿色三角开启设备 双击设备可以进行命令编辑 视图 分为三个视图&#xff1a;用户视图、系统视图、接口视图 用户视图 在默认模式下就是&#xff0c;为<huawei> 按ctrlz返回用户视图 系统视图&#xff1a; 在用户视图下输入sys切换&#…...

1035. 不相交的线

1. 题目 1035. 不相交的线 2. 解题思路 题目一看是求最值&#xff0c;那就可以考虑用DP来做。 核心点就是确定DP数组的含义以及状态转移方程&#xff1a; dp数组含义&#xff1a;dp[i][j]&#xff0c;nums1 前 i 个数和 nums2 前 j 个数的最大连线数dp[i][j] dp[i - 1][j …...

1.pytest基础知识(默认的测试用例的规则以及基础应用)

一、pytest单元测试框架 1&#xff09;什么是单元测试框架 单元测试是指再软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数&#xff0c;方法&#xff09;进行正确性的检查测试。 2&#xff09;单元测试框架 java&#xff1a;junit和testing python&#xff1a;un…...

Linux常见查看文件命令

目录 一、cat 1.1. 查看文件内容 1.2. 创建文件 1.3. 追加内容到文件 1.4. 连接文件 1.5. 显示多个文件的内容 1.6. 使用管道 1.7. 查看文件的最后几行 1.8. 使用 -n 选项显示行号 1.9. 使用 -b 选项仅显示非空行的行号 二、tac 三、less 四、more 五、head 六、…...

初识 performance_schema:轻松掌握MySQL性能监控

什么是 performance_schema performance_schema 是 MySQL 5.8 版本的一个强大功能&#xff0c;它就像是一个内置的**“性能侦探”**&#xff0c;专门用来监控和分析 MySQL 服务器的资源消耗和等待情况。有了它&#xff0c;数据库管理员和开发者就能实时了解服务器的运行状态&a…...

linux下top命令查看和解释

怎么看top结果&#xff1a; top - 10:20:48 up 8 days, 14:07, 2 users, load average: 6.04, 5.82, 4.73 Tasks: 11099 total, 1 running, 10916 sleeping, 0 stopped, 1 zombie %Cpu(s): 8.9 us, 4.6 sy, 0.0 ni, 86.1 id, 0.1 wa, 0.0 hi, 0.3 si, 0.0 st K…...

换个手机IP地址是不是不一样?

在当今这个信息爆炸的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。而IP地址&#xff0c;作为手机连接网络的桥梁&#xff0c;也时常引起我们的关注。你是否曾经好奇&#xff0c;换个手机&#xff0c;IP地址会不会也跟着变呢&#xff1f;本文将深入探讨这个问题&a…...

【从计算机的发展角度理解编程语言】C、CPP、Java、Python,是偶然还是应时代的产物?

参考目录 前言什么是"computer"?计算机的大致发展历程计算机系统结构阶段(1946~1981)计算机网络和视窗阶段(1982~2007)复杂信息系统阶段(2008~today)人工智能阶段 越新的语言是越好的吗、越值得学习吗&#xff1f; 前言 最近读了 《Python语言程序设计基础》 这本书…...

《Google软件测试之道》笔记

介绍 GTAC&#xff1a;Google Test Automation Conference&#xff0c;Google测试自动化大会。 本书出版之前还有一本《微软测试之道》&#xff0c;值得阅读。 质量不是被测试出来的&#xff0c;但未经测试也不可能开发出有质量的软件。质量是开发过程的问题&#xff0c;而不…...

实战讲稿:Spring Boot整合MyBatis

文章目录 实战讲稿&#xff1a;Spring Boot整合MyBatis课程目标课程内容1. 创建员工映射器接口1.1 创建子包1.2 创建接口 2. 测试员工映射器接口2.1 自动装配员工映射器2.2 测试按标识符查询员工方法2.3 测试查询全部员工方法2.4 测试插入员工方法2.5 测试更新员工方法2.6 测试…...

基于深度学习的眼部疾病检测识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 眼部疾病的早期诊断对于防止视力下降乃至失明至关重要。然而&#xff0c;专业的医疗资源分布不均&#xff0c;尤其是在偏远地区&#xff0c;人们很难获得专业的眼科医生提供的及时诊断服务。本系统…...

curl格式化json之jq工具?

jq 是一个轻量级的命令行工具&#xff0c;用于解析、操作和格式化 JSON 数据。它类似于 sed 或 awk&#xff0c;但专门用于处理 JSON 格式。使用 jq&#xff0c;你可以从复杂的 JSON 数据中提取所需的信息&#xff0c;格式化输出&#xff0c;进行数据筛选&#xff0c;甚至修改 …...

百收SEO蜘蛛池

百收SEO蜘蛛池 网站搜索排名上不去&#xff1f;SSL证书来帮忙&#xff01; #SSL证书#网站优化#搜索引擎优化 谷歌蜘蛛石的话有非常多的一个重要性&#xff0c;首先的话就是能够提升我们网站的一个输入&#xff0c;尤其是对于我们百收SEO蜘蛛池新站来说&#xff0c;我们在做独立…...

(娱乐)魔改浏览器-任务栏图标右上角加提示徽章

一、目标&#xff1a; windows中&#xff0c;打开chromium&#xff0c;任务栏中会出现一个chromium的图标。我们的目标是给这个图标的右上角&#xff0c;加上"有1条新消息"的小提示图标&#xff0c;也叫徽章(badge)注意&#xff1a;本章节纯属娱乐&#xff0c;有需要…...

JVM相关

1.JVM内存区域 一个运行起来的java进程就是一个Java虚拟机&#xff0c;就需要从操作系统中申请一大块内存。 内存中会根据作用的不同被划分成不同的区域&#xff1a; &#xff08;1&#xff09;栈&#xff1a;存储的内容是代码在执行过程中&#xff0c;方法之间的调用关系&a…...

9.18 微信小程序开发笔记

如何获取英语单词的发音&#xff0c;使其能在小程序界面通过点击外发&#xff1f; 1.通过外界API获取&#xff08;例如有道API&#xff09; 不下载音频文件&#xff0c;每次需要时直接API获取发音&#xff0c;存储压力小。但是一般的API都有使用次数限制&#xff0c;在背单词…...

dpdk课程学习之练习笔记八(dpvs的了解)

只是看到这个&#xff0c;跟着流程做一下练习&#xff0c;了解这个东东是干啥的&#xff0c;再就是搭建环境&#xff0c;基于dpdk的环境&#xff0c;顺手也就练习dpdk的环境搭建了。 0&#xff1a;总结 1&#xff1a;知道了lvs能实现的功能&#xff0c;挺强大。 2&#xff1…...

Linux标准IO-系统调用详解

1.1 系统调用 系统调用&#xff08;system call&#xff09;其实是 Linux 内核提供给应用层的应用编程接口&#xff08;API&#xff09;&#xff0c;是 Linux 应用层进入内核的入口。不止 Linux 系统&#xff0c;所有的操作系统都会向应用层提供系统调用&#xff0c;应用程序通…...

LeetCode004-两个有序数组的中位数-最优算法代码讲解

最有帮助的视频讲解 【LeetCode004-两个有序数组的中位数-最优算法代码讲解】 https://www.bilibili.com/video/BV1H5411c7oC/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a 时间复杂度 O ( l o g ( m i n ( m , n ) ) ) O(log(min(m,n))) O(log(min(…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...