Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: SQLite locked

Aktivity
Avatar
Martin
Člen
Avatar
Martin:5.10.2014 17:29

Dobrý den,
dal jsem se do programovaní v c# a bojuji s databází SQLite. Mám vytvořených několik příkazů k přístupům ale u jednoho jediného mě to padá a píše chybu "Additional information: database is locked" Prošel jsem poctivě všechny příkazy otevření databáze a všechny jsou zavřeny, ani použití usigu mě nepomohlo (podle netu). Je to chyba, která se objevuje nahodile, jednou projde třeba 10x po sobě a pak zase 5x ne, je to nepříjemná chyba při které padá celý program a nevím jak ji podchytit, zachytit nebo jinak ošetřit.

public void UpdateZapis(String druzstvo, String okres, bool kategorie, Double hodnoceniL, Double hodnoceniP, Double hodnoceni)
{
    string cas = "12:00:00";

    getConnection().Open();

    using (SQLiteCommand command = new SQLiteCommand("UPDATE TabulkaUtok SET Lterc=@param1, Pterc=@param2, Cas=@param3, Hodnoceni=@param4 WHERE Druzstvo=@param5 AND Okres=@param6 AND Kategorie=@param7", this.connection))
    {
        command.Parameters.Add(new SQLiteParameter("@param1", hodnoceniL));
        command.Parameters.Add(new SQLiteParameter("@param2", hodnoceniP));
        command.Parameters.Add(new SQLiteParameter("@param3", cas));
        command.Parameters.Add(new SQLiteParameter("@param4", hodnoceni));
        command.Parameters.Add(new SQLiteParameter("@param5", druzstvo));
        command.Parameters.Add(new SQLiteParameter("@param6", okres));
        command.Parameters.Add(new SQLiteParameter("@param7", kategorie));
        command.ExecuteNonQuery(); // zde vyhodí chybu
    }
    getConnection().Close();
    VypocetPoradi();
}

Jsem v koncích a proto vás prosím o radu. Děkuji předem

Editováno 5.10.2014 17:31
 
Odpovědět
5.10.2014 17:29
Avatar
Odpovídá na Martin
Michal Štěpánek:5.10.2014 17:37

Nejsem si jistý, ale asi bych názvy "sloupců" dal do hranatých závorek, a zkusil bych se podívat, jaké hodnoty těch parametrů se dosazují do příkazu. Pokud to vyhazuje chybu asi se snažíš vložit jiný typ dat, než je na "sloupci" v databázi nastaven, nebo máš parametr prázdný a databáze vyžaduje nějakou hodnotu...

Editováno 5.10.2014 17:40
Nahoru Odpovědět
5.10.2014 17:37
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin
Člen
Avatar
Odpovídá na Michal Štěpánek
Martin:5.10.2014 17:48

Typové dosazení proměnných je určitě dobře, kontrolováno. Můžeš uvést příklad té závorky, nějak nemám představu jak by to mohlo vypadat.

 
Nahoru Odpovědět
5.10.2014 17:48
Avatar
Odpovídá na Martin
Michal Štěpánek:5.10.2014 17:52
using (SQLiteCommand command = new SQLiteCommand("UPDATE [TabulkaUtok] SET [Lterc]=@param1, [Pterc]=@param2, [Cas]=@param3, [Hodnoceni]=@param4 WHERE [Druzstvo]=@param5 AND [Okres]=@param6 AND [Kategorie]=@param7", this.connection))

Zkus si před ukládáním ty parametry vypsat...

Nahoru Odpovědět
5.10.2014 17:52
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin
Člen
Avatar
Odpovídá na Michal Štěpánek
Martin:5.10.2014 18:11

Bohužel nic, závorky opraveny a prováděna kontrola při zápisu, vždy vše naplněno jak má být.

 
Nahoru Odpovědět
5.10.2014 18:11
Avatar
Odpovídá na Martin
Michal Štěpánek:5.10.2014 18:15

Pak už nevím, s SQLite jsem nikdy nedělal... Neprovádí se současně s tím UPDATEm ještě něco jiného, co by mohlo zamykat tu DB?

Nahoru Odpovědět
5.10.2014 18:15
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin
Člen
Avatar
Odpovídá na Michal Štěpánek
Martin:5.10.2014 18:24

Před volám funkce mám vše uzavřené.

MessageBox.Show(getConnection().State.ToString());
getConnection().Open();
MessageBox.Show(getConnection().State.ToString());

Kontrolováno, vždy je Close ikdyž hodí chybu a pak open. Uměle jsem tam vytvořil chybu v uzavření a to zobrazí při dvojitém pokusu o otevření hned v příkazu getConnection()­.Open() takže by měl mít jen jeden přístup.

 
Nahoru Odpovědět
5.10.2014 18:24
Avatar
Odpovídá na Martin
Michal Štěpánek:5.10.2014 19:01

Nevím, jestli SQLite má taky nějaké transakční logy, zkus se podívat, když ti to vyhodí chybu, jestli není ten konkrétní záznam uzamčen...
Jinak už jsem v koncích...

Nahoru Odpovědět
5.10.2014 19:01
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin
Člen
Avatar
Odpovídá na Michal Štěpánek
Martin:5.10.2014 19:07

Nevím co jsou transakční logy ještě jsem se s tím nesetkal ale já jsem nic vědomě nezamykal. Můžou se nějak uzamčít sami?

 
Nahoru Odpovědět
5.10.2014 19:07
Avatar
Odpovídá na Martin
Michal Štěpánek:5.10.2014 19:33

Ve chvíli, kdy pracuji s nějakým záznamem, je tento automaticky uzamčen databází, abychom si navzájem dva uživatelé nemohli měnit údaje, takže pokud změním záznam, je v tu chvíli uzamčen a pokud se "nestihne odemknout" dřív, než ten záznam chci měnit znovu, nelze ho měnit...

Nahoru Odpovědět
5.10.2014 19:33
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin
Člen
Avatar
Odpovídá na Michal Štěpánek
Martin:5.10.2014 20:34

Moc děkuji za radu. Zkusím nějak zapracovat.

 
Nahoru Odpovědět
5.10.2014 20:34
Avatar
Martin
Člen
Avatar
Martin:7.10.2014 20:23

Takže výsledek bádání je, že padání měla na svědomí jedna funkce

public string PosledniHodnocene(bool kategorie)
{
    string results = null;
    getConnection().Open();
    using (SQLiteCommand command2 = new SQLiteCommand("Select * FROM TabulkaUtok WHERE Kategorie = @param1  ORDER BY StartCislo ASC ", getConnection()))
    {
        command2.Parameters.Add(new SQLiteParameter("@param1", kategorie));

        using (SQLiteDataReader reader2 = command2.ExecuteReader())
        {
            while (reader2.Read())
            {
                if (reader2["Hodnoceni"] + "" == "6004")
                {
                    results = (reader2["Druzstvo"].ToString() + " " + reader2["Okres"].ToString());
                    break;
                }
            }
        }
    }
    getConnection().Close();
    return results;
}

U příkazu reader jsem neměl použitý using, který asi blokoval přístup do databáze. Teď už to vypadá, že funguje dobře ještě jednou děkuji všem za pomoc.

 
Nahoru Odpovědět
7.10.2014 20:23
Avatar
Odpovídá na Martin
Michal Štěpánek:7.10.2014 22:06

Myslel jsem si to, že se do toho někde cpe něco jinýho, co blokuje přístup do DB...
Hlavně, že se ti to podařilo najít :O

Nahoru Odpovědět
7.10.2014 22:06
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.