Toon posts:

[C#] Transactie. ongedaan maken van een insert

Pagina: 1
Acties:

Verwijderd

Topicstarter
Een dataGrid met meerdere rijen moet in een database gezet worden.

Dit doe ik middels:

code:
1
2
3
4
foreach (DataGridItem dgi in datagrid.Items
{
  inserten();
}


nu kan het zijn dat de 1e rij is geinsert maar dat er bij de 2e rij iets fout loopt.
Ik wil dat de transactie stopt en dat de 1e rij ongedaan wordt gemaakt.

Het inserten gebreurd middels een stored procedure in een oracle database.

Verwijderd

Hoe heb je je DAL opgebouwt? is er een mogelijkheid om currenconnection.startTransaction te doen
dan je for each lus
en dan je commit transaction?
Dit zou de algemene werkwijze zijn.
Wat je anders kan doen is voor je for each een stored proc runnen die de transaction begint op de huidige connectie (dus manueel)
en na de for each de transactie commiit.
inserten() throwt gewoon een exception waneer het misgaat en die moet je dan opvangen in een rollback transaction.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Ooit al gehoord van exception-handling?

Dat kan je doen in C#:
code:
1
2
3
4
5
6
7
8
OleDbTransaction tr = connection1.StartTransaction();
try
{
}
catch
{
   tr.Rollback();
}


Je kan het echter ook in je Stored procedure doen:

code:
1
2
3
EXCEPTION
   WHEN others THEN
       ROLLBACK

(Eventueel kan je ook rollbacken tot een bepaald save-point.
[/code]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Verwijderd schreef op 20 August 2003 @ 11:46:
Hoe heb je je DAL opgebouwt? is er een mogelijkheid om currenconnection.startTransaction te doen
dan je for each lus
en dan je commit transaction?
Dit zou de algemene werkwijze zijn.
Wat je anders kan doen is voor je for each een stored proc runnen die de transaction begint op de huidige connectie (dus manueel)
en na de for each de transactie commiit.
inserten() throwt gewoon een exception waneer het misgaat en die moet je dan opvangen in een rollback transaction.
Ik heb als volgt opgebouwd(dus voor elke regel in de datagrid voort hij dit uit):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public static void ExecuteProcedure(string procedure, ArrayList inputparamlijst)
        {
            try
            {
                string cs = GetConnectString (); 
                string dp = DataProvider (); 
                IDbObjectFactory fa = DbFactoryBuilder.GetFactory(dp);
                using (IDbConnection co = fa.CreateConnection())
                {
                    co.ConnectionString = cs;                   
                    IDbCommand cmd = fa.CreateCommand();
                    cmd.Connection = co;
                    cmd.CommandText = procedure;
                    cmd.CommandType = CommandType.StoredProcedure;

                    /* loop door input parameters */
                    for (int i = 0 ; i < inputparamlijst.Count ; i++)
                    {
                        IDbDataParameter p = cmd.CreateParameter();
                        p.ParameterName = ((ProcParam)inputparamlijst[i]).parname;
                        p.Direction= ((ProcParam)inputparamlijst[i]).pardir;
                        p.DbType= ((ProcParam)inputparamlijst[i]).partype;
                        if (((ProcParam)inputparamlijst[i]).parsize != 0)
                        {
                            p.Size = ((ProcParam)inputparamlijst[i]).parsize;
                        }
                        if (((ProcParam)inputparamlijst[i]).parvalue != null)
                        {
                            p.Value = ((ProcParam)inputparamlijst[i]).parvalue;
                        }
                        cmd.Parameters.Add(p);
                    }
                    
                    co.Open();
                    cmd.ExecuteNonQuery();
                    co.Close();

                    for (int i = 0 ; i < inputparamlijst.Count; i++)
                    {
                        if (((ProcParam)inputparamlijst[i]).pardir == ParameterDirection.Output)
                        {
                            Debug.WriteLine(((ProcParam)inputparamlijst[i]).parname +" - "+ ((IDbDataParameter)cmd.Parameters[i]).ParameterName);
                            ((ProcParam)inputparamlijst[i]).parvalue = ((IDbDataParameter)cmd.Parameters[i]).Value.ToString();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                ((ProcParam)inputparamlijst[inputparamlijst.Count-1]).parvalue =  e.Message;
            }
        }
    }


en de stored proc zo:

code:
1
2
3
4
5
6
BEGIN
    Update statement
   COMMIT;
 EXCEPTION
        WHEN others THEN         
          pp_melding     := 'FOUT!';

[ Voor 4% gewijzigd door Verwijderd op 20-08-2003 11:55 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Zoals dus al gezegd:
Kijk eens naar de StartTransaction() method van het connection object, en naar de Commit() en rollback() methods van het transactie-object dat je dan terugkrijgt na een StartTransaction().

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 20 augustus 2003 @ 11:55:
Zoals dus al gezegd:
Kijk eens naar de StartTransaction() method van het connection object, en naar de Commit() en rollback() methods van het transactie-object dat je dan terugkrijgt na een StartTransaction().
Het connection object heeft een beginTransaction, hiermee moet ik dan aan de slag.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Ja.
Lees eens iets over transacties, lees eens in de .NET doc's over transacties, en hoe je ze kan gebruiken.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 20 August 2003 @ 12:01:
Ja.
Lees eens iets over transacties, lees eens in de .NET doc's over transacties, en hoe je ze kan gebruiken.
Bedankt voor de tip. thanx.
IK ga er eens mee aan de slag.

Zo op het 1e gezicht hebben transacties in de huidige situatie geen zin toch?
Ik roep per datagridrij de procedure aan, dus na elke rij wordt de connectie gesloten.

[ Voor 25% gewijzigd door Verwijderd op 20-08-2003 12:08 ]

Pagina: 1