在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)

Posted

技术标签:

【中文标题】在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)【英文标题】:Executing Oracle Stored Procedure (PL/SQL) in ASP.NET MVC Core(C#) 【发布时间】:2021-05-27 00:52:29 【问题描述】:

我一直在搜索,但我不完全了解如何通过我的应用程序执行存储过程,然后提交事务。请注意,我已连接到 Oracle 11g 数据库。

看看,这是我的功能,我尝试过这样的事情,但对我来说似乎不正确:

 public void CreateRow(Person person)
        
            using SqlConnection con = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand("SP_InserNewRow", con);

            cmd.CommandType = CommandType.StoredProcedure;


            cmd.Parameters.AddWithValue("@CODE", person.CODE);
            cmd.Parameters.AddWithValue("@NAME", person.NAME);
            cmd.Parameters.AddWithValue("@LASTNAME", person.LASTNAME);

            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();

        

这是我的模型 cs 文件:

public class Person
        public int CODE  get; set; 
        public string NAME  get; set; 
        public string LASTNAME  get; set; 
    

这是我的 Oracle 存储过程:

create or replace PROCEDURE SP_InserNewRow(
                    CODE IN NUMBER,
                    NAME IN VARCHAR,
                    LASTNAME IN VARCHAR) AS
BEGIN

INSERT INTO MyTable(CODE,NAME,LASTNAME) VALUES (CODE, NAME, LASTNAME);

END SP_InserNewRow;

通过MVC执行它的正确方法是什么?

我如何提交交易?

在Oracle11g和Oracle12中尝试执行有什么不同吗?


编辑:

readonly string connectionString = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxxxxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=PROD)));User Id=xxx;Password=xxxx;"

public IEnumerable<Person>GetPersonList
        
            var listPerson = new List<Person>();

            using (OracleConnection con = new OracleConnection(connectionString))
            

                OracleCommand cmd = new OracleCommand("select * from myview", con);
                cmd.Connection = con;
                cmd.InitialLOBFetchSize = 1000;
                cmd.CommandType = CommandType.Text;
                con.Open();
                OracleDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                var list = new Person();
                    list.CODE = Convert.ToInt32(dr["CODE"].ToString());
                    list.NAME = dr["NAME"].ToString();
                    list.LASTNAME = dr["LASTNAME"].ToString();

                    listPerson.Add(list);
                
                con.Close();
            
            return listPerson;
               

【问题讨论】:

【参考方案1】:

我建议你使用 OracleConnection 而不是 SqlConnection

using Oracle.DataAccess;
using Oracle.DataAccess.Client;

public DataTable GetHeader_BySproc(string unit, string office, string receiptno)

    using (OracleConnection cn = new OracleConnection(DatabaseHelper.GetConnectionString()))
    
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = cn;
        cmd.InitialLONGFetchSize = 1000;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@CODE", person.CODE);
        cmd.Parameters.AddWithValue("@NAME", person.NAME);
        cmd.Parameters.AddWithValue("@LASTNAME", person.LASTNAME);

        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
    

还可以通过在 DBMS 中执行来测试您的 SP。

【讨论】:

您好,非常感谢您的回复;我不完全理解两件事? 1)你是如何使用 Oracle.DataAccess;using Oracle.DataAccess.Client; 工作的?你是如何设置你的连接字符串的?你是如何管理 COMMIT 操作的? 1) 假设您使用的是 Visual Studio,您可以从 Nuget 包管理器添加 Oracle DataAccess pkg 并使用这些库。 2) DatabaseHelper.GetConnectionString() 是一个返回我的连接字符串的函数。您可以直接在构造函数new OracleConnection("your string") 中传递您的字符串。虽然建议您使用静态函数。因此,如果您更改连接字符串,则不必查找每个连接并进行更改。您只会在静态函数中进行更改,并且会很好 要提交,您可以像其他查询集一样在存储过程中简单地使用提交子句。您可以在此处通过 COMMIT 语句示例学习语法。 oracle COMMIT 朋友,看看:我已经编辑了我的问题:对吗? 是的,我觉得不错。但是你可以在运行你的代码后说得更好。如果它工作与否

以上是关于在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 在 ASP.NET Core 3.1 MVC 中使用会话变量

ASP.NET Core MVC(C#) 文件上传及后台输出响应Aspose.Words处理后文件

如何在 C# 中将数据发送到 ASP.NET Core MVC 控制器?

在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)

C# jQuery Ajax 数据表 ASP.NET Core 5 MVC

如何在 C# 页面 ASP.NET Core MVC 上使用 SignInManager 和 Usermanager