C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离

news2024/11/17 4:30:09

【我的目的】:SQL和代码分别存放在不同的地方,便于随时修改SQL的内容,也便于修改SQL的书写格式
方案1:把SQL存放在DataSet.xsd中实现SQL和代码分离
方案2:用存储过程实现SQL和代码分离

我最倾向方案1,利用DataSet.xsd自动生成insert和update、select方法,可以非常方便的管理SQL和操作DB,然而却没有实现,只能退而求其次,选择方案2。在实现方案2的时候,最初也失败了,但是在写博客复现整个过程的时候,却成功了,非常意外,特此记录,与君分享。

CSDN上所能查到的博客,都是很不完整的记录,基本上都是只有代码,甚至是部分代码,很难根据代码复现C#调用Oracle存储过程
。希望我的完整记录能帮助到需要的人,包括我自己

目录

    • 0.完成下面开发环境的准备
      • 1 操作系统Win11 专业版 21H2
      • 2 oracle 19.3
      • 3 Visual Studio Community 2022
    • 1 C#工程准备
      • 1.1 新建工程
      • 1.2 添加控件
      • 1.3 添加dll
    • 2 数据库准备
      • 2.1 创建用户并连接DB
      • 2.2 创建表
      • 2.3 创建存储过程
    • 3 书写代码
      • 3.1 添加Settings1.settings,生成数据库连接串。
      • 3.2 button1_click方法添加代码

0.完成下面开发环境的准备

1 操作系统Win11 专业版 21H2

2 oracle 19.3

下载和安装手顺:https://blog.csdn.net/u011159350/article/details/125432921

3 Visual Studio Community 2022

下载地址:https://visualstudio.microsoft.com/zh-hans/vs/community/
下载后双击,选择下面两项,并安装

在这里插入图片描述
在这里插入图片描述

1 C#工程准备

1.1 新建工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面是创建后的工程界面:
在这里插入图片描述

1.2 添加控件

在这里插入图片描述
重复上述步骤,添加"TextBox"、"Button"控件在这里插入图片描述
双击button1
在这里插入图片描述
ctrl+shift+s,可以全部保存
在这里插入图片描述

1.3 添加dll

在这里插入图片描述
搜索内容:System.Data.OracleClient
在这里插入图片描述
下图选择“确定”
在这里插入图片描述
下图选择“我接受”
在这里插入图片描述
安装完毕,参照下图:
在这里插入图片描述

2 数据库准备

2.1 创建用户并连接DB

CREATE USER naruto IDENTIFIED BY "123456";

GRANT CREATE SESSION, CREATE VIEW, ALTER SESSION, CREATE SEQUENCE TO naruto;
GRANT CREATE SYNONYM, CREATE DATABASE LINK, RESOURCE , UNLIMITED TABLESPACE TO naruto;

ALTER SESSION SET CURRENT_SCHEMA=naruto;
ALTER SESSION SET NLS_LANGUAGE=American;
ALTER SESSION SET NLS_TERRITORY=America;

在这里插入图片描述

参照下图,连接DB
用户名:naruto
密码:123456
主机名:localhost
端口:1521
sid:orcl
在这里插入图片描述

2.2 创建表

/*
-- 作成表的中文名:人员信息表
-- 作成表的英文名:M_MEMBER
-- 作成组织:无
-- 作成日期:2023/07/30
-- 作成者:烟图黛螺
-- 修改历史:2023/07/30 烟图黛螺 新建文件
*/

------- 永久删除表,不进入回收站 ----------
DROP TABLE M_MEMBER PURGE;
/

------- 创建表 ----------
CREATE TABLE M_MEMBER (
     MEMBER_ID           VARCHAR2(5 CHAR) NOT NULL
    ,SEX                 VARCHAR2(1 CHAR)
    ,HOME_ADDRESS        VARCHAR2(200 CHAR)
    ,BIRTH_YMD           VARCHAR2(8 CHAR)
);
/

-------添加主键索引----------
ALTER TABLE M_MEMBER ADD CONSTRAINT PK_M_MEMBER PRIMARY KEY (MEMBER_ID);
/

------- 添加表和列名的注释 ----------
COMMENT ON TABLE M_MEMBER IS '人员信息表';
/
COMMENT ON COLUMN M_MEMBER.MEMBER_ID IS '人员ID';
/
COMMENT ON COLUMN M_MEMBER.SEX IS '性别';
/
COMMENT ON COLUMN M_MEMBER.HOME_ADDRESS IS '家乡地址';
/
COMMENT ON COLUMN M_MEMBER.BIRTH_YMD IS '出生年月日';
/

在这里插入图片描述

2.3 创建存储过程

CREATE OR REPLACE PACKAGE PC_TEST AS

PROCEDURE PR_INSERT_TEST (
     LV_MEMBER_ID  IN  VARCHAR2 -- 人员ID
    ,LV_RESULT     OUT VARCHAR2 -- 返回结果
);

END PC_TEST;
/

在这里插入图片描述

CREATE OR REPLACE PACKAGE BODY PC_TEST AS

PROCEDURE PR_INSERT_TEST (
     LV_MEMBER_ID  IN  VARCHAR2 -- 人员ID
    ,LV_RESULT     OUT VARCHAR2 -- 返回结果
) IS
BEGIN
INSERT INTO M_MEMBER (
                       MEMBER_ID
                      ,SEX
                      ,HOME_ADDRESS
                      ,BIRTH_YMD
                     ) VALUES (
                       LV_MEMBER_ID
                      ,'男'
                      ,'火影大陆木叶村'
                      ,'29991231'
                     );

LV_RESULT := '正常';
EXCEPTION
    WHEN OTHERS
    THEN
        LV_RESULT := '异常';

END PR_INSERT_TEST;
END PC_TEST;
/

在这里插入图片描述

3 书写代码

3.1 添加Settings1.settings,生成数据库连接串。

鼠标右键点击“WinFormApp1",然后依次选择:”添加"->”新建项"
在这里插入图片描述
在弹出的窗口上,选择“设置文件”,名称默认即可,然后选择“添加“按钮。
在这里插入图片描述
在这里插入图片描述
修改名称:,这时“范围”列的值,被自动变更为“应用程序”了。
在这里插入图片描述
在这里插入图片描述
下图窗口,输入内容:
服务器名:localhost:1521/orcl
用户名:system
密码:123456
选择“保存密码”
输入完毕后,点击“测试连接”按钮,目的测试输入内容能否连接DB。
在这里插入图片描述
点击“测试连接”按钮后,出现下图说明连接成功!!!
在这里插入图片描述

依次关闭上面的两个窗口后,弹出下面的警告窗口,点击“是”。
在这里插入图片描述
自动生成内容:Data Source=localhost:1521/orcl;Persist Security Info=True;User ID=naruto;Password=123456;Unicode=True
在这里插入图片描述

记得随时保存,ctrl+shift+s,保存

3.2 button1_click方法添加代码

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                OracleConnection connection = new OracleConnection(Settings1.Default.connectionstring);
                OracleCommand cmd = connection.CreateCommand();

                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "PC_TEST.PR_INSERT_TEST";

                OracleParameter op_in = new OracleParameter("LV_MEMBER_ID", OracleType.VarChar, 200);
                op_in.Value = textBox1.Text;
                op_in.Direction = ParameterDirection.Input;
                cmd.Parameters.Add(op_in);

                OracleParameter op_out = new OracleParameter("LV_RESULT", OracleType.VarChar, 200);
                op_out.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(op_out);

                connection.Open();
                cmd.ExecuteNonQuery();
                connection.Close();
                cmd.Dispose();

                textBox2.Text = op_out.Value.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

可以看到下面窗口中的代码没有SQL语句,十分干净,实现了SQL和代码分离。
在这里插入图片描述
画面起来后,输入102,点击按钮button1
在这里插入图片描述
第2个TextBox,成功取得存储过程的返回值"正常"
在这里插入图片描述
数据也登陆到了数据库当中。

在这里插入图片描述

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

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

相关文章

链路 聚合

静态链路聚合:多数内网使用 。非物理直连建议与BFD联动 动态链路聚合LACP:是公有协议、内网、二层专线接口都能使用,现网多数使用此方式链路 聚合 PAGP:思科私有协议,只支持思科设备使,现网多数不用

Windows驱动开发

开发Windows驱动程序时,debug比较困难,并且程序容易导致系统崩溃,这时可以使用Virtual Box进行程序调试,用WinDbg在主机上进行调试。 需要使用的工具: Virtual Box:用于安装虚拟机系统,用于运…

谨防虚假发货!了解如何辨别真假发货单号

随着电子商务的发展,快递行业成为了一个不可忽视的重要环节。然而,虚假发货单号的出现给快递行业带来了一定的困扰。为了解决这个问题,一些快递批量查询高手软件开始应用于虚假发货单号的分析。本文将介绍这些软件如何分析出虚假发货单号&…

应用开发者的疑问:大模型是银弹吗?

被当成银弹的大模型 ChatGPT 火了之后,大模型似乎被当成了真正的银弹,所有的体验问题都想通过大模型解决: 能不能和大模型对话订机票?自然语言生成 SQL,简化报表分析工作?大模型帮老年人操作软件&#xff…

nosql之redis集群

文章目录 一.redis集群1.单节点redis服务器带来的问题2.集群redis3.集群的优势4.redis集群的实现方法5.redis群集的三种模式5.1 主从复制5.2 哨兵5.3 集群 二.Redis 主从复制1.主从复制概念2.主从复制的作用3.主从复制流程4.搭建Redis 主从复制4.1 安装 Redis4.2 修改 Redis 配…

RBF神经网络原理和matlab实现

1.案例背景 1.1 RBF神经网络概述 径向基函数(Radical Basis Function,RBF)是多维空间插值的传统技术,由Powell于1985年提出。1988年, Broomhead和 Lowe根据生物神经元具有局部响应这一特点,将 RBF引入神经网络设计中,产生了RBF神经网络。1989 年,Jackson论证了…

开源项目-erp企业资源管理系统(毕设)

哈喽,大家好,今天给大家带来一个开源项目-erp企业资源管理系统,项目通过ssh+oracle技术实现。 系统主要有基础数据,人事管理,采购管理,销售管理,库存管理,权限管理模块 登录 主页 基础数据 基础数据有商品类型,商品,供应商,客户,仓库管理功能

Python零基础入门(十)——模块与包

系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python入门专栏:《Python入门》欢迎阅读,一起进步!🌟🌟🌟 码字不易,如果觉得文章不…

【C语言-扫雷游戏全功能详解】

目录 理解扫雷原理 梳理扫雷过程 9*9 棋盘 初始化棋盘 显示棋盘 ​编辑 布置雷 排查雷 统计x,y坐标周围有几个雷 使用递归函数来实现周围没地雷时展开多个 判断成功排除后剩下的方格数是否等于地雷数 排查函数 梳理编写代码思路 头文件game.h 库函数所需要头文件 …

STM32 cubemx配置USART DMA传输

文章目录 前言一、DMA概念二、STM32 DMA数据手册分析3.DMA模式介绍4.cubemx配置总结 前言 本篇文章来讲解DMA的概念,并使用DMA来进行串口的数据收发。 一、DMA概念 DMA(Direct Memory Access,直接内存访问)是一种计算机系统的技…

vue 设置数组

手写获取数据 <el-form-item label"缴纳方"><el-select v-model"form.invoiceCategoryName" placeholder"请选择缴纳方"><el-optionv-for"item in kplmList":key"item.value":label"item.label":v…

求解方程x^2=a的根,不使用库函数直接求解(不动点迭代法)

首先可以将方程两边同时加上x&#xff0c;&#xff0c;这时候两边同时再除以1x&#xff0c;就得到了&#xff0c;变形为。&#xff08;变性后的迭代式不唯一&#xff0c;这里随便选取一个&#xff09; 当x是准确值的时候&#xff0c;两边应该是相等的&#xff0c;如果x是近似值…

数据库连接池的使用

十、数据库连接池的使用 1、c3p0数据库连接池 硬编码&#xff1a; c3p0的帮助文档 c3p0配置文件&#xff1a; 2、dbcp数据库连接池 配置文件&#xff1a; 3、druid 将上面三个做成工具类&#xff1a;

单网卡实现 双IP 双网段(内外网)同时运行

前提是内外网是同一网线连接&#xff08;双网线双网卡的具体可以自己搜索下。理论上都设置静态IP后把外网跃点设置小&#xff0c;内网跃点设置大&#xff0c;关闭自动跃点设置同一个接口跃点数&#xff0c;在通过命令提示符添加内网网址走内网网关就可以了&#xff09;。 需要使…

Mac 定时重启 TouchBar 脚本(缓解闪烁问题)

背景 Mac 笔记本 TouchBar 是真的脆啊&#xff0c;合盖使用一段时间就废了&#xff0c;右侧一直闪烁简直亮瞎眼 &#x1f602; 经过观察&#xff0c;总结出闪烁规律如下&#xff1a; 工作状态&#xff1a;不断操作电脑时&#xff0c;触控栏处于工作状态&#xff0c;几乎不闪…

Git分布式版本控制工具和GitHub(一)--简介

一.Git概述 1.Git简介 【1】什么是Git? Git就是代码版本管理工具。 【2】为什么要使用Git &#xff08;1&#xff09;版本控制 写代码就是不断写BUG的过程&#xff08;当然我们是不会这么说的&#xff09;&#xff0c;很多时候你写了100行代码之后&#xff0c;突然醒悟&…

APP自动化测试-Python+Appium+Pytest+Allure框架实战封装(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 pytest只是单独的…

Spring——更快捷的存储 / 获取Bean对象

文章目录 前言一、存储 Bean 对象类注解为什么有五个类注解使用类注解存储对象配置扫描路径(重中之重)添加注解存储 Bean 对象 方法注解配置扫描路径(重中之重)使用方法注解存储对象 二、获取 Bean 对象Autowired属性注入Setter注入构造方法注入 Resource 总结 前言 本人是一个…

day17-二叉树的迭代遍历

二叉树的迭代遍历 二叉树的递归遍历是比较简单的 前序中序后序 前序遍历 前序遍历代码如下&#xff1a; class Solution { public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res;preorder(root,res);return res;}void preorder(TreeNode* …

进度条 Vue2 +PC端 ,点击页面加载时页面顶部的那个蓝条

提示&#xff1a; <div class"global-loading"> </div> css:less <style lang"less"> .global-loading {background-color: red;height: 10px;position: fixed;z-index: 999;width: 0;animation: grow 2s infinite forwards;}keyframe…