C# - lassú insert mdb-be

C# - lassú insert mdb-be
2012-04-25T11:36:02+02:00
2012-04-26T12:30:41+02:00
2022-11-25T12:35:37+01:00
numetal17
Sziasztok,

az alábbi problémát szeretném megoldani, remélem tudtok segíteni:

Adott egy .mdb adatbázis (nevezzük adat.mdb-nek). Az adat.mdb-ben van egy [szunet] nevezetű tábla, itt adódott a probléma: C# programomból sikerül csatlakozni, célom az volna, hogy beszúrjak egy sort a [szunet] táblába, majd rögtön utána lekérdezzek belőle. Ez esetben a beszúrt értékek még nem jelennek meg a lekérezés eredményhalmazában. Ha a két művelet közé beiktatok egy 600-1000ms szünetet, akkor már látom a beszúrt adatokat. Egyértelmű, hogy az INSERT utasítás nagyon lassan hajtúdik végre (ellentétben az UPDATE, illetve SELECT utasításokkal), viszont nem tudom, hogy lehetséges-e ezen gyorsítani. Ha nem lehet, akkor hogyan tudom az INSERT alatt lock-olni a táblát (így a SELECT-nek várnia kellene az INSERT befejezéséig)? Fontos, hogy mdb-ben legyenek az adatok, az alkalmazásnak hálózat nélkül is működnie kell.. .. :/
Amiket próbáltam: tranzakciókezeléssel kiküszöbölni a problémát, provider cserét, index törlése a táblából (remélve, hogy ettől gyorsabb lesz az insert), viszont egyik sem hozza a várt eredményt. Egyedül a két utasítás közötti szünet segített eddig, viszont ez nem egy elegáns módszer, ettől jobbat szeretnék.

A válaszokat előre is köszönöm: numetal17
Mutasd a teljes hozzászólást!

  • Fontos, hogy mdb-ben legyenek az adatok, az alkalmazásnak hálózat nélkül is működnie kell.. .. :/

    Ez még nem zárná ki az SQL Express-t..

    Egyébként jó lenne látni a kódod (akár csatolhatod is, ha hosszúnak találod).
    Mutasd a teljes hozzászólást!
  • Igazad van, az indoklásom nem teljes: azért is szükséges, hogy Accessben legyenek az adatok, hogy ne kelljen a kihelyezéskor SQL Express-t telepíteni a gépekre. Amolyan odateszem-és-fut módszer kellene. Az ötlet szerintem is pocsék, de ez a feladatom..
    Mutasd a teljes hozzászólást!
  • Amolyan odateszem-és-fut módszer kellene.

    Azért az Access-nél is lehet telepítendő (pl.aktuális MDAC).

    A kódod láthatnánk?
    Mutasd a teljes hozzászólást!
  • Parancs: (használok elég sok saját objektumot, remélem a kommentek, és az elnevezések segítenek)

    //szünet küldése adatbázisba public static void send_status(int status) { //kapcsolódás adatbázishoz program.database.connect(); //jelenlegi műszak adatainak lekérdezése program.current_shift.get_current_shift_data(); //a jelenlegi műszak szüneteinek lezárása String query = "UPDATE [break] SET [break_to]=NOW() WHERE [break_to] IS NULL AND [shift_id]=" + program.current_shift.shift_id.ToString(); program.database.do_query(query); //a jelenlegi műszak új szünete - LASSÚ query = "INSERT INTO [break]([shift_id],[break_from],[break_category_id]) VALUES (" + program.current_shift.shift_id.ToString() + ",NOW(),"+status.ToString()+")"; program.database.do_query(query); Thread.Sleep(1000); //az interface frissítése adatbázisból program.main_window.refresh_interface(true); } public void refresh_interface(Boolean from_database) { if(from_database) { String query = ""; int break_category_id = 0; //jelenlegi műszak adatainak lekérdezése program.current_shift.get_current_shift_data(); //státusz query = "SELECT TOP 1 [break_category_id] FROM (SELECT [bc].[break_category_id], [bc].[break_priority] FROM [break] AS [b] INNER JOIN [break_category] AS [bc] ON [b].[break_category_id] = [bc].[break_category_id]WHERE ((([b].[break_from])<NOW()) AND (([b].[break_to]) IS NULL OR ([b].[break_to])>NOW())) UNION ALL SELECT [bc].[break_category_id], [bc].[break_priority] FROM [break_category] AS [bc] WHERE [bc].[break_category_id]=4) AS SEL ORDER BY [break_priority]"; program.database.do_query(query, "status"); break_category_id = Convert.ToInt32(program.database.data_set.Tables["status"].Rows[0]["break_category_id"]); program.database.disconnect(); switch (break_category_id) { case 1: program.main_window.status_panel.BackColor = System.Drawing.Color.Red; break; case 2: program.main_window.status_panel.BackColor = System.Drawing.Color.Yellow; break; case 3: program.main_window.status_panel.BackColor = System.Drawing.Color.Blue; break; case 4: program.main_window.status_panel.BackColor = System.Drawing.Color.Green; break; } } else { } }
    Mutasd a teljes hozzászólást!
  • Bocsi, de ezt a kódhalmazt nélkülözhetnéd ha típusos dataset-et használnál.
    Néhány kattintás a varázslóval s minimum a tizedére csökkenthetnéd a kódod sorait.
    Melyik VS-t használod (5/8/10)?
    Mutasd a teljes hozzászólást!
  • 1. ha ugyanezt az insert-et mondjuk közvetlenül access felületen adod ki, akkor is lassú?
    2. Hány idexelt mező van a kérdéses táblában?
    Mutasd a teljes hozzászólást!
  • Az access felületen gyors, index (már) nincs. Először nekem is ezek a kérdések ugrottak be (gondoltam sokáig tarthat az insert miatt frissítgetni a indexet, ezért mindet levettem).
    Mutasd a teljes hozzászólást!
  • VS 2008.
    Egyébként értem én, hogy rövidebb kódom lenne, de a problémát szerintem egyértelműen nem ez okozza.
    Mutasd a teljes hozzászólást!
  • Egyébként értem én, hogy rövidebb kódom lenne


    Nemcsak rövidebb, de egyszerűbb is, mert a tableadapter-Update egy menetben hajt végre mindent (módosítás, beszúrás, törlés).
    Egyébként mekkora az a tábla, hány sorból áll?
    Mutasd a teljes hozzászólást!
  • Nincs benne sok, 20-30 jelenleg. Később persze jóval több lesz benne.
    Mutasd a teljes hozzászólást!
  • Nincs benne sok, 20-30 jelenleg

    Akkor valami nagyon nem gömbölyű.
    Talán ezek kódját is megmutathatnád:

    program.database.connect(); program.database.do_query(query);
    Mutasd a teljes hozzászólást!
  • Esetleg mdb helyett SQLite (http://www.sqlite.org/)?
    Mutasd a teljes hozzászólást!
  • Szvsz nem az mdb-vel, sokkal inkább a kóddal lehet gond.
    Persze a tévedés kizárásához látni kéne a részleteket..
    Mutasd a teljes hozzászólást!
  • Egyébként értem én, hogy rövidebb kódom lenne, de a problémát szerintem egyértelműen nem ez okozza.


    Miért nem próbálod ki?

    Fogj egy üres projectet, egy üres adatbázist, és rakd össze dataset-tel, varázslóval.

    Aztán ha az gyorsan működik, akkor az alapján át tudod alakítani a valódi projectedet.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd