Avatar billede rif1900 Nybegynder
26. august 2007 - 11:20 Der er 4 kommentarer og
1 løsning

This SqlTransaction has completed; it is no longer usable.

Hej eksperter!

Jeg sidder med et meget meget irriterende problem.

Koden ser ud som følger.

        db.Open();
        transaction = db.BeginTransaction();
        db.Close();
        try
        {
            foreach (string varnavn in Varname)
            {
                cmd = new SqlCommand
                (Makestring_tbl_questionrel_variables(qid,
                varnavn), db, transaction);
                cmd.Connection.Open();
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
                cmd.Dispose();
            }

            // Nu forsøger vi at definere alle ejerskaber for
            foreach (Owner2Unit o2u in ownerships)
            {
                foreach (int omraade in o2u.Omraader)
                {
                    cmd = new SqlCommand
                    (Makestring_tbl_question_2_owner(o2u.Ejer_ID,
                    qid, omraade, o2u.IsOne), db, transaction);
                    cmd.Connection.Open();
                    cmd.ExecuteNonQuery();
                    cmd.Connection.Close();
                    cmd.Dispose();
                }
            }

            foreach (int costype in Kundetyper)
            {
                cmd = new SqlCommand
                (Makestring_tbl_questionrel_costumortype(qid,
                costype), db, transaction);
                cmd.Connection.Open();
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
                cmd.Dispose();
            }

            transaction.Commit();
        }
        catch (SqlException sqlError)
        {
            transaction.Rollback();
        }
        //transaction.Rollback();
        db.Close();
    }

Jeg får på transaction.Commit() en fejl der lyder:
This SqlTransaction has completed; it is no longer usable.

Dataene bliver stadig sat i databasen korrekt, så det er egenligt bare hammer irriterende at den exception overhovedet findes.

Det sidste step i stack trace back er.
System.Data.SqlClient.SqlTransaction.ZombieCheck()

HJÆÆLP :)
Avatar billede rif1900 Nybegynder
26. august 2007 - 11:29 #1
Nå det ser sku ud til det er et bug i det taber ado 2.0

SYMPTOMS
An error may occur in a Microsoft ADO.NET 2.0 application because of the following sequence of events:1. You open a connection and start a Transact-SQL transaction by using the "System.Data.SqlClient" namespace. 
2. You close the connection without completing the Transact-SQL transaction. 
3. You request another connection and receive the previous connection from the connection pool. 
4. You start a new transaction by using the SqlConnection.BeginTransaction method. 
You may receive the following error message:
This SqlTransaction has completed; it is no longer usable.

at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.get_IsolationLevel()
at TestRepro.Program.Main(String[] args)


det var da irriterende at bruge 30 min på det lort.
http://support.microsoft.com/kb/912732

Hvis nogle skulle få samme problem
Avatar billede rif1900 Nybegynder
26. august 2007 - 11:39 #2
Nå det hotfix der løser heller ikke problemet..

hvis nogle ser en fejl med min kode så sig venligst til.

Laver fandme snart et script der laver manuelt rollback
Avatar billede rif1900 Nybegynder
26. august 2007 - 11:44 #3
Final...

Dem der er dovne som mig kan fixe problemet ved ikke at åbne og lukke forbindelse, altså noget alla:

        db.Open();
        transaction = db.BeginTransaction();
        try
        {
            // Nu førsøger vi at smide alle tilhørende variabelnavne i databasen
            foreach (string varnavn in Varname)
            {
                new SqlCommand(Makestring_tbl_questionrel_variables(qid, varnavn), db, transaction).ExecuteNonQuery();
            }

            // Nu forsøger vi at definere alle ejerskaber for
            foreach (Owner2Unit o2u in ownerships)
            {
                foreach (int omraade in o2u.Omraader)
                {
                    new SqlCommand(Makestring_tbl_question_2_owner(o2u.Ejer_ID, qid, omraade, o2u.IsOne), db, transaction).ExecuteNonQuery();
                }
            }

            // Nu forsøger vi at smide alle kundetyper over i tbl_questionrel_costumortype
            foreach (int costype in Kundetyper)
            {
                new SqlCommand(Makestring_tbl_questionrel_costumortype(qid, costype), db, transaction).ExecuteNonQuery();

            }

            transaction.Commit();
        }
        catch (SqlException sqlError)
        {
            transaction.Rollback();
        }
        //transaction.Rollback();
        db.Close();
Avatar billede rif1900 Nybegynder
26. august 2007 - 11:44 #4
closed
Avatar billede arne_v Ekspert
26. august 2007 - 16:20 #5
Det er den rigtige løsning du har valgt !

En transaktion er knyttet til en connection - det er altid:
  open
  begin
  statement 1
  ...
  statement n
  commit
  close
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