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