【我的目的】: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,成功取得存储过程的返回值"正常"
 
 数据也登陆到了数据库当中。




















