我正在使用oracle事务将多表、多表、、、一个主表和两个详细表同时插入到中。所以我将把一条记录插入主表,多条记录插入到另外两张表。如果在所有表中操作成功,我需要返回值1,如果发生错误,我将返回0,如果主表中已经存在数据,则返回3。我需要在c#中这样做,下面是我的代码,以及如何修改代码以使用循环插入到其他表中
public int RunOracleTransaction(Student s, Marks[] m, Course []s)
{
using (OracleConnection connection = new OracleConnection(connectionString))
{
connection.Open();
OracleCommand command = connection.CreateCommand();
OracleTransaction transaction;
// Start a local transaction
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
// Assign transaction object for a pending local transaction
command.Transaction = transaction;
try
{
// what i shall do to insert 1 record to master data and multi records //to details data as one transaction ?
}
catch (Exception e)
{
transaction.Rollback();
Console.WriteLine(e.ToString());
Console.WriteLine("Neither record was written to database.");
}
}
}发布于 2017-08-26 19:16:34
您几乎实现了它:
public int RunOracleTransaction(Student s, Marks[] m, Course[] c) {
//TODO: validate s, m, c
using (OracleConnection connection = new OracleConnection(connectionString)) {
connection.Open();
using (OracleCommand command = connection.CreateCommand()) {
using (OracleTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)) {
command.Transaction = transaction;
try {
// Insert the student
//TODO: put actual query here
command.CommandText =
@"insert into Students(name)
values (:prm_Name)
returning id into :prm_id"; // <- we want inserted student's id
//TODO: check actual RDBMS types
command.Parameters.Add(":prm_Name", OracleType.VarChar).Value = s.Name;
command.Parameters.Add(":prm_Id", OracleType.VarChar).Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
string studentId = Convert.ToString(comm.Parameters[":prm_Id"].Value);
// Insert his/her marks
command.Parameters.Clear(); // <- forget all prior parameters
//TODO: put actual query here
command.CommandText =
@"insert into StudentsMarks(student_Id, mark)
values (:prm_Student_Id, :prm_Mark)";
//TODO: check actual RDBMS types
command.Parameters.Add(":prm_Student_Id", OracleType.VarChar).Value = studentId;
command.Parameters.Add(":prm_Mark", OracleType.Int32);
// insert each mark (in a loop)
foreach (var mark in m) {
command.Parameters[":prm_Mark"].Value = m.Mark;
command.ExecuteNonQuery();
}
// Finally, commit all the inserts
transaction.Commit();
}
catch (DataException e) {
transaction.Rollback();
Console.WriteLine(e.ToString());
Console.WriteLine("Neither record was written to database.");
}
}
}
}
//TODO: your method returns integer value, please return it
}https://stackoverflow.com/questions/45897833
复制相似问题