Backend - ADO.NET(C# 操作Oracle、PostgreSQL DB)

news2025/1/8 2:54:08

目录

一、引入参考

1. ConfigurationManager的调用前提:

 2. NpgsqlConnection的调用前提:

 3. OracleConnection的调用前提:

二、设置数据库链接字串

1. 在App.config中设定链接数据库详情

2. 获取数据库链接字串

三、调用

1.调用Oracle数据库

2.调用postgre数据库

3.结合不同数据库联合查询


一、引入参考

1. ConfigurationManager的调用前提:

方案总管 > 项目的“参考”> 右键-加入参考 > 在架构中勾选System.Configuration > 确定。

代码需引用:using System.Configuration;

 2. NpgsqlConnection的调用前提:

点击工具栏的“工具” > NuGet套件管理员 > 管理方案的NuGet套件(程式若启动了,先终止运行) > 搜寻插件名Npgsql > 查看该项目是否安装。

代码需引用:using Npgsql;

 3. OracleConnection的调用前提:

点击工具栏的“工具” > NuGet套件管理员 > 管理方案的NuGet套件(程式若启动了,先终止运行) > 搜寻插件名Oracle.ManagedDataAccess > 查看该项目是否安装。

代码需引用:using Oracle.ManagedDataAccess.Client;

二、设置数据库链接字串

1. 在App.config中设定链接数据库详情

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
	<appSettings>
		<add key="BookOracle" value="User Id=Luobogan;Password=12345678;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.XXX.XXX.XXX)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=Book)))"/>
		<add key="BookPostgre" value="Host=10.XXX.XXX.XXX;Port=5432;Database=Book;Username=Luobogan;Password=12345678;"/>
	</appSettings>
</configuration>

2. 获取数据库链接字串

// 获取Oracle链接字串时:
private string OracleConn = ConfigurationManager.AppSettings["BookOracle"].ToString();
// 获取postgre链接字串时:
private string PgConn = ConfigurationManager.AppSettings["BookPostgre"].ToString();

三、调用

1.调用Oracle数据库

// 引入组件
using System.Configuration;
using System.Data;
using Oracle.ManagedDataAccess.Client;


// 获取数据库信息&设置查询语句(读取设定)
private string OracleConn = ConfigurationManager.AppSettings["BookOracle"].ToString();
string bookpublishplace = "新闻出版社";
string OracleSql = $@"SELECT * FROM ""Book"" WHERE publishplace='{bookpublishplace}' ";


// 查询Oracle数据库
DataTable GetResTb = OracleQuery(OracleSql, OracleConn);
List GetResList = GetResTb.AsEnumerable().Where(x => x.Field<string>("author") == "萝卜").Select(x => x.Field<string>("bookname")).Distinct().ToList();
public DataTable OracleQuery(string sql, string connstr)
{
    try
    {
        using (OracleConnection conn = new OracleConnection(connstr))
        {
            conn.Open();
            OracleCommand cmd = new OracleCommand(sql, conn);
			// 执行查询,以table形式返回查询结果
            OracleDataAdapter dataAdapter = new OracleDataAdapter(cmd);
            DataTable dt = new DataTable();
            dataAdapter.Fill(dt);
            conn.Close();
            return dt;
			// 执行新增/更新/删除,用数字0,1返回更新结果
			// int result = cmd.ExecuteNonQuery();
			// conn.Close();
			// return result;
        }
    }
    catch (Exception ex)
    {
		// 执行查询,以空值null返回异常值
        return null;
		// 执行新增/更新/删除,用数字-1返回异常值
		// return -1;
    }
}


// 执行Oracle数据库的存储过程
OracleParameter[] OracleParameters = new OracleParameter[] {
	new OracleParameter("存储过程栏位名1", OracleDbType.NVarchar2, 20, Factoryname, ParameterDirection.Input),
	new OracleParameter("存储过程栏位名2", OracleDbType.NVarchar2, 20, Factoryname, ParameterDirection.Input),
	new OracleParameter("返回存储过程Table1", OracleDbType.RefCursor, 40, "", ParameterDirection.Output),
	new OracleParameter("返回存储过程Table2", OracleDbType.RefCursor, 40, "", ParameterDirection.Output),
	new OracleParameter("return_sql", OracleDbType.NVarchar2, 20000, "", ParameterDirection.Output),
	new OracleParameter("return_code", OracleDbType.Int32, 6, 0, ParameterDirection.Output),
};
DataSet BookDataSet = OracleQueryProcedure(OracleConn, "执行过程名", OracleParameters);
authorname = '萝卜'
DataTable getResTb = BookDataSet.Tables[0];
DataRow[] rows = getResTb.Select($"author ='{authorname}'");
if (rows.Length > 0)
{
    getColumnRes = rows[0]["authorage"].ToString()
}

public DataSet OracleQueryProcedure(string connstr, string procedurename, OracleParameter[] Parameter)
{
    try
    {
        using (OracleConnection conn = new OracleConnection(connstr))
        {
            conn.Open();
            OracleCommand cmd = new OracleCommand();
            cmd.CommandText = procedurename;
            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(Parameter);
            cmd.ExecuteNonQuery();
            OracleDataAdapter dataAdapter = new OracleDataAdapter(cmd);
            DataSet ds = new DataSet();
            dataAdapter.Fill(ds);
            conn.Close();
            return ds;
        }
    }
    catch (Exception ex)
    {
        return null;
    }
}


// 批量插入Oracle数据库
private string targetConn = ConfigurationManager.AppSettings["OracleDB"].ToString();
DataTable resData = 获取的表数据;
Dictionary<string, string> AddColumnMappings = new Dictionary<string, string>() {
	{ "待插入datatable的栏位名", "数据库表的栏位名" },
	{ "book_id", "BOOKID" },
	{ "book_name", "BOOKNAME" },
};
var res = OracleBulkInsert(targetConn, "表名", resData, AddColumnMappings) == 1 ? "success" : "fail";
Console.WriteLine($"res:{res}");
 

/// <summary>
/// Oracle数据库--批量插入
/// </summary>
/// <param name="connstr">数据库链接</param>
/// <param name="targettb">目标表</param>
/// <param name="dataTable">待插入数据</param>
/// <param name="AddColumnMappings">列名映射</param>
/// <returns>int</returns>
public int OracleBulkInsert(string connstr, string targettb, DataTable dataTable, Dictionary<string, string> AddColumnMappings)
{
	try
	{
		using (OracleConnection conn = new OracleConnection(connstr))
		{
			conn.Open();                    
			using (var bulkCopy = new OracleBulkCopy(conn)) // 使用 OracleBulkCopy 来批量插入数据
			{
				bulkCopy.DestinationTableName = targettb; // 设置Oracle目标表名
				bulkCopy.BatchSize = 1000; // 每次批量插入1000行数据                        
                foreach (var kvp in AddColumnMappings)
                {
					bulkCopy.ColumnMappings.Add(kvp.Key, kvp.Value); // DataTable 的列名会映射到 Oracle 表的列名
				}
				bulkCopy.WriteToServer(dataTable); // 执行批量插入
			}
			return 1;
		}
	}
	catch (Exception ex)
	{
		//throw ex;
		return -1;
	}
}

2.调用postgre数据库

在另一篇文章中:Backend - ADO.NET(C# 操作PostgreSQL DB)_c# postgresql-CSDN博客

3.结合不同数据库联合查询

以下写法是结合了ADO.NET LINQ to Objects

class CombineTb
{
	public string newbookname { get; set; } // 结合新表的栏位1
	public string newbookauthor { get; set; } // 结合新表的栏位2
	public string newbookplace { get; set; }    // 结合新表的栏位3
}
string OracleSql = $@"SELECT * FROM Book' ";
string PgSql = $@"SELECT bookplace,author,bookname FROM BookPublish";
DataTable GetOracleResTb = OracleQuery(OracleSql, OracleConn);
DataTable GetPostgreResTb = PgQuery(PgSql, PgConn);
List<CombineTb> CombineData = (from a in GetOracleResTb.AsEnumerable()
						   join b in GetPostgreResTb.AsEnumerable()
						   on new { bookname = a.Field<string>("name"), author = a.Field<string>("author") } equals
						   new { bookname = b.Field<string>("bookname"), author = b.Field<string>("authorname") }
						   select new CombineTb
						   {
							   newbookname = b.Field<string>("bookname"),
							   newbookauthor = b.Field<string>("authorname"),
							   newbookplace = b.Field<string>("bookplace")
						   }).Distinct().ToList();
List<string> authorList = CombineData.Where(x => x.newbookname == "数据结构").Select(x => x.newbookauthor).Distinct().ToList();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ Qt练习项目 QChar功能测试

个人学习笔记 代码仓库 GitCode - 全球开发者的开源社区,开源代码托管平台 新建项目 设计UI 1、拖入group box去掉名字 2、拖入2个LineEdit 3、拖入两个Label 4、拖入两个PushButton 5、点栅格布局 1、拖入GroupBox 2、拖入4个PushButton 3、点栅格布局 1、拖入GroupBo…

QT c++ 样式 设置 标签(QLabel)的渐变色美化

上一篇文章中描述了按钮的纯色&#xff0c;本文描述标签的渐变色美化。 1.头文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> //#include "CustomButton.h"#include <QVBoxLayout> #include <QLinearGradient> #include <QLabel…

【C++面向对象——输入输出流】处理二进制文件(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、流类库中常用的类及其成员函数 二、标准输入输出及格式控制 三、文件的应用方法&#xff08;二进制文件、文本文件&#xff09; 编程要求 实验步骤 通关代码 测试结果 任务描述 本关任务&#xff1a; 用二进制方式打开指定的…

基于大数据爬虫+Python+数据可视化大屏的慧游数据爬虫与推荐分析系统(源码+论文+PPT+部署文档教程等)

博主介绍&#xff1a;**CSDN毕设辅导第一人、**全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流 **技术范围&#xff1a;**S…

Linux Shell 脚本编程基础知识篇—awk的条件判断(3)

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周五了&#xff0c;又是一周过去了&#x1f606; 本文是有关Linux shell脚本编程的awk命令的条件语句&#xff0c;后续我会不断增加相关内容 ~~ 回顾:【awk字符串函数和内置变量】 更多Linux 相关内容请点击&#x1f449;【Li…

MITRE ATTCK 简介:初学者指南

网络安全已成为当今数字世界的一个关键问题。随着网络威胁日益复杂&#xff0c;组织需要一种结构化的方法来理解和应对这些风险。这就是 MITRE ATT&CK 框架发挥作用的地方。如果您是网络安全新手或刚刚开始探索威胁分析和缓解&#xff0c;本指南将为 MITRE ATT&CK 提供…

生物医学信号处理--绪论

前言 参考书籍&#xff1a;刘海龙&#xff0c;生物医学信号处理&#xff0c;化学工业出版社 生物医学信号分类 1、由生理过程自发或者诱发产生的电生理信号和非电生理信号 • 电生理信号&#xff1a;ECG/心电、EEG/脑电、EMG/肌电、 EGG/胃电、 EOG/眼电 • 非电生理信号&am…

理解 Tomcat 架构与自定义实现

前言 Tomcat 是一个轻量级的 Web 容器&#xff0c;被广泛应用于 Java Web 开发中。通过它&#xff0c;我们可以轻松地部署和运行 Web 应用。在本文中&#xff0c;我们将深入分析 Tomcat 的核心架构&#xff0c;同时结合一段代码&#xff0c;手动实现一个简化的 Tomcat 服务&am…

怎样修改el-table主题样式

起因&#xff1a;el-table有主题样式&#xff0c;部分需要单独设置 环境&#xff1a;ideanodejs插件谷歌浏览器 第一步&#xff1a;找到scss文件&#xff1a; 谷歌浏览器打开表格页面&#xff0c;ctrlshifti打开开发者工具&#xff0c;点击后鼠标移动到表格单元格上单击一下…

模型 九屏幕分析法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。九屏幕法&#xff1a;全方位分析问题的系统工具。 1 九屏幕分析法的应用 1.1 新产品研发的市场分析 一家科技公司计划开发一款新型智能手机&#xff0c;为了全面评估市场潜力和风险&#xff0c;他们…

CSS 学习之 padding 与图形绘制

padding 属性和 background-clip 属性配合&#xff0c;可以在有限的标签下实现一些 CSS 图形绘制效果&#xff0c;我这里举两个小例子&#xff0c;重在展示可行性。 例 1:不使用伪元素&#xff0c;仅一层标签实现大队长的“三道杠”分类图标效果。此效果在移动端比较常见&…

AI在电子制造中的应用:预测质量控制

一、 电子制造中存在的质量问题 电子制造过程中&#xff0c;由于生产工艺复杂、材料种类繁多、生产环境要求高等因素&#xff0c;可能会出现各种质量问题。 常见质量问题如下&#xff1a; 1. 空焊 原因&#xff1a;锡膏活性较弱、钢网开孔不佳、铜铂间距过大或大铜贴小元件、…

(已开源-AAAI25) RCTrans:雷达相机融合3D目标检测模型

在雷达相机融合三维目标检测中&#xff0c;雷达点云稀疏、噪声较大&#xff0c;在相机雷达融合过程中提出了很多挑战。为了解决这个问题&#xff0c;我们引入了一种新的基于query的检测方法 Radar-Camera Transformer (RCTrans)。具体来说&#xff1a; 首先设计了一个雷达稠密…

WPS计算机二级•数据查找分析

听说这里是目录哦 通配符&#x1f30c;问号&#xff08;?&#xff09;星号&#xff08;*&#xff09;波形符&#xff08;~&#xff09; 排序&#x1f320;数字按大小排序以当前选定区域排序以扩展选定区域排序 文字按首字母排序 快速筛选分类数据☄️文字筛选数字筛选颜色筛选…

(leetcode算法题)191. 位1的个数 和 338. 比特位计数

对于一个正整数 n&#xff0c;如果对这个正整数执行 n & (n - 1); 的代码&#xff0c;将会得到一个整数m n 和 m的关系&#xff1a;n 的二进制表示 与 m的二进制表示中除了n最右边的1取值不同&#xff0c;其他都相同 比如114514 和 114512 的二进制表示中第2位&#xff0…

mongodb==安装prisma连接

官网下载mongodb,解压安装 Download MongoDB Community Server | MongoDB 修改bin/mongod.cfg # mongod.conf# for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/# Where and how to store data. storage:dbPat…

安装Cockpit服务,使用Web页面管理你的Linux服务器

说起管理 Linux 服务器&#xff0c;大家首先想到的使用 SecureCRT、Xshell、MobaXterm 等工具远程到服务器&#xff0c;然后使用命令行管理服务器。今天给大家介绍一个好玩的工具&#xff0c;名字叫Cockpit&#xff0c; Cockpit 是一个免费开源的基于 web 的 Linux 服务器管理…

Excel | 空格分隔的行怎么导入excel?

准备工作&#xff1a;windows&#xff0c;一个记事本程序和微软的Excel软件。 打开记事本&#xff0c;选中所有内容&#xff0c;按CtrlA全选&#xff0c;然后复制(CtrlC)。 在Excel中&#xff0c;定位到你想粘贴的单元格&#xff0c;按CtrlV进行粘贴。粘贴后&#xff0c;你会在…

深度评测uni-app x:开启跨平台开发新篇章

文章目录 一、引言1.1 跨平台开发的崛起1.2 uni-app x 初印象 二、uni-app x 核心特性评测2.1 uts 语言&#xff1a;跨平台编程新利器2.2 uvue 渲染引擎&#xff1a;原生渲染新体验2.3 强大的组件和 API 支持2.4 插件生态&#xff1a;拓展无限可能 三、与 uni-app 对比&#xf…

Mac修改文件权限

查看文件权限 ll -all 修改读写权限 sudo chmod -R arwx /usr/local/mysql-5.7.30-macos10.14-x86_64/data/a_test 修改用户分组 sudo chown -R _mysql:wheel /usr/local/mysql-5.7.30-macos10.14-x86_64/data/b_test