【问题标题】:Executing Oracle Stored Procedure (PL/SQL) in ASP.NET MVC Core(C#)在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)
【发布时间】: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;
        }       

【问题讨论】:

    标签: c# sql asp.net-mvc plsql oracle11g


    【解决方案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
    • 朋友,看看:我已经编辑了我的问题:对吗?
    • 是的,我觉得不错。但是你可以在运行你的代码后说得更好。如果它工作与否
    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2017-04-13
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2017-12-21
    相关资源
    最近更新 更多