SQLite insert json string

0

Mam sobie dictionary ktora konwertuje na jsona przy uzyciu Json.NET

string json = JsonConvert.SerializeObject(orders, Formatting.Indented, new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.All
            });

Wsio mi sie ladnie konwertuje, poczatek jsona wyglada tak: "{\r\n "$type": "System.Collections.Generic.Dictionary`2[[System.UInt16......
i teraz chce sobie to zapisac do tabeli w sqlite

sqLite.saveData("insert into OrdersHistory (data) values(" + json.ToString() + ")");

metoda saveData wyglada tak:

        public void saveData(string SQL)//, T val)
        {
            IDbConnection conn = getConnection();
            using (conn)
            {
                conn.Execute(SQL);
            }
        }

Wywala blad: SQL logic error
unrecognized token: "{"”

Co robie nie tak, moze nie mozna sobie tak do wartosci typu text w bazie danych zapisac calego jsona?

0

Ok znalazlem rozwiazanie:) Jeszzcze przed i po dodaniu jsona trza dodac ' zeby nie glupialo przy innych " czyli:

sqLite.saveData("insert into OrdersHistory (data) values(" + "'" + json.ToString() + "'" + ")");

Pamietajcie ze baza w sqlicie sie zapisuje zwykle w binie w debugu czy tam w releasie wiec zmiany beda w tej bazie w binie :)

0

Po pierwsze, po co JSON do bazy? Po drugie JSON zawiera cudzysłowie przy swoich elementach, które są odczytywane przez bazę podczas inserta. Przykład

insert into OrdersHistory (data) values ("{ "type":"typDanych", "innePole":"wartość"}");

Jak myślisz, poprawnie się takie coś doda do bazy?

0

Mysle ze nie bo bogupi sie z cudzyslowami:> ale jak dasz

insert into OrdersHistory (data) values ('{ "type":"typDanych", "innePole":"wartość"}');

to sie doda poprawnie;)
No wlasnie z tego co wiem to w sqlite nie moge dodawac obiektow jakiejs klasy z danymi tylko prosty txt.
A mam sobie jakies zamowienie typu Order ktore chcialbym zachowac.
Owszem moglbym zapisywac sobie liste do bazy w stylu id:4 ilosc:1 itd i po id pobierac z innej tabeli jakies tam wlasciwosci (cena, nazwa itd) ale i tak bym musial to parsowac do jsona bo sqlite nie ma tez takiego typu jak lista czy tam array (z tego co wiem:) )

0

To może najwyższa pora zacząć ogarnianie budowania bazy danych. Potrzebujesz jeszcze do tego ORMa (Entity Framework, Dapper) i życie staje się o wiele łatwiejsze. Jakie listy? Jakie array do bazy danych? Robisz tyle tabel ile ci potrzeba i łączysz je klucz główny => klucz obcy...

Co ty masz z tym JSONem?

0

teraz robie jakis prosty programik w c# w ramach testu a ze dopiero zaczynam sie przesiadac na c# to wszystkiego w tydzien nie ogarne, a z bazami danych mialem praktycznie 0 kontaktu :)
W sumie masz racje zapisywanir jsona do bazy danych to masa smieci. Ale liste i tak bym musial jakos zapisac. Powiedzmy ze mam tabele A z kategoriami produktow i id produktu.

Powiedzmy ze zrobie sobie tabele B z zamowieniami gdzie bede mial to id produktu, ktory zostal zamowiony. Tylko teraz, jezeli ktos zamowi: 3 prodykty id1 do tego 2 produkty id4 i 1 produkt id5 i to jest jako jedno zamowienie. Jedno zamowienie ktore musze pobrac i musi roznic sie od innych zamowien wiec najlepiej zapisac to jako 1 rekord w tabeli. Jesli nie bylby to jeden rekord to moglbym dodac sobie pole id_zamowienia i kazdy element z zamowienia bylby w bazie jako osobny rekord ale nie wydaje mi sie to wlasciwe bo powiedzmy ze takich zamowien bedzie kilkaset tysiecy dziennie i pozniej filtruj te wszystkie zamowienia i wyszukuj wszystkie rekordy z danym id_zamowienia zeby powiazac to z konkretnym zamowieniem. Jak bys to rozwiazal?

Najproscie byloby moc zapisac chociaz array ktory by wtedy wystarczyl poniewaz 1 rekord do zamowienia i tabela mialaby id, i obiekt array ktory by sobie skladal sie z konkretnych id_produktu i ilosci produktu w danym zamowieniu czyli cos w stylu

 [[id1, 3], [id4, 2], [id5, 1]]

Po to by sie przydalo zapisywac chociaz array`e wedlug mnie.

1

Banał

Tabela Zamowienie
id, data, numer

Tabela ProduktyZamowienia
id, produktid, cena, ilosc, zamowienieid

Dodajesz zamówienie z trzema pozycjami tzn, że dodajesz raz zamówienie, dostajesz jego ID, dodajesz 3 produkty z tym samym id zamówienia. Zamówienie w bazie będzie jedno, jego ID będzie unikalne, a pozycję tego zamówienia możesz wyciągnąć joinem

select * from Zamowienie z join ProduktyZamowienia pz on z.id = pz.zamowienieid where z.id = 2 

Jaki to stwarza problem przy tysiącu zamówień?

0

a te 3 produkty dodajesz do innej nowej tabeli... hmm no w sumie nic nie bedezie trzeba filtrowac i byloby w sumie szybkie.
A nie byloby szybciej gdyby byla tylko jedna tabela z typem array? :>

W sumie racja, zrobie jak sugerujesz tylko

select * from Zamowienie z join ProduktyZamowienia pz on z.id = pz.zamowienieid where z.id = 2 

tylko te z i pz bedzie widzial jako zmienne, nie musze nigdzie tego definiowac?
No i jak dodaje zamowienie to musze do tabeli zamowienia dodac zamowienie a nastepnie musze odczytac id zamowienia zeby powiazac je w produktach?

Dzieki za podpowiedz, z sqlitem cz\y tam sql jestem na bakier, zawsze lubilem jsona :)

0

A nie byloby szybciej gdyby byla tylko jedna tabela z typem array? :>

A jak będziesz chciał sprawdzić tylko jedną pozycję na zamówieniu to jak chcesz to zrobić mając array w postaci JSON.

Dzieki za podpowiedz, z sqlitem cz\y tam sql jestem na bakier, zawsze lubilem jsona

To w takim razie po co ci SQLite? Trzymaj dane w plikach JSON.

teraz robie jakis prosty programik w c# w ramach testu a ze dopiero zaczynam sie przesiadac na c# to wszystkiego w tydzien nie ogarne, a z bazami danych mialem praktycznie 0 kontaktu

Jeśli od początku będziesz robić tak jak trzeba to szybciej ci takie rzeczy wejdą w nawyk. Nie ma znaczenia czy robisz prosty programik, czy wielki kombajn. Dobrze jest ustalić sobie kilka zasad, trzymać porządek w projektach, starać się robić to na tyle prosto, aby poprawki nie wymagały przepisywania całej aplikacji.

Poczytaj sobie o Entity Framework albo Dapper. Doszlifuj klasy i operacje na obiektach. Jak dojdziesz z tym do perfekcji to sam sobie zadasz pytanie - "Po co mi był ten JSON?" ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1