Avatar billede cogitans Nybegynder
18. oktober 2005 - 11:35 Der er 21 kommentarer og
1 løsning

Datareader og Transaction

Jeg vil gerne lave en stump kode, hvor jeg får tilgang til en database vha. en DataReader og over en Transaction. Men hvordan gøres dette? Findes der et eksempel et sted?
I anden omgang vil jeg også gerne sende forespørgsler til databasen med varierende parametre. Men dette er sekundært :-)
Avatar billede arne_v Ekspert
18. oktober 2005 - 11:45 #1
transaktioner relaterer sig primært til opdateringer ikke forespørgsler

men du starter vel bare en transaktion på din connection uanset hvad
Avatar billede cogitans Nybegynder
18. oktober 2005 - 11:52 #2
Ja, det er sådan set kun opdateringer, hvor transaktioner er interessante. Men hvis jeg så et eksempel, hvor det blev brugt på en forespørgsel, så kan jeg hurtigt selv lave det om. Men om jeg får et eksempel med det ene eller det andet, det er lige meget.
Jeg har prøvet at lave en 2-3 forskellige transactioner på connections af forskellige former. Men ingen af dem virker. Det er derfor, jeg gerne vil have et eksempel, hvor det er sikkert, at det virker.
Avatar billede arne_v Ekspert
18. oktober 2005 - 12:29 #3
hvad mener du "men ingen af dem virker" ?

du kalder BeginTransaction på din Connection og får et Transaction objekt
så udfører du et antal Command's
og så kalder du Commit eller Rollback på dit Tranaction objekt
Avatar billede cogitans Nybegynder
18. oktober 2005 - 13:13 #4
De virker ikke, når jeg forsøger at sætte indeholdet af forespørgslen ind i et dataset. Og jeg kan ikke se, hvorfor det ikke skulle virke. Det virker fint i andre tilfælde. Altså uden transaktionen.
Har du et komplet eksempel med enten select eller insert på en Access-database?
Avatar billede arne_v Ekspert
18. oktober 2005 - 13:53 #5
DataSet giver så vidt jeg kan vurdere ingen mening i forbindelse med
transaktioner.

Jeg kan sagtens lave et transaktions eksempel med 2 INSERT.
Avatar billede arne_v Ekspert
18. oktober 2005 - 13:58 #6
using System;
using System.Data.OleDb;

namespace E
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb");
            con.Open();
            OleDbTransaction tx = con.BeginTransaction();
            OleDbCommand cmd1 = new OleDbCommand("INSERT INTO T1 VALUES(7,'X')", con);
            cmd1.Transaction = tx;
            cmd1.ExecuteNonQuery();
            OleDbCommand cmd2 = new OleDbCommand("INSERT INTO T1 VALUES(8,'Y')", con);
            cmd2.Transaction = tx;
            cmd2.ExecuteNonQuery();
            tx.Commit();
            con.Close();

        }
    }
}
Avatar billede cogitans Nybegynder
18. oktober 2005 - 14:04 #7
Hvis man nu viser et dataset over indholdet af tabellen, og man så efterfølgende sætter data ind i tabellen via en transaktion, og man så gerne vil vise den opdaterede tabel i dataset'et igen, er det så ikke muligt?
Avatar billede cogitans Nybegynder
18. oktober 2005 - 14:06 #8
For ellers er en dataadaptor vel heller ikke interessant. Og jeg vil jo gerne have en transaktion og brugen af en dataadaptor sat sammen i samme løsning/class...?
Avatar billede cogitans Nybegynder
18. oktober 2005 - 14:34 #9
Jeg har fået det til at virke nu. Tak for det, Arne V.
Jeg har dog lige et enkelt spørgsmål mere i relation til dette overordnede spørgsmål. Nemlig om du kan hjælpe mig med parametre på min forespørgsel, så jeg kan arbejde med parameteriserede SQL-forespørgsler?
Avatar billede arne_v Ekspert
18. oktober 2005 - 14:38 #10
Et DataSet er noget man bruger til ar opbevare data i for en periode af
nogle minutter. En transaktion er noget som skal afsluttes i millisekunder.
Derfor synes jeg ikke at man kan bruge transaktioner sammen med DataSet.

At holde dit DataSet opdateret hvis andre retter i data må være helt
uafhængig af om der bruges transaktioner eller ej.
Avatar billede arne_v Ekspert
18. oktober 2005 - 14:38 #11
Eksempel på parametre:

using System;
using System.Threading;
using System.Data.OleDb;

class MainClass
{
    public static void Main(string[] args)
    {
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb");
        con.Open();
        OleDbCommand cre = new OleDbCommand("CREATE TABLE dtest (i INTEGER PRIMARY KEY, d DATETIME)", con);
        cre.ExecuteNonQuery();
        OleDbCommand ins = new OleDbCommand("INSERT INTO dtest VALUES (?, ?)", con);
        ins.Parameters.Add("@i", OleDbType.Integer);
        ins.Parameters.Add("@d", OleDbType.Date);
        for(int i = 0; i < 10; i++)
        {
            ins.Parameters["@i"].Value = i;
            ins.Parameters["@d"].Value = DateTime.Now;
            ins.ExecuteNonQuery();
            Thread.Sleep(1000);
        }
        Console.WriteLine("All rows :");
        OleDbCommand sel = new OleDbCommand("SELECT * FROM dtest", con);
        OleDbDataReader rdr = sel.ExecuteReader();
        while(rdr.Read())
        {
            int i = (int)rdr[0];
            DateTime d = (DateTime)rdr[1];
            Console.WriteLine(i + " " + d);
        }
        rdr.Close();
        Console.WriteLine("Rows last 5 seconds since " + DateTime.Now + " :");
        OleDbCommand sel2 = new OleDbCommand("SELECT * FROM dtest WHERE d > ?", con);
        sel2.Parameters.Add("@d", OleDbType.Date);
        sel2.Parameters["@d"].Value = DateTime.Now.AddSeconds(-5);
        OleDbDataReader rdr2 = sel2.ExecuteReader();
        while(rdr2.Read())
        {
            int i = (int)rdr2[0];
            DateTime d = (DateTime)rdr2[1];
            Console.WriteLine(i + " " + d);
        }
        rdr2.Close();
        OleDbCommand drp = new OleDbCommand("DROP TABLE dtest", con);
        drp.ExecuteNonQuery();
        con.Close();
    }
}
Avatar billede cogitans Nybegynder
18. oktober 2005 - 14:41 #12
Jeg vil nok give dig ret i dine tanker om dataset kontra transaktioner, efter du lige gav det eksempel :-)
Avatar billede cogitans Nybegynder
18. oktober 2005 - 14:44 #13
hmm, jeg kan godt se, at der er noget med nogle parametre forskellige steder i koden. Men jeg synes ikke lige, at jeg kan se den røde tråd. Vil du ikke skære det lidt ud i pap for mig? :-)
Avatar billede arne_v Ekspert
18. oktober 2005 - 14:48 #14
du sætter spørgsmålstegn ind i koden der hvor parameterne skal sættes ind

og så tilføjer du de parametre som du skal bruge - rækkefølgen er signifikant d.v.s.
at den første du tilføjer matcher første spørgsmålstegn

(i SqlClient/MySqlClient/OracleClient bruger man parameter navnet i SQL sætningen så
man ikke er rækkefølge afhængig)
Avatar billede cogitans Nybegynder
18. oktober 2005 - 15:12 #15
hmm, hvorfor sættes det i 2 omgange:

OleDbCommand ins = new OleDbCommand("INSERT INTO dtest VALUES (?, ?)", con);
ins.Parameters.Add("@i", OleDbType.Integer);
ins.Parameters.Add("@d", OleDbType.Date);
for(int i = 0; i < 10; i++)
{
    ins.Parameters["@i"].Value = i;
...

både i
ins.Parameters.Add("@
og i
ins.Parameters["@i"].Value = i;
?
Ah, er det fordi, at man først angiver hvilken datatype, der er tale om, og derefter indsætter man så det aktuelle element?
Avatar billede arne_v Ekspert
18. oktober 2005 - 15:15 #16
jeg mener godt at man kan gøre det i et hug men jeg gør det altid i to omgange

fordi det at definere en parameter og det at give parameteren en værdi til
et bestemt kald er to forskellige ting - og det første skal kun gøres
engang per statement mens det sidste kan gøres mange gange
Avatar billede cogitans Nybegynder
18. oktober 2005 - 15:18 #17
Okay. Men er der så nogen reel grund til at sætte tegnet "@" ind foran parameternavnet, når det aligevel blot er en del af en streng? Eller er det noget, som frameworket skal have, for at det kan behandle dataene korrekt?
Avatar billede arne_v Ekspert
18. oktober 2005 - 15:22 #18
man skal bruge @ i SqlClient - jeg ved ikke om man skal med OleDb - men jeg bruger
det altid selv
Avatar billede cogitans Nybegynder
18. oktober 2005 - 17:19 #19
så du ved ikke, om eksemplet fungerer, når der bruges @ i eksemplet?
Avatar billede arne_v Ekspert
18. oktober 2005 - 18:07 #20
jeg ved at det fungerer med @ - jeg ved ikke om det fungerer uden @ (med Access - med
SQLServer så skal @ være der)
Avatar billede arne_v Ekspert
18. oktober 2005 - 18:14 #21
og et svar
Avatar billede cogitans Nybegynder
18. oktober 2005 - 19:03 #22
Og velfortjente point!
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