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

【我的目的】: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方法添加代码
      • 3.3 画面启动,测试结果

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/
下载后双击,选择下面两项,并安装

C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第1张图片
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第2张图片

1 C#工程准备

1.1 新建工程

C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第3张图片
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第4张图片
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第5张图片
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第6张图片
下面是创建后的工程界面:
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第7张图片

1.2 添加控件

C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第8张图片
重复上述步骤,添加"TextBox"、"Button"控件C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第9张图片
双击button1
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第10张图片
ctrl+shift+s,可以全部保存
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第11张图片

1.3 添加dll

C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第12张图片
搜索内容:System.Data.OracleClient
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第13张图片
下图选择“确定”
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第14张图片
下图选择“我接受”
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第15张图片
安装完毕,参照下图:
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第16张图片

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;

C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第17张图片

参照下图,连接DB
用户名:naruto
密码:123456
主机名:localhost
端口:1521
sid:orcl
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第18张图片

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 '出生年月日';
/

C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第19张图片

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;
/

C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第20张图片

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;
/

C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第21张图片

3 书写代码

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

鼠标右键点击“WinFormApp1",然后依次选择:”添加"->”新建项"
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第22张图片
在弹出的窗口上,选择“设置文件”,名称默认即可,然后选择“添加“按钮。
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第23张图片
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第24张图片
修改名称:,这时“范围”列的值,被自动变更为“应用程序”了。
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第25张图片
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第26张图片
下图窗口,输入内容:
服务器名:localhost:1521/orcl
用户名:system
密码:123456
选择“保存密码”
输入完毕后,点击“测试连接”按钮,目的测试输入内容能否连接DB。
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第27张图片
点击“测试连接”按钮后,出现下图说明连接成功!!!
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第28张图片

依次关闭上面的两个窗口后,弹出下面的警告窗口,点击“是”。
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第29张图片
自动生成内容: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和代码分离。
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第30张图片

3.3 画面启动,测试结果

画面起来后,输入102,点击按钮button1
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第31张图片
第2个TextBox,成功取得存储过程的返回值"正常"
C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第32张图片
数据也登陆到了数据库当中。

C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离_第33张图片

你可能感兴趣的:(C#,c#,sql,oracle,存储过程,VS2022,代码分离)