Avatar billede rumbassen Nybegynder
11. september 2005 - 14:54 Der er 18 kommentarer og
1 løsning

Transaction ved brug af dataadapter

Hvordan bruger man transaction hvis man opdaterer en tabel via en dataadapter? skal man så åbne en connection selv for at det kan lade sig gøre, eller er der en smart måde at gøre det på.
Her er en stump kode jeg gerne vil have sat transaction på:

DSSQL.Tables[0].Rows.Add(XMLD);
SQLAdaptor.Update(DSFraSQL);
Avatar billede arne_v Ekspert
11. september 2005 - 14:58 #1
du kan vel:

SqlTransaction tx = conn.BeginTransaction();
DSSQL.Tables[0].Rows.Add(XMLD);
SQLAdaptor.Update(DSFraSQL);
tx.Commit();

hvor conn er den connection som din SQLAdaptor også er tilknyttet
Avatar billede arne_v Ekspert
11. september 2005 - 14:59 #2
men hvis du kun tilføjer en row inden du kalder Update hvorfor så gøre noget ?
Avatar billede arne_v Ekspert
11. september 2005 - 14:59 #3
(det må vel kun blive til 1 enkelt INSERT)
Avatar billede rumbassen Nybegynder
11. september 2005 - 15:04 #4
Jeg prøver at indsætte data i en SQL database fra en XML fil met det er muligt at jeg ikke gør det på den helt korrekte måde.
Avatar billede rumbassen Nybegynder
11. september 2005 - 15:17 #5
Jeg sætter flere Rows ind hvis det var det du mente med dit spørgsmål før.
kan du sige mig om dette ser nogenlunde fornuftigt ud?
foreach(DataRow XMLData in DSFraXML.Tables[0].Rows)
{
    DataRow XMLD = DSFraSQL.Tables[0].NewRow();
    XMLD["Email"]=XMLData["Email"];
    XMLD["Name"]=XMLData["Name"];
    XMLD["Adr"]=XMLData["Adr"];
    DSFraSQL.Tables[0].Rows.Add(XMLD);
}
           
SqlTransaction tx = conn.BeginTransaction();
DSSQL.Tables[0].Rows.Add(XMLD);
SQLAdap.Update(DSFraSQL);
tx.Commit();
Avatar billede arne_v Ekspert
11. september 2005 - 15:19 #6
jeg har ikke prøvet men det ser OK ud
Avatar billede rumbassen Nybegynder
11. september 2005 - 15:23 #7
Jeg får denne fejl når jeg køre koden:
Additional information: Invalid operation. The connection is closed

Er det nødvendigt at lave en
conn.Open();
conn.Close();
ugen om sådan en transaction? for så ryger fidusen lidt ved at bruge den dataadaptor gør det ikke?
Avatar billede arne_v Ekspert
11. september 2005 - 15:30 #8
hvorfor er din connection closed ?

nej - du skal ikke kalde Open & Close
Avatar billede arne_v Ekspert
11. september 2005 - 15:31 #9
men jeg kommer lidt i tvivl - jeg troede faktisk at data adapterens commands
holdt en open connection
Avatar billede rumbassen Nybegynder
11. september 2005 - 15:38 #10
Det er nettop det jeg er i tvivl om for en normal trancaction hvor man åbner en commection og selv lukker den igen kan jeg godt finde ud af at bruge det.
men jeg kan ikke lige se det med en dataadapter.
Avatar billede arne_v Ekspert
11. september 2005 - 15:53 #11
åbner og lukker du ikke også connection for den ??

fra docs:

    OleDbConnection myConn = new OleDbConnection(myConnection);
    OleDbDataAdapter myDataAdapter = new OleDbDataAdapter();
    myDataAdapter.SelectCommand = new OleDbCommand(mySelectQuery, myConn);
    OleDbCommandBuilder custCB = new OleDbCommandBuilder(myDataAdapter);

    myConn.Open();

    DataSet custDS = new DataSet();
    myDataAdapter.Fill(custDS);

    //code to modify data in dataset here

    myDataAdapter.Update(custDS);

    myConn.Close();
Avatar billede rumbassen Nybegynder
11. september 2005 - 16:06 #12
Jeg har ikke noget med at åbne og lukke connection.
Jeg gør således
SqlConnection connec = new SqlConnection(@"Data Source=(local);Integrated Security=SSPI;" + "Initial Catalog=DataFraPC");
               
SqlDataAdapter SQLAdap = new SqlDataAdapter("select * from FraXML",connec);
SqlCommandBuilder SQLBuilder = new SqlCommandBuilder(SQLAdap);
DataSet DSFraSQL = new DataSet();
SQLAdap.Fill(DSFraSQL);
Avatar billede arne_v Ekspert
11. september 2005 - 16:10 #13
prøv at putte explicit Open og Close kald ind for connec !
Avatar billede rumbassen Nybegynder
11. september 2005 - 16:21 #14
Så får jeg denne:

An unhandled exception of type 'System.InvalidOperationException' occurred in system.data.dll

Additional information: Execute requires the command to have a transaction object when the connection assigned to the command is in a pending local transaction.  The Transaction property of the command has not been initialized.
Avatar billede arne_v Ekspert
11. september 2005 - 16:25 #15
mystisk

http://www.developersdex.com/gurus/code/859.asp synes at bekræftige min tro
på at det burde virke
Avatar billede arne_v Ekspert
11. september 2005 - 16:27 #16
http://forums.asp.net/1026328/ShowPost.aspx siger dog at man skal eksplicit
assigne tx til de Commans's som DataAdapter har

så prøv det !
Avatar billede rumbassen Nybegynder
11. september 2005 - 16:39 #17
Mange tak for det har fået det til at virke således nu:
       
connec.Open();
SqlTransaction tr;
tr = connec.BeginTransaction(IsolationLevel.ReadCommitted);
SQLAdap.SelectCommand.Transaction = tr;
SQLAdap.Update(DSFraSQL);       
tr.Commit();
connec.Close();

Jeg synes nu stadig det er lidt mærkeligt at man skal åbne og lukke for den connection, når dataadaptoren ellers selv kan gøre dette og kan opdatere i databasen...
men mange tak for det, smid et svar så får du lige lidt points
Avatar billede arne_v Ekspert
11. september 2005 - 16:42 #18
klassisk problem stilling: hvis man lader et framwork selv gøre noget så bliver det
gjordt på standard måden - vil man hvae det gjordt specielt så må man selv gøre
noget mere
Avatar billede arne_v Ekspert
11. september 2005 - 16:42 #19
og svar
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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