.net OleDbParameter转SugarParameter

news/2023/11/27 19:31:00

说明原因 :

因公司项目是很早的老项目,底层用的dbhelper数据库操作类,
因需要支持多个数据库,本次是要求支持postgresql数据库,边学边做,期间也遇到了很多postgresql数据库的问题,如果重新改框架、换底层等等一些来不及、所有就直接改了连接数据库、封装了许多sqlsugar的底层查询方法及更新事务方法、目前支持mysql、postgresql、oracle、sqlserver等

要连接PostgreSQL数据库,需要使用PostgreSQL的.NET数据提供程序,例如Npgsql。可以使用NpgsqlConnection类来建立与PostgreSQL数据库的连接。以下是一个简单的示例:

using Npgsql;
using System.Data;string connectionString = "Server=myServerAddress;Port=myPortNumber;Database=myDataBase;User Id=myUsername;Password=myPassword;";
NpgsqlConnection connection = new NpgsqlConnection(connectionString);
connection.Open();// 使用连接执行查询或更新等操作connection.Close();

但是因为一些原因,还是直接改了底层,下面举例说明一个典型的例子,其中两个Query方法中是查询数据库存储为dataset的方法(未改前),两个入参类型不同:

              /// <summary>/// 执行查询语句,返回DataSet/// </summary>/// <param name="SQLString">查询语句</param>/// <returns>DataSet</returns>public static DataSet Query(string SQLString, params OleDbParameter[] cmdParms){using (OleDbConnection connection = new OleDbConnection(connectionString)){OleDbCommand cmd = new OleDbCommand();PrepareCommand(cmd, connection, null, SQLString, cmdParms);using (OleDbDataAdapter da = new OleDbDataAdapter(cmd)){DataSet ds = new DataSet();try{da.Fill(ds, "ds");cmd.Parameters.Clear();}catch (System.Data.OleDb.OleDbException ex){throw new Exception(ex.Message);}return ds;}}}/// <summary>/// 执行查询语句,返回DataSet/// </summary>/// <param name="SQLString">查询语句</param>/// <returns>DataSet</returns>public static DataSet Query(string SQLString, List<OleDbParameter> cmdParms){using (OleDbConnection connection = new OleDbConnection(connectionString)){OleDbCommand cmd = new OleDbCommand();PrepareCommand(cmd, connection, null, SQLString, cmdParms);using (OleDbDataAdapter da = new OleDbDataAdapter(cmd)){DataSet ds = new DataSet();try{da.Fill(ds, "ds");cmd.Parameters.Clear();}catch (System.Data.OleDb.OleDbException ex){throw new Exception(ex.Message);}return ds;}}}

OleDbConnection是不支持连接postgresql数据库,所以就考虑到使用比较主流的框架SqlSugar,其中把OleDbParameter转换为SugarParameter进行查询,代码如下:

#region OleDbParameter转SugarParameter/// <summary>/// OleDbParameter转SugarParameter处理/// </summary>/// <returns></returns>public static (SugarParameter[], string) GetSugarParameterArry(OleDbParameter[] dbParameters, string SQLString){SugarParameter[] SGParameter = new SugarParameter[dbParameters.Length];DateTime? dtime = new DateTime?();for (int i = 0; i < dbParameters.Length; i++){int firstIndex = SQLString.IndexOf("?", i + 1);//查找第几次出现的_的索引位置if (firstIndex > -1){SQLString = SQLString.Remove(firstIndex, 1).Insert(firstIndex, ":" + dbParameters[i].ParameterName);  //删除索引位置处的一个字符,再进行该位置的insert}if (dbParameters[i].DbType.ToString() == "DateTime"){if (dbParameters[i].Value != null && dbParameters[i].Value.GetType().Name != "DBNull"){dtime = Convert.ToDateTime(dbParameters[i].Value);SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, dtime);}else{SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, dtime, dbParameters[i].DbType);}}else if (dbParameters[i].DbType.ToString() == "Decimal"){SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, Convert.ToDecimal(dbParameters[i].Value));}else if (dbParameters[i].DbType.ToString() == "AnsiString" && dbParameters[i].Value != null&& dbParameters[i].Value.GetType().Name != "String"){SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, dbParameters[i].Value.ToString());}else{SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, ((dbParameters[i].Value == null || Convert.ToString(dbParameters[i].Value) == "") ? DBNull.Value : (object)dbParameters[i].Value).ToString());}}return (SGParameter, SQLString);}/// <summary>/// OleDbParameter转SugarParameter处理/// </summary>/// <returns></returns>public static SugarParameter[] GetSugarParameterList(List<OleDbParameter> dbParameters, ref string SQLString){SugarParameter[] SGParameter = new SugarParameter[dbParameters.Count];DateTime? dtime = new DateTime?();for (int i = 0; i < dbParameters.Count; i++){int firstIndex = SQLString.IndexOf("?", i + 1);//查找第几次出现的_的索引位置if (firstIndex > -1){SQLString = SQLString.Remove(firstIndex, 1).Insert(firstIndex, ":" + dbParameters[i].ParameterName);  //删除索引位置处的一个字符,再进行该位置的insert}SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, dbParameters[i].Value);if (dbParameters[i].DbType.ToString() == "DateTime"){if (dbParameters[i].Value != null && dbParameters[i].Value.GetType().Name != "DBNull"){if (dbParameters[i].Value.ToString() != ""){dtime = Convert.ToDateTime(dbParameters[i].Value);SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, dtime);}else{SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, dtime, dbParameters[i].DbType);}}else{SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, dtime, dbParameters[i].DbType);}}else if (dbParameters[i].DbType.ToString() == "Decimal"){SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, Convert.ToDecimal(dbParameters[i].Value));}else if (dbParameters[i].DbType.ToString() == "AnsiString" && dbParameters[i].Value != null&& dbParameters[i].Value.GetType().Name != "String"){SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, dbParameters[i].Value.ToString());}else{SGParameter[i] = new SugarParameter(dbParameters[i].ParameterName, ((dbParameters[i].Value == null || Convert.ToString(dbParameters[i].Value) == "") ? DBNull.Value : (object)dbParameters[i].Value).ToString());}}return SGParameter;}/// <summary>/// 根据数据库类型替换某些内置函数/// </summary>/// <param name="SqlString_Place"></param>/// <returns></returns>public static string ReplaceType(string SqlString_Place){if (!string.IsNullOrEmpty(DbTypeStr)){//数据库providerName:SqlClient MySqlClient SQLite OracleManaged/OracleClient Npgsqlif (DbTypeStr.EndsWith("SqlClient", StringComparison.OrdinalIgnoreCase)){//SqlSugar.DbType.SqlServer;}else if (DbTypeStr.EndsWith("MySqlClient", StringComparison.OrdinalIgnoreCase)){//SqlSugar.DbType.MySql;}else if (DbTypeStr.EndsWith("SQLite", StringComparison.OrdinalIgnoreCase)){//SqlSugar.DbType.Sqlite;}else if (DbTypeStr.EndsWith("Oracle", StringComparison.OrdinalIgnoreCase)){//SqlSugar.DbType.Oracle;SqlString_Place = CaseInsenstiveReplace(SqlString_Place, "decode", "COALESCE");}else if (DbTypeStr.EndsWith("Npgsql", StringComparison.OrdinalIgnoreCase)){//SqlSugar.DbType.PostgreSQL;SqlString_Place = CaseInsenstiveReplace(SqlString_Place, "to_date", "to_timestamp");SqlString_Place = CaseInsenstiveReplace(SqlString_Place, "sysdate", "current_timestamp");SqlString_Place = CaseInsenstiveReplace(SqlString_Place, "sys_guid", "gen_random_uuid");SqlString_Place = CaseInsenstiveReplace(SqlString_Place, "INSTR", "strpos");}}return SqlString_Place;}static string CaseInsenstiveReplace(string originalString, string oldValue, string newValue){Regex regEx = new Regex(oldValue,RegexOptions.IgnoreCase | RegexOptions.Multiline);return regEx.Replace(originalString, newValue);}

下表列出了在Oracle数据库中常用的函数和它们在PostgreSQL数据库中的替代函数:

Oracle函数Postgresql替代函数
NVL(exp1, exp2)COALESCE(exp1, exp2)
DECODE(exp, value1, result1, value2, result2, ..., default_result)使用CASE表达式进行等效操作
GREATEST(value1, value2, ...)GREATEST(value1, value2, ...)
LEAST(value1, value2, ...)LEAST(value1, value2, ...)
MONTHS_BETWEEN(date1, date2)EXTRACT(MONTH FROM age(date2, date1))
LAST_DAY(date)date_trunc('month', date) + interval '1 month - 1 day'
TRUNC(date [, format])date_trunc('format', date)
ADD_MONTHS(date, num_months)date + interval 'num_months month'
SYSDATECURRENT_TIMESTAMP
ROWNUMROW_NUMBER() OVER()
TO_NUMBER(string [, format])CAST(string AS numeric)
TO_DATE(string, format)TO_DATE(string, format)CAST(string AS date)
INSTR(string, substring [, start_position [, occurrence]])POSITION(substring IN string [, start_position [, occurrence]])
SUBSTR(string, start [, length])SUBSTRING(string FROM start [FOR length])
LENGTH(string)LENGTH(string)CHAR_LENGTH(string)
REPLACE(string, search_string, replacement_string)REPLACE(string, from_string, to_string)
UPPER(string)UPPER(string)
LOWER(string)LOWER(string)
ROUND(number [,decimal_places])ROUND(number [, decimal_places])TRUNC(number [, decimal_places])
ABS(number)ABS(number)
CEIL(number)CEILING(number)
FLOOR(number)FLOOR(number)

这些函数在Oracle和PostgreSQL之间的语法和行为可能存在差异,因此在编写跨平台应用程序时,请务必查阅有关不同数据库之间的特定功能和语法差异的文档。

以上两个查询方法修改之后为:

      /// <summary>/// 执行查询语句,返回DataSet/// </summary>/// <param name="SQLString">查询语句</param>/// <returns>DataSet</returns>public static DataSet Query(string SQLString, params OleDbParameter[] cmdParms){SugarDbContext sugar = new SugarDbContext();var result = GetSugarParameterArry(cmdParms, SQLString);DataSet ds = null;try{using (var db = sugar.GetInstance()){SQLString = ReplaceType(SQLString);ds = db.Ado.GetDataSetAll(result.Item2, result.Item1);}--注意:oracel默认字段是大写,postgresql默认字段是小写}catch (Exception ex){throw new Exception(ex.Message + "\r\nSQLString:" + SQLString);}return ds;}/// <summary>/// 执行查询语句,返回DataSet/// </summary>/// <param name="SQLString">查询语句</param>/// <returns>DataSet</returns>public static DataSet Query(string SQLString, List<OleDbParameter> cmdParms){SugarDbContext sugar = new SugarDbContext();SugarParameter[] arParms = GetSugarParameterList(cmdParms, ref SQLString);DataSet dataSet = null;try{using (var Db = sugar.GetInstance()){SQLString = ReplaceType(SQLString);dataSet = Db.Ado.GetDataSetAll(SQLString, arParms);}--注意:oracel默认字段是大写,postgresql默认字段是小写return dataSet;}catch (Exception ex){throw new Exception(ex.Message + "\r\nSQLString:" + SQLString);}}

SugarDbContext类

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using SqlSugar;namespace  DBUtility
{public class SugarDbContext{//获取连接字符串        private static string Connection = DESEncrypt.Decrypt(ConfigurationManager.ConnectionStrings["OleDbConnectionString"].ConnectionString);private static DbType DBType;private static readonly string providerName = ConfigurationManager.AppSettings["DbType"];public SugarDbContext(){}/// <summary>/// SugarDb/// </summary>/// <param name="ConnectionString"></param>/// <returns></returns>public SqlSugarClient GetInstance(string ConnectionString = null){if (!string.IsNullOrEmpty(ConnectionString)){Connection = ConnectionString;}if (string.IsNullOrEmpty(Connection))throw new ArgumentNullException("数据库连接字符串为空!");elseDBType = GetSugarDbType();return new SqlSugarClient(new ConnectionConfig(){ConnectionString = Connection,           //必填, 数据库连接字符串DbType = DBType,                         //必填, 数据库类型IsAutoCloseConnection = true,            //默认false, 时候知道关闭数据库连接, 设置为true无需使用using或者Close操作InitKeyType = InitKeyType.SystemTable    //默认SystemTable, 字段信息读取, 如:该属性是不是主键,是不是标识列等等信息});}/// <summary>/// 根据链接字符串的providerName决定那种数据库类型/// </summary>/// <param name="setting"></param>/// <returns></returns>private DbType GetSugarDbType(){DBType = SqlSugar.DbType.Oracle;if (!string.IsNullOrEmpty(providerName)){//数据库providerName:SqlClient MySqlClient SQLite OracleManaged/OracleClient Npgsqlif (providerName.EndsWith("SqlClient", StringComparison.OrdinalIgnoreCase)){DBType = SqlSugar.DbType.SqlServer;}else if (providerName.EndsWith("MySqlClient", StringComparison.OrdinalIgnoreCase)){DBType = SqlSugar.DbType.MySql;}else if (providerName.EndsWith("SQLite", StringComparison.OrdinalIgnoreCase)){DBType = SqlSugar.DbType.Sqlite;}else if (providerName.EndsWith("Oracle", StringComparison.OrdinalIgnoreCase)){DBType = SqlSugar.DbType.Oracle;}else if (providerName.EndsWith("Npgsql", StringComparison.OrdinalIgnoreCase)){DBType = SqlSugar.DbType.PostgreSQL;}}return DBType;}}
}

以上是总结的之前遇到的问题,其他未注明,如有错误,还请指正~


http://www.ppmy.cn/news/84232.html

相关文章

互联网营销推荐算法理论-30分钟理解协同过滤

一、协同过滤概念 不论在淘宝还是京东&#xff0c;你浏览了/购买了某个商品A&#xff0c;后面几天你在该app内总是会在首页看到商品A和商品A相似的商品&#xff0c;背后支撑这种能力的就是推荐系统&#xff0c;而其推荐算法可能就是协同过滤。&#xff08;注&#xff1a;app内…

SpringBoot配置文件 | 多环境配置 | 读取配置的4种方式

文章目录 一、写配置文件的位置读取的优先级&#xff1a;1.文件位置&#xff1a;2.文件名和文件后缀&#xff1a;3.配置文件中的profile-specific文件&#xff1a;4.命令行参数 二、多环境配置1. properties&#xff1a;2. yaml 三、yaml配置文件yaml、properties、xml对比&…

关于C语言杂记7

文章目录 关于数组二级指针字符串字符串的输入与输出字符串函数1、字符数组的输入和输出&#xff1a;2、5种相关函数&#xff1a; 关于数组 char *fruits[LEN] { // 定义一个字符指针数组&#xff0c;包含LEN个元素"apple", // 初始化第1个元素为字符串"a…

JavaScript节点

1.创建节点 创造出一个新的网页元素&#xff0c;再添加到网页内&#xff0c;一般先创建节点&#xff0c;然后插入节点在这里插入代码片 创建方法&#xff1a; document.createElement(标签名)2.追加节点 想在界面看到&#xff0c;还得插入到某个父元素中 插入到父元素的最后…

数据库规范与SQL调优

数据库设计规范章节&#xff0c;依旧以《阿里巴巴Java开发手册》为原型进行修正和完善。 MySQL规约 (一) 建表规约 (二) 索引规约 (三) SQL规约 (四) ORM规约 (一) 建表规约 1. 【强制】 表达是与否概念的字段&#xff0c;必须使用is_xxx的方式命名&#xff0c;数据类型是…

探索可视化大屏:引领信息时代的视觉革命

可视化大屏是一种利用先进的数据可视化技术和交互技术&#xff0c;将大量的数据和信息以直观、易于理解的方式展示在大屏幕上的解决方案。可视化大屏通常由高分辨率的显示屏、强大的计算和处理设备以及专业的可视化软件组成&#xff0c;它通过图表、图形、动画等可视化元素&…

Linux文件里面查找指定内容的命令详解

公众号请关注"果酱桑", 一起学习,一起进步! 目录 1. grep命令 2. find命令 3. ack命令 4. ag命令 5. ripgrep命令 6. 总结 在Linux系统中&#xff0c;我们经常需要在文件中查找特定的内容。这个过程可能会非常繁琐&#xff0c;但是Linux提供了很多工具来帮助…

高压功率放大器在木结构的螺栓连接松动检测系统中的应用

实验名称&#xff1a;功率放大器在面向木结构的螺栓连接松动检测系统中的应用 实验设备&#xff1a; 计算机、压电传感器PZT、D型数显扭矩扳手、NIELVISII&#xff0b;数据采集卡、ATA-2021H功率放大器等。 实验过程&#xff1a; 设计了一种基于压电时间反演法的木材连接螺栓松…

什么是数字化?企业为什么要数字化转型

一、什么是数字化&#xff1f; 什么是数字化&#xff1f;在我理解&#xff0c;数字化是一个基于时代科技发展所产生的概念&#xff0c;首先它是一个工具&#xff0c;在企业的经营发展中将信息技术融入到传统的企业模式中&#xff0c;起到了转型的作用。 其次数字化转型是企业…

软考——邻接矩阵

数组(邻接矩阵)表示法 建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)。 设图A=(V,E)有n个顶点,则图的邻接矩阵是一个二位数组A.arcs[n][n],定义为:

C++ 位图及其应用

前言 现实生活中&#xff0c;有很多场景是需要处理数据量很大的数据的&#xff0c;比如&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 一看到这样的题&#xff0c;我们可能想到的就是 …

【selenium自动化测试入门】 python unittest单元测试框架

unittest又名PyUnit&#xff0c; Python单元测试框架&#xff08;The Python unit testing framework&#xff09;&#xff0c;简称为PyUnit。自从 Python 2.1 版本后&#xff0c;PyUnit成为 Python标准库的一部分。 为什么需要使用unittest单元测试框架&#xff1f; 当我们写…

Tensorflow2基础代码实战系列之CNN文本分类实战

深度学习框架Tensorflow2系列 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark …

Cobalt Strike工具基本使用

Cobalt Strike 安装启动启动server端启动client目标机器连接 工具基使用用户驱动攻击屏幕截图进程列表键盘记录文件管理远程vnc远程代理端口扫描 生成后门被攻击者运行后门文件后查看结果 钓鱼攻击信息收集网站克隆文件下载 安装 网盘地址&#xff1a;链接&#xff1a;https:/…

(汇编) 基于VS的x86汇编基础指令

文章目录 环境汇编基础标志位常用指令 vs配置END 环境 visual studio 选择x86运行 示例代码 /** | 32位 | 16位 | 高8位 | 低8位 | | ---- | ---- | ----- | ----- | | EAX | AX | AH | AL |*/ #include <iostream>int main() {int32_t x 1;int32_t y 2;//…

多模态对话语言模型-VisualGLM-6B

多模态对话语言模型-VisualGLM-6B 一、简介二、使用模型推理三、部署工具网页版 DemoAPI部署四、example五、交流一、简介 VisualGLM-6B 是一个开源的,支持图像、中文和英文的多模态对话语言模型,语言模型基于 ChatGLM-6B,具有 62 亿参数;图像部分通过训练 BLIP2-Qformer 构…

多地住建局推广工程资料电子化,帮助工程企业“降本增效”

工程资料签署和管理是每个在建工程绕不开的课题&#xff0c;庞大的签署量、动则几十万的签署成本如何优化&#xff1b;有关部门的合规审查如何过关…纸质工程资料需要面对的难题还有很多&#xff1a; 麻烦&#xff1a;从工程立项申报、审批、设计、施工到验收等全过程中产生的大…

如何使用Python和wxPython构建一个HTML Title提取工具

以下代码可以用于以下场景&#xff1a; 在Web开发中&#xff0c;获取网页中的Title内容&#xff0c;以用于页面SEO。在数据挖掘和分析中&#xff0c;获取包含Title信息的HTML页面&#xff0c;以进行进一步的文本处理和分析。在一些需要从HTML源代码中获取元数据的应用中&#…

最全iOS 上架指南

一、基本需求信息。 1、苹果开发人员账户&#xff08;公司已经可以无需申请&#xff0c;需要开启开发者功能&#xff0c;每年99美元&#xff09; 2、开发好应用程序 二、证书 上架版本需要使用正式证书。 1、创建Apple Developer证书 2、上传证书Sign In - Apple 3、点击开发者…

【ChatGPT】不会用ChatGPT?这几个镜像网站解决你的烦恼。

个人主页&#xff1a;【&#x1f60a;个人主页】 文章目录 前言ChatGPT介绍WoChatA TalkChatGPT Next WebAI EDUCHATGPTSITES 前言 还在为需要魔法才能与ChatGPT见上一面而叹息吗&#xff0c;今我就为大家汇总了国内能使用ChatGPT的方法。 也就是用国内的镜像网站玩ChatGPT&…
最新文章