Выполнение хранимой процедуры Oracle (PL / SQL) в ASP.NET Ядро MVC (C #)

#c# #sql #asp.net-mvc #plsql #oracle11g

#c# #sql #asp.net-mvc #plsql #oracle11g

Вопрос:

Я искал, но я не совсем понимаю, как выполнить хранимую процедуру через мое приложение, а затем зафиксировать транзакцию. Обратите внимание, что я подключен к базе данных 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();
    }
}
 

Также протестируйте свой SP, выполнив в СУБД.

Комментарии:

1. Эй, приятель, большое тебе спасибо за ответ; я не до конца понимаю 2 вещи? 1) Как вы начали использовать Oracle. Доступ к данным; с использованием Oracle. Доступ к данным. Клиент; работает? Как вы установили строку подключения? Как вы управляете операцией фиксации?

2. 1) Предполагая, что вы используете Visual Studio, вы можете добавить Oracle DataAccess pkg из диспетчера пакетов Nuget и использовать эти библиотеки. 2) DatabaseHelper. GetConnectionString() — это функция, которая возвращает мою строку подключения. вы можете передать свою строку непосредственно в конструкторе new OracleConnection("your string") . Хотя рекомендуется использовать статическую функцию. Так что, если вы измените строку подключения, вам не нужно находить каждое соединение и изменять. Вы измените только статическую функцию, и это будет хорошо

3. Для фиксации вы можете просто использовать предложение commit в своей хранимой процедуре, как и в других наборах запросов. Вы можете изучить синтаксис с примерами инструкции COMMIT здесь . ФИКСАЦИЯ oracle

4. Приятель, взгляни: я отредактировал свой вопрос: правильно ли это?

5. да, мне кажется, это хорошо. Но вы можете сказать лучше после запуска вашего кода. Работает ли оно или нет