Avatar billede mikkel_strack Nybegynder
06. marts 2007 - 15:36 Der er 3 kommentarer og
1 løsning

Opdatere 'komplekst' objekt i databasen

Jeg sidder med en asp.net applikation, som indeholder et 'lidt komplekst' objekt. Med lidt komplekst forståes at det ikke bare er en enkelt tabel der skal indsættes i eller opdateres.


Jeg er ingen haj til database. Min viden begrænser sig i store træk til det allermest almindelige.

Med ovenstående objekt, så er problemet når der skal opdateres i databasen. Man kunne forestille sig at der er foretaget ændringer, som betyder at nogle rækker skal slettes, andre indsættes og nogle  som skal opdateres.

I mit hoved er det letteste:
1) Slet alt som har med objektet at gøre
2) Indsæt hele skidtet på ny

Men hva hvis det hele går galt imellem 1 og 2. Kan man lave noget med rollback og commit (som jeg ved intet om udover at det findes), eller skal jeg gribe det an på anden måde?

Mvh. Mikkel
Avatar billede arne_v Ekspert
06. marts 2007 - 15:48 #1
umiddelbart tror jeg at en stribe UPDATE vil være bedre end DELETE+INSERT

et simpelt eksempel på brug af transaktion i C#:

            MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password=");
            con.Open();
            MySqlTransaction tx = con.BeginTransaction(IsolationLevel.Serializable);
            MySqlCommand cmd1 = new MySqlCommand("INSERT INTO T1 VALUES(7,'X')", con);
            cmd1.Transaction = tx;
            cmd1.ExecuteNonQuery();
            MySqlCommand cmd2 = new MySqlCommand("INSERT INTO T1 VALUES(8,'Y')", con);
            cmd2.Transaction = tx;
            cmd2.ExecuteNonQuery();
            tx.Commit();
            con.Close();

(det er så tilfældigvis MySQL, men det er det samme for andre databaser)
Avatar billede mikkel_strack Nybegynder
06. marts 2007 - 16:38 #2
Hej Arne

Som altid lige i øjet! :o)
Smid et svar!

Hvis du lige gider kommentere på måden jeg har opbygget min nye gemmefunktion vil det være helt kanon.

public void SaveSale()
{
    Database DB = new Database();

    DB.OpenConnection();

    SqlTransaction oSqlTransaction = DB.OSqlConnection.BeginTransaction(IsolationLevel.Serializable);

    SqlCommand sc;
    //Selve salgsdelen
    sc = this.CommandSaveSale(DB);
    sc.Transaction = oSqlTransaction;
    sc.ExecuteNonQuery();

    //UserShare
    foreach (UserShare aUserShare in AUserShareContainer)
    {
        sc = aUserShare.CommandSave(DB);
        sc.Transaction = oSqlTransaction;
        sc.ExecuteNonQuery();
    }

    //MediaShare
    foreach (MediaShare aMediaShare in AMediaShareContainer)
    {
        sc = aMediaShare.CommandSave(DB);
        sc.Transaction = oSqlTransaction;
        sc.ExecuteNonQuery();
    }

    oSqlTransaction.Commit();

    DB.CloseConnection();
}
Avatar billede arne_v Ekspert
06. marts 2007 - 16:57 #3
svar

det ser fint ud - måske skal du overveje at catche noget exception og lave en
eksplicit Rollback
Avatar billede mikkel_strack Nybegynder
06. marts 2007 - 17:58 #4
Takker. Det vil jeg få med :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester