#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. да, мне кажется, это хорошо. Но вы можете сказать лучше после запуска вашего кода. Работает ли оно или нет