C#,Sqlite, Monodevelop, Raspberry Pi - no such table, filename unknown rubrika: Programování: .Net

1 skybedy
položil/-a 8.3.2016
 
upravil/-a 8.3.2016

Na zmíněných platformách se pokouším něco vykutit a zaseknul jsem na spojení s databází Sqllite.
Nejdříve přes konzoli vytvořím jednoduchou testovací databázi, něco tam vrazím a hned to zkusím vytáhnout

sqlite3 test.db
CREATE TABLE users (id INT primary key,name varchar(40));
INSERT INTO users (name) VALUES ('skybedy');
SELECT * FROM users;

Výsledek je očekávatelný a správný, vypíše mi to řádek se záznamem.
Pak udělám jednoduchou aplikaci v Monodevolop.

using System;
using System.Data;
using Mono.Data.Sqlite;
 
namespace SQLiteTestConsole{
 
 
  class MainClass   {
 
    public static void Main (string[] args)     {
            TestSqlite ts = new TestSqlite(); 
            ts.SelectData(); 
            Console.ReadKey();
        }
 
  }
 
 
 
 
  public class TestSqlite{
        SqliteCommand cmd;
        SqliteConnection con;
        SqliteDataReader reader;
 
        public TestSqlite (){
            con = new SqliteConnection("Data Source=test.db,Version=3");
        }
 
 
    public void SelectData (){
            con.Open();
            cmd = new SqliteCommand("SELECT *  FROM users",con);
            reader = cmd.ExecuteReader ();
            while (reader.Read()) {
                Console.WriteLine(reader[1].toString());
            } 
        }
    }
    }
}

Tohle už nefunguje a vyhazuje to zarputile vyjímku:

Mono.Data.Sqlite.SqliteException: SQLite error
no such table: users
  at Mono.Data.Sqlite.SQLite3.Prepare (Mono.Data.Sqlite.SqliteConnection cnn, System.String strSql, Mono.Data.Sqlite.SqliteStatement previous, UInt32 timeoutMS, System.String& strRemain) [0x00000] in <filename unknown>:0 
  at Mono.Data.Sqlite.SqliteCommand.BuildNextCommand () [0x00000] in <filename unknown>:0 

Databáze je uložena v /home/pi, aplikace je uložena tamtéž.
Už jsem samozřejmě googlil ostošest, ale zatím bez úspěchu.
Nějaký nápad? Díky.

odkaz Vyřešeno
8 Jakub Macek
odpověděl/-a 8.3.2016

Obvyklý problém bývá v cestě k databázovému souboru. Může být, že cesta k Monodevelop projektu != cesta k binárce != pracovní cesta při spuštění. Přičemž databáze se hledá v té poslední.
Doporučuji si vypsat před otevřením connection hodnotu System.Environment.CurrentDirectory.

Komentáře

  • skybedy : Děkuju za tip, máš pravdu, něco bude s cestou. System.Environment.CurrentDirectory vypíše /home/pi/SQLiteTest/SQLiteTest/bin/Debug. Když do stejné cesty natvrdo nakopíruju databázi předtím umístěnou v /home/pi, tak to funguje. Je ale tohle konečné řešení, nebo by se to mělo nastavit ještě nějak jinak? Rád si nechám poradit, po necelých 4 měsících s C# a měsíci s Monodevelop se v tomhle revíru stále považuju za bažanta. 8.3.2016
  • skybedy : Asi už to mám, musím to změnit na new SqliteConnection("Data Source=/home/pi/test.db,Version=3"). Každopádně děkuju moc za nakopnutí. 8.3.2016
  • Jakub Macek : Osobně bych doporučoval něco flexibilnějšího. V souboru App.config lze uvést sekci connectionStrings, která je pro toto vyloženě určena. https://msdn.microsoft.com/en-us/library/ms254494%28v=vs.110%29.aspx 9.3.2016
  • skybedy : Paráda, díky. 10.3.2016
  • vkvkvk : Když mám DB jako součást projektu, tak v properties toho souboru nastavím "Copy to Output" na "Copy always" a je vystaráno. Vždy mám aktuální verzi DB na pokusničení. Jenom občas NUnit neuvolní db a po dalším překladu testy spadnou - nutno ukončit nunit, přeložit a pustit nunit. 11.3.2016
  • skybedy : Díky, nakonec to stejně vypadá, že Sqlite na moje potřeby nestačí a řeším to přes MariaDB. 12.3.2016
  • Jakub Macek : V čem SQLite nedostačuje? Nějak si nemůžu uvědomit, co by mohlo MariaDB nabídnout v rámci Raspberry Pi lepšího, aby to vynahradilo ty starosti navíc. 13.3.2016
  • skybedy : Dělám na aplikaci, které krom jiného ukládá data do DB z externího zařízení v řádu desítek až stovek záznamů za vteřinu kontinuálně po dobu více hodin. Pokud jsem zkoušel použít SQLite, s kterou mám zkušenost dva dny, nestíhalo se to ukládat, pokud jsem použil MariaDB, s kterou (MySQL/MariaDB) mám zkušenost více než 10 let, tak problémy nejsou. Jsem dost v časové tísní a nemám už moc prostor testovat, jestli to je špatným použitím SQLite, nebo její slabší výkoností, nebo něčím jiným, takže jsem v téhle chvíli vsadil na to co znám a umím používat. 15.3.2016
  • harrison314 : Podla mojich skusenosti s SQLite, ti to stihat bude, ale musis ich do nej tlacit dvakovo v tranzakcii, napriklad 100 naraz v jednej transkacii. 15.3.2016
  • skybedy : Aha, díky. Jen mi ještě, pls, přelož slovo "dvakovo", jsem sice starší ročník a slovensky docela umím, ale tohle slovo neznám. 16.3.2016
  • harrison314 : dávkovo - angl. batch, viacej naraz 16.3.2016

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.