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

下载和安装手顺: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和代码分离。
在这里插入图片描述

3.3 画面启动,测试结果

画面起来后,输入102,点击按钮button1
在这里插入图片描述
第2个TextBox,成功取得存储过程的返回值"正常"
在这里插入图片描述
数据也登陆到了数据库当中。

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的例子,演示了如何在C# WinForm窗口中嵌入控制台: ```csharp using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; namespace WinFormConsole { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // 启动控制台进程 Process process = new Process(); process.StartInfo.FileName = "cmd.exe"; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardInput = true; process.Start(); // 将控制台窗口嵌入到WinForm中 IntPtr handle = process.MainWindowHandle; SetParent(handle, consolePanel.Handle); // 设置控制台窗口位置和大小 SetWindowLong(handle, GWL_STYLE, WS_VISIBLE | WS_CHILD); MoveWindow(handle, 0, 0, consolePanel.Width, consolePanel.Height, true); } // WinAPI函数 [DllImport("user32.dll")] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport("user32.dll", SetLastError = true)] static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong); [DllImport("user32.dll", SetLastError = true)] static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); const int GWL_STYLE = -16; const uint WS_VISIBLE = 0x10000000; const uint WS_CHILD = 0x40000000; } } ``` 在这个例子中,我们创建了一个名为`consolePanel`的`Panel`控件,用于嵌入控制台窗口。在`Form1_Load`事件处理程序中,我们启动了一个控制台进程,并将其嵌入到`consolePanel`中。 请注意,我们使用了一些WinAPI函数来实现窗口嵌入。这些函数包括`SetParent`、`SetWindowLong`和`MoveWindow`。在这个例子中,我们使用了`DllImport`属性来声明这些函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值