Avatar
Martin
Člen
Avatar
Martin:

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:

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:

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:
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:

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:

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:

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:

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:

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:

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:

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

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

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  +1 7.10.2014 20:23
Avatar
Odpovídá na Martin
Michal Štěpánek:

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.