Fakturační systém v C# .NET - LocalDB a Entity Framework

C# .NET Databáze Fakturační systém v C# .NET - LocalDB a Entity Framework

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V tomto tutoriálu se naučíme vytvářet lokální databázi pro desktopovou aplikaci a její namapování na objekty pomocí Entity Frameworku. Půjde o jednoduché účetnictví. Je požadována alespoň základní znalost databází, SQL a práce s kolekcemi.

SQL CE

Do vydání Visual Studia 2013 se pro malé databáze desktopových programů používal SQL Server Compact Edition - jednoduchá verze SQL serveru tvořená pouze DLL soubory. Nepodporuje pohledy, uložené procedury, triggery a další. To nám u malé DB pro jednoduché ukládaní dat většinou stačí. Instalační soubor SQL CE má pouze kolem 2MB.

LocalDB

Od VS2013 nejde standardně vytvořit .sdf databáze pro SQL CE. Už se s CE nepočítá, i když to jde obejít pluginy. Proto si ukážeme, jak vytvořit lokální databázi LocalDB. Ta je už plnohodnotná (jako SQL server Express) a pro její spuštění na běžném PC (bez VS a SQL severu) musíme nainstalovat +- 30MB instalační soubor. Viz. tady(ENG).

Vytvoření databáze

Vytvoříme si nový konzolový projekt. Pro přidání databázového souboru máme pouze jednu možnost - soubor mdf.

Přidání databázového souboru v C# .NET

Nastavíme property databáze, aby se nám databáze přepsala pouze při změně její struktury a ne dat.

Vlastnosti databáze v C# .NET

Tvorba tabulek pro fakturační systém

Mějme tabulku faktura, která má dva cizí klíče na tabulku osoba. Ta reprezentuje dodavatele nebo odběratele.

Vytvoříme novou tabulku přes Server Explorer.

Vytvoření nové databázové tabulky

Tabulky můžeme naklikat nebo přímo napsat v SQL .

Tvorba databázových tabulek ve Visual Studio

Samotné SQL

CREATE TABLE [dbo].[Person]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY,
    [Name] NVARCHAR(100) NULL,
    [Surname] NVARCHAR(100) NOT NULL,
    [ICO] INT NULL,
    [DIC] NVARCHAR(20) NULL,
    [Street] NVARCHAR(100) NOT NULL,
    [City] NVARCHAR(100) NOT NULL,
    [PSC] INT NOT NULL,
    [Email] NVARCHAR(50) NOT NULL,
    [IsDeleted] TINYINT NOT NULL DEFAULT 0
)

CREATE TABLE [dbo].[Invoice]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY,
    [Supplier] INT NOT NULL,
    [Customer] INT NOT NULL,
    [Price] INT NOT NULL,
    [Service] NVARCHAR(200) NOT NULL,
    [Date] DATETIME NOT NULL,
    [InvoiceNumber] INT NOT NULL,
    [IsDeleted] TINYINT NOT NULL DEFAULT 0,
    CONSTRAINT [FK_Supplier] FOREIGN KEY ([Supplier]) REFERENCES [Person]([Id]),
    CONSTRAINT [FK_Customer] FOREIGN KEY ([Customer]) REFERENCES  [Person]([Id])
)

Parametr IDENTITY přidá autoinkrement primárního klíče. DEFAULT 0 nastaví defaultní hodnotu na 0. Propojení cizího klíče s primárním by vám mělo být jasné.

Entity Framework

Databázi máme hotovou. Nyní potřebujeme přistupovat k DB objektově.

Do projektu přidáme nový item ADO.NET Entity Data Model. Automaticky nám vygeneruje třídy a jejich vztahy podle DB. Je tu ještě možnost - vybrat EF DbContext Generator, ale tím se zde nebudeme zabývat (podle napsaných tříd přistupuje k DB nebo DB může i vygenerovat).

Entity Framework v C# .NET

Vybereme generování z databáze.

Entity Framework v C# .NET

Vybereme naši databázi

Entity Framework v C# .NET

Vybereme tabulky do kterých chceme přistupovat, zaškrtneme generování množných čísel u názvů objektů a klikneme na finish.

Entity Framework v C# .NET

Zobrazí se diagram naší databáze. Přejmenujeme si názvy referencí (Person1, Invoices1) ať se v tom pak vyznáme.

Entity Framework v C# .NET

Používání Entity Frameworku

Použití EF je velice jednoduché. Vytvoříme si instanci třídy DbInvoiceEntities. Ta obsahuje kolekce záznamů jednotlivých tabulek. Kolekce můžeme filtrovat, prohledávat atd. viz. zdejší tutoriály.

Přidání nového záznamu.

DbInvoiceEntities db = new DbInvoiceEntities();

Person newPerson = new Person();
newPerson.Name = "Jméno";
newPerson.Surname = "Příjmení";
newPerson.Street = "Ulice";
newPerson.City = "Město";
newPerson.PSC = 73601;
newPerson.ICO = 78321456;
newPerson.DIC = "CZ78321456";
newPerson.Email = "[email protected]";

db.Persons.Add(newPerson);
db.SaveChanges();

Pokud objektu newPerson nenastavíme nějakou not null property, při spuštění se zobrazí výjimka.

Entity Framework v C# .NET

Jednoduchý výpis v konzoli s hledáním.

Console.WriteLine("Persons: ");
foreach (Person p in db.Persons)
{
    Console.WriteLine(p.Surname + " " + p.Name + ", city: " + p.City);
}
Console.WriteLine(Environment.NewLine);

Console.WriteLine("Invoices: ");
foreach (Invoice i in db.Invoices)
{
    Console.WriteLine("Price: " + i.Price + ", date: " + i.Date);
}
Console.WriteLine(Environment.NewLine + "Search Pepa: ");

Person foundPerson = db.Persons.FirstOrDefault(p => p.Name.Contains("pepa"));
Console.WriteLine(foundPerson.Surname + " " + foundPerson.Name + ", city: " + foundPerson.City);

Závěrem

V tomto tutoriálu jsme si ukázali, jak se v C# .NET vytváří a pracuje s lokální databází. Vytvořili jsme databázi a ORM pro jednoduchý fakturační systém. V dalším tutoriálu přidáme grafické rozhraní skrze Windows Presentation Foundation.

Pokuď vám něco nefunguje nebo něčemu nerozumíte, napište do diskuze, ať to můžu v článku případně poupravit.


 

Stáhnout

Staženo 906x (10.45 MB)

 

 

Článek pro vás napsal Petr Domes (petrds)
Avatar
Jak se ti líbí článek?
12 hlasů
Programuji v .NET. Ovládám C#, .ASP, WF, WPF, SQL
Aktivity (2)

 

 

Komentáře

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:9.3.2014 12:20

Napsal jsi to dobře, nepopisuješ zbytečnosti pro začátečníky a zároveň je tu spoustu obrázků a kompletní step by step postup. Můžeš ještě připojit soubor s projektem ke stažení? Jo a jen drobnost, místo founded v kódu na konci by asi mělo být found.

Odpovědět  +2 9.3.2014 12:20
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Petr Domes (petrds):9.3.2014 14:38

Tak opraveno :) čeká se na schválení

 
Odpovědět 9.3.2014 14:38
Avatar
Odpovídá na Petr Domes (petrds)
Michael Olšavský:10.3.2014 13:37

Plánuješ udělat i Code-first postup? :)

 
Odpovědět  +2 10.3.2014 13:37
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Michael Olšavský
David Čápka:10.3.2014 13:46

Článek inspiroval Jan Vargovský a již na něčem dělá, snad jsem mu nezkazil překvapení :)

Odpovědět 10.3.2014 13:46
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Petr Domes (petrds):11.3.2014 19:25

Code-first by mě taky zajímal a ještě by mě zajímalo jak je to ve EF s efektivitou tvoření dotazů. Kdy např. v LINQ to SQL DB.Users.Where(u=>u­.Age>18) se přeloží na SQL dotaz se stejnou podmínkou WHERE. Jak je to ale v EF?

 
Odpovědět 11.3.2014 19:25
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr Domes (petrds)
David Čápka:11.3.2014 19:36

EF by měl fungovat stejně jako LINQ TO SQL.

Odpovědět 11.3.2014 19:36
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Wayne
Člen
Avatar
Wayne:30.9.2014 16:00

Mohl by mi někdo poradit, když použiji zde ten stejný script na vytvoření tabulek, proč se mi pak objevuje pouze kolekce Invoices, ale Persons už ne?

 
Odpovědět 30.9.2014 16:00
Avatar
j.c.
Člen
Avatar
j.c.:15.10.2014 9:34

je možné, že moje Visual Studio 2013 v příkladu přidání záznamu nechce "persons" ale vyžaduje "people"?
Tak asi chápe množné číslo :)

A jeden úplně začátečnický:
nešly mi relace naklikat v průzkumníku databáze.
Napsat šly, no dobrá ..ale štve mě to, mám dojem, že jsem do toho dostatečně nepronikl.

 
Odpovědět 15.10.2014 9:34
Avatar
Odpovídá na j.c.
Petr Domes (petrds):17.10.2014 18:00

je možné že to nějak VS, potažmo entity framework pojmenoval jinak, ale jde to změnit v tom diagramu databáze.
Vždy je lepší si ty SQL příkazy pro vytvoření tabulek napsat a uložit. Když si to naklikáš, a pak kvůli nějaké vazbě či radikální úpravě budeš muset smazat tabulku, budeš ji muset celou odklikat odznova. Když budeš mít SQL příkazy uloženy, stačí změny dopsat a hned použít.

 
Odpovědět 17.10.2014 18:00
Avatar
honza86
Člen
Avatar
honza86:22.10.2014 21:45

Ahoj,
mám problém s vytvořením tabulky ve VS přes server explorer, když kliknu RM na tables tak se mi se mi nabídnou jen dvě možnosti a to vlastnosti a aktualizovat, nikde nemůžu najít "add new table" používam VS2013. Předem díky za odpovědi

 
Odpovědět 22.10.2014 21:45
Avatar
Odpovídá na honza86
Michal Štěpánek:23.10.2014 12:55

A jakou používáš databázi, resp. jak jsi k ní připojený?

Odpovědět 23.10.2014 12:55
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
honza86
Člen
Avatar
Odpovídá na Michal Štěpánek
honza86:23.10.2014 13:19

Možná špatně chápu, ale postupoval jsem podle toho jak je to tu popsané => vytvořil consolou aplikaci, přidal item service-based DB. tím se mi vytvořila database.mdf a v ní jsem se na snažil RM na složku table přidat nové tabulky ale na výběr jsem dostal jen aktualizovat a vlastnosti. Nebo musim nejdřív vytvořit nějakou databázi v management studiu a pak k ní vytvořit item service based DB? Jinak mám nainstalovaná SQL server 2012 a VS2013

 
Odpovědět 23.10.2014 13:19
Avatar
honza86
Člen
Avatar
Odpovídá na honza86
honza86:23.10.2014 13:37

jako k databázi jsem se nepřipojoval jenom jsem vytvořil novou item Service based DB,kde pod připojenim vytvořil soubor .mdf

 
Odpovědět 23.10.2014 13:37
Avatar
Odpovídá na honza86
Michal Štěpánek:23.10.2014 13:41

A ve VS tu databázi v Server Exploreru vidíš?

Odpovědět 23.10.2014 13:41
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
honza86
Člen
Avatar
Odpovídá na Michal Štěpánek
honza86:23.10.2014 13:52

jj. to vidim, rozkliknu ji a když chci přidat tabulky kliknutím pravy myši na položku table tak dostanu na výběr jen aktualizovat a vlastnosti "add new table" a "new query" tam nejsou.

 
Odpovědět 23.10.2014 13:52
Avatar
honza86
Člen
Avatar
honza86:23.10.2014 14:01

no obrázku by to mělo být vidět toto je z VS2012 ale u VS2013 na kterém to potřebuju se my zobrazují jen ty v červeném ovále

 
Odpovědět 23.10.2014 14:01
Avatar
Odpovídá na honza86
Michal Štěpánek:23.10.2014 14:11

Když udělám to samé, tak v server exploreru vidím toto

Editováno 23.10.2014 14:12
Odpovědět  +1 23.10.2014 14:11
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
honza86
Člen
Avatar
Odpovídá na Michal Štěpánek
honza86:23.10.2014 14:18

tak to nechápu??? ty to tam máš, ale SQL server object explorer já jen v server explorer nebo neni možné že tam nemám něco nainstalované(nap­ř:nějakej toolbox atd), a nešlo by si vytvořit DB v management studiu a pak jí ve VS změnit na .mdf

 
Odpovědět 23.10.2014 14:18
Avatar
Michal Štěpánek:23.10.2014 14:21

Pokud ji vytvoříš v management studiu, pak už to nebude mdf, ale sdf a můžeš ji normálně připojit k projektu.Jen to nepůjde publikovat jako aplikace dál, protože by ten někdo musel mít taky nainstalovaný SQL server. Ale pro účely učení to funguje oběma způsoby... Já třeba používám klasický velký SQL server a lokální DB nepoužívám vůbec...

Odpovědět 23.10.2014 14:21
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na honza86
Michal Štěpánek:23.10.2014 14:22

zapomněl jsem na tlačítko "odpovědět". Když dáš ve VS v menu "Zobrazit", tak tam nemáš SQL server explorer?

Editováno 23.10.2014 14:22
Odpovědět 23.10.2014 14:22
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na honza86
Michal Štěpánek:23.10.2014 14:25

Mám VS 2013 express (CZ) a v menu Zobrazit mám toto

Odpovědět 23.10.2014 14:25
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
honza86
Člen
Avatar
Odpovídá na Michal Štěpánek
honza86:23.10.2014 14:26

sorry. jo to mám vidět všechno jenom se mi tam prostě nenabídne add new table, když kliknu pravym na table

 
Odpovědět 23.10.2014 14:26
Avatar
Michal Štěpánek:23.10.2014 14:26

tak ještě ten obr

Odpovědět 23.10.2014 14:26
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
honza86
Člen
Avatar
honza86:23.10.2014 14:32

tak to máme podobný mám VS profesional2013 stažené přes dreamspark, podle mě mi tam chybí asi něco doinstalovat. Neexistuje jinej způsob jak tam dostat tabulky

 
Odpovědět 23.10.2014 14:32
Avatar
Odpovídá na honza86
Michal Štěpánek:23.10.2014 15:39

No nevim, zkus se podívat na nějaký aktualizace, nebo nuget balíčky, ale nevzpomínám si, že bych tam něco doinstalovával extra...
Zkusil sis to udělat na novém čistém projektu znovu? Já jsem jen založil novou ConsoleApplication a pak hned jsem přidal tu DB a funguje...

Odpovědět 23.10.2014 15:39
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
honza86
Člen
Avatar
Odpovídá na Michal Štěpánek
honza86:23.10.2014 20:02

tak jsem nakonec tam nainstaloval sql tools i když jsem tam něco takového měl a vida jde :) díky za rady

 
Odpovědět  +1 23.10.2014 20:02
Avatar
honza86
Člen
Avatar
honza86:27.10.2014 15:33

Ahoj mám opět takový problém:) vytvořil jsem si okenní aplikaci, kde do textboxu píšu slova a ty se mi ukládaji do DB, udělanou na stejný způsob jak je v tomto článku a potom se vypisují do DataGridView to funguje dobře. Ale když chci označený záznam smazat tak si nevim rady. Snažil jsem se označený řádek převést na objekt a potom smazat z DB ale bohužel bez výsledku asi špatnej postup. Budu rád za každou rady. dík

 
Odpovědět 27.10.2014 15:33
Avatar
Odpovídá na honza86
Michal Štěpánek:27.10.2014 16:49

Hoď sem kód, jak tam ty data vkládáš a kód, jak se pokoušíš mazat. Když ten kód nevidím, nemůžu vědět co je špatně...

Odpovědět 27.10.2014 16:49
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
honza86
Člen
Avatar
honza86:27.10.2014 17:12
   public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnUloz_Click(object sender, EventArgs e)
        {
            SlovaEntities db = new SlovaEntities();
            Table newTable = new Table();
            newTable.slvova = txtSlovo.Text;
            db.Table.Add(newTable);
            db.SaveChanges();
            this.tableTableAdapter.Fill(this.slovaDataSet.Table);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: Tento řádek načte data do tabulky 'slovaDataSet.Table'. Můžete jej přesunout nebo jej odstranit podle potřeby.
            this.tableTableAdapter.Fill(this.slovaDataSet.Table);

        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //dataGridView1.DataSource = (LocalDB)\v11.0;AttachDbFilename="C:\Users\Honza\documents\visual studio 2013\Projects\OknoDB\OknoDB\Slova.mdf";Integrated Security=True;
        }

        private void btnSmazRadek_Click(object sender, EventArgs e)
        {
          //tady bych použil asi foreach kde by se našel označený řádek, a poté by se vyzal z DB, ale nevim jak
        }
    }
}
 
Odpovědět 27.10.2014 17:12
Avatar
honza86
Člen
Avatar
honza86:27.10.2014 17:21

databáze má jednu tabulku v které jsou sloupce Id a slvova (mělo to být slova,ale už se mi to nechtělo měnit).

 
Odpovědět 27.10.2014 17:21
Avatar
cz631642
Člen
Avatar
cz631642:27.1.2015 23:15

Zdravím
pokračuji krok za krokem při tvorbě databáze, ale při výběru v okně Entity Data Model Wizard nejde zaškrtnout výběr tabulky. Prostě do čtverečku se nedá dát fajfka. Neví někdo v čem může být chybka ?
Jan

 
Odpovědět 27.1.2015 23:15
Avatar
Odpovídá na Petr Domes (petrds)
Martin Turner:14.3.2016 15:04

Ahoj Petře,

díky za pěkný tutoriál.
Rád bych si jen ujasnil pár drobností. S databázemi a Entity Frameworkem teprve začínám.
Jaká je běžná konvence v pojmenování tabulek (myslím jednotné nebo množné číslo)? Dočetl jsem se, že běžnější je používat množné číslo.
Chápu dobře, že pokud vytvořím objekty z databáze tohoto tutoriálu, tak třída Person reprezentuje tabulku Person? Tedy pokud budu mít tabulku nazvanou Persons, tak se stejně bude jmenovat i vygenerovaná třída ( a také kolekce ve třídě DbInvoiceEntities)? Pokud ano, je toto důvod proč jsi pojmenoval tabulky v jednotném čísle?
Díky za případnou reakci.

 
Odpovědět 14.3.2016 15:04
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Martin Turner
Marian Benčat:15.3.2016 1:02

neptate se me, ale dovolim si odpovedet.
Implicitne EF ma ve zvyku nazvy pluralizovat, tato konvence jde vypnout a take to udelejte, usetrite si tim pak problemy.. obecne proste pojmenovavejte tabulky jednotnym nazvem.. K tomu pojemonvani trid...

Pokud preci jen chcete mit tabulku Persons, tak pak mate tridu Person a v DBContextu (DbInvoiceEntities) máte

DBSet<Person> Persons{get; set;}

Odpovědět 15.3.2016 1:02
Totalitní admini..
Avatar
Karel Fojtík:14.7.2016 17:22

Ahoj, mám možná hloupý dotaz: do databáze jsem přidal data pomocí Server Exploreru přes Show Table Data -> New row...když v Program.cs udělám výpis, tak všechno vidím...když ale přidám nový objekt přes EF (v Program.cs) - v Server Exploreru v Show Data Table ho nevidím...Nevíte, co může být špatně? Díky.

 
Odpovědět 14.7.2016 17:22
Avatar
Odpovídá na Karel Fojtík
Petr Domes (petrds):14.7.2016 18:07

Submitnul jsi ten nová objekt, refresh v server exploreru, správná DB ?

 
Odpovědět 14.7.2016 18:07
Avatar
slezak-petr
Člen
Avatar
slezak-petr:14.1.2017 18:37

Ahoj pánové, váhám ...
Chci udělat jednoduchou aplikaci, která bude v první chvíli na jednom PC, takže tento způsob lokální databáze pro zákazníka, kde by neběžel SQL server je asi zajímavý, ale článek je dva roky starý ...
Každopádně Entity Framework chci použít, abych se něco přiučil

Takže otázka, i dnes LocalDB? Jedná se o MojeDatabaze.MDF jak si letmo vzpomínám na moje pokusy?
Asi ano podle prinscreenu

MDF měla výhodu, že se nakopírovala např. na webový server (AspOne.cz) ...

Editováno 14.1.2017 18:38
Odpovědět 14.1.2017 18:37
Čím víc se učím, tím víc mi přijde, že toho ještě mnoho neumím
Avatar
Odpovídá na slezak-petr
Michal Štěpánek:15.1.2017 8:32

Záleží na tom, co by ta "jednoduchá aplikace" měla dělat, jaká by měla být struktura dat, jak často by se údaje měly měnit, kolik dat bude, atd. Možná by mohl stačit na data jen XML soubor, nebo nějaké jiné úložiště...

Odpovědět 15.1.2017 8:32
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
slezak-petr
Člen
Avatar
slezak-petr:15.1.2017 18:13

No zas tak jednoduchá není, jedná se o "Autoservis" takže tabulky Zakaznik, Auto, Servis, ServisPolozky, Zbozi, Autodily, Objednavky, ObjednavkyPolozky a ještě asi deset dalších tabulek
Nechci se na začátku zaříznout, aby až budu chtít udělat webové rozhraní, abych to na na začátku neudělal špatně.
V tuto chvíli to mám v MS Access, ale zápasím s tím, že zákazník má Access 2016 (365) který je nestabilní než řešit Office, tak to asi přepíšu. Výhoda je ta, že mám jasno v struktuře dat ...
Už ten MS Access byl krok vedle, ale to je tak, když to chce mít zákazník "pod kontrolou" aby si to mohl spravovat sám ...

Editováno 15.1.2017 18:16
Odpovědět 15.1.2017 18:13
Čím víc se učím, tím víc mi přijde, že toho ještě mnoho neumím
Avatar
Odpovídá na slezak-petr
Michal Štěpánek:16.1.2017 11:18

Když plánuješ webové rozhraní, nepřemýšlel jsi o tom, že bys to udělal rovnou jako webovou appku? Nebo aspoň použít rovnou SQL DB na nějakém webhostingu, kam bys později přidal tu webovou nadstavbu?

že zákazník má Access 2016 (365)

to přece řešit nemusíš, tobě stačí dát do programu knihovny, které s Acessem dělají a DB budeš mít jen jako soubor. K tomu není třeba, aby zákazník vůbec nějaké office měl...

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

Ano, ale asi to znáš, vždy je to o zákazníkovi, DB na webhostingu jsem nabízel,
ale "bojí se o citlivá obchodní data" proto LOCAL DB na jeho PC
Někteří lidé stále preferují WIN FORM, proto WPF, ale vím, že budoucnost je na webu,
ale na to zákazník musí uzrát

Ohledně Access nechápu (neznám) problém není v DTB ale v tom, že Access jako klient padá (nestabilní Office 2016)
Zkus popsat "Access a knihovny" - logika je v DLL C# a Access je jen vizualizace?
Pls odkazy, příklad ...

Odpovědět 16.1.2017 11:28
Čím víc se učím, tím víc mi přijde, že toho ještě mnoho neumím
Avatar
Odpovídá na slezak-petr
Michal Štěpánek:16.1.2017 11:33

Kdysi jsem taky dělal appku s databází MS Access a na cílovém PC vůbec nebyl Access nainstalovaný. Jen jsem si přidal reference na knihovny (aktuálně nabízí VS tuto - Microsoft Access 14.0 Object library) a MDB soubor jsem přiložil k appce (samozřejmě do ProgramData, protože v ProgramFiles by se musely ošetřovat práva k zápisu)

Odpovědět 16.1.2017 11:33
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
slezak-petr
Člen
Avatar
Odpovídá na Michal Štěpánek
slezak-petr:16.1.2017 12:09

OK ano, rozumím, místo dtb.MDF byla dtb.MDB a zbytek byl v C#
Tady to celé vzniklo tak, že zákazník chtěl "aplikaci rozumět, kontrolovat a spravovat"
a trochu se vyznal ve VBA (Office - Visual basic for Application)
Moje chyba, neměl jsem to dopustit.
Každopádně díky za info

Odpovědět 16.1.2017 12:09
Čím víc se učím, tím víc mi přijde, že toho ještě mnoho neumím
Avatar
Odpovídá na slezak-petr
Michal Štěpánek:18.1.2017 13:56

Tady to celé vzniklo tak, že zákazník chtěl "aplikaci rozumět, kontrolovat a spravovat"

Rozumět, kontrolovat a spravovat ano, ale podle mě by neměl mít přístup do databáze mimo aplikaci, protože tam může napáchat nedozírné a nevratné škody...

Odpovědět 18.1.2017 13:56
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Petr Domes (petrds)
Karel Fojtík:21.2.2017 19:58

Děkuji problém vyřešen - DB se aktualizovala ve složce Debug/Release - takže špatná DB.

 
Odpovědět 21.2.2017 19:58
Avatar
Karel Fojtík:21.2.2017 20:09

Chtěl bych se zeptat - mám program velmi podobný programu vytvořenému tady - Přes Publish jsem vytvořil ClickOnce instalační soubor. Na jiném PC kde je nainstalované VS a LocalDB je přístup k databázi bezproblémový. Na dalším PC, kde je jenom LocalDB nemůžu k databázi přistupovat a výjimka vyhazuje chybu "The underlying provider failed on Open"...Neřešil někdo tento problém - nevíte jakou komponentu na klientském PC doinstalovat?

 
Odpovědět 21.2.2017 20:09
Avatar
Odpovídá na Karel Fojtík
Michal Štěpánek:22.2.2017 7:22

Zkus zkontrolovat architekturu cílového počítače (32/64bit) a koukni se, jestli máš správně nastaven výstup z VS. Já používám x86, protože při nastavení "AnyCPU" mi to na některých strojích blblo...
Pak se ještě mrkni, zda v prográmku nepoužíváš nějakou knihovnu, kterou jsi nezakomponoval do výstupu a která případně na tom PC není...

Odpovědět 22.2.2017 7:22
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
slezak-petr
Člen
Avatar
slezak-petr:23.8.2017 14:50

Ahoj, co když potřebuji udělat View na spojení dvou / více tabulek?
A/ Udělám view v databázi a přegeneruji Entity Framework
nebo
B/ Se dělá View jako třída v C# a jak?

Mám například Tabulky/třídy Cars a Customers, které chci spojit podle Customer_ID

Odpovědět 23.8.2017 14:50
Čím víc se učím, tím víc mi přijde, že toho ještě mnoho neumím
Avatar
slezak-petr
Člen
Avatar
slezak-petr:29.10.2017 10:38

Ahoj potřeboval bych poradit s Exception, nějak nevidím chybu, zdroj chyby je tady, to je OK:

1/

try {
    db.Activities.Add(ac);
    db.SaveChanges();
}
catch (DbEntityValidationException e)
{
    if (true)
    {
        // 1.A True
        MyDbEntityValidationException ex = new MyDbEntityValidationException(e);
        Console.WriteLine(Environment.NewLine + "Err.:" + Environment.NewLine + ex.Message);
        }
    else
    {
        // 1.B False
        Console.WriteLine(Environment.NewLine + "Err.:" + Environment.NewLine + e.Message);
    }
}

Pak je třída DbEntityValida­tionException, která parsuje Exception, a vrací hezčí výsledek,
pokud ji použiji v kódu nahoře viz 1.A tak to funguje jak má

Pak je ale použití v přepsání SaveChanges(), kde očekávám, že to vybublá do kódu 1/ viz nahoře
ale ono se mi to kousne na throw newException; viz toto:

// https://stackoverflow.com/questions/7795300/validation-failed-for-one-or-more-entities-see-entityvalidationerrors-propert
// spolu s: MyDbEntityValidationException

public partial class DbUctoEntities : DbContext
{

    // obyčejná Exception vrací:
    // << Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. >>

    public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            // MyDbEntityValidationException parsuje Exception a vrací:
            // << Entita "Ucto.Activity" událost "Added" nastala(y) následující chyba(y) (validace):
            // Vlastnost: "Activity_abbreviation", Hodnota: "", Chyba: "Pole Activity_abbreviation je povinné." >>
            var newException = new MyDbEntityValidationException(e);
            throw newException; // <<<<<<<<<<<<<<<<<<<
        }

    }

}

Nevím proč, když mám zakomentovanou (REM) SaveChanges() tak je to OK
... nevím ...

Editováno 29.10.2017 10:40
Odpovědět 29.10.2017 10:38
Čím víc se učím, tím víc mi přijde, že toho ještě mnoho neumím
Avatar
slezak-petr
Člen
Avatar
slezak-petr:29.10.2017 10:46

Ahoj potřeboval bych poradit s Exception, nějak nevidím chybu, zdroj chyby je tady, to je OK:

1/

try {
    db.Activities.Add(ac);
    db.SaveChanges();
}
catch (DbEntityValidationException e)
{
    if (true)
    {
        // 1.A True
        MyDbEntityValidationException ex = new MyDbEntityValidationException(e);
        Console.WriteLine(Environment.NewLine + "Err.:" + Environment.NewLine + ex.Message);
    // << Entita "Ucto.Activity" událost "Added" nastala(y) následující chyba(y) (validace):
    // Vlastnost: "Activity_abbreviation", Hodnota: "", Chyba: "Pole Activity_abbreviation je povinné." >>
        }
    else
    {
        // 1.B False
        Console.WriteLine(Environment.NewLine + "Err.:" + Environment.NewLine + e.Message);
    // << Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. >>
    }
}

Pak je třída DbEntityValida­tionException, která parsuje Exception, a vrací hezčí výsledek,
pokud ji použiji v kódu nahoře viz 1.A tak to funguje jak má

Pak je ale použití v přepsání SaveChanges(), kde očekávám, že to vybublá do kódu 1/ viz nahoře
ale ono se mi to kousne na throw newException; viz toto:

// https://stackoverflow.com/questions/7795300/validation-failed-for-one-or-more-entities-see-entityvalidationerrors-propert
// spolu s: MyDbEntityValidationException

public partial class DbUctoEntities : DbContext
{

    // obyčejná Exception vrací:
    // << Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. >>

    public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            // MyDbEntityValidationException parsuje Exception a vrací:
            // << Entita "Ucto.Activity" událost "Added" nastala(y) následující chyba(y) (validace):
            // Vlastnost: "Activity_abbreviation", Hodnota: "", Chyba: "Pole Activity_abbreviation je povinné." >>
            var newException = new MyDbEntityValidationException(e);
            throw newException; // <<<<<<<<<<<<<<<<<<<
        }

    }

}

Nevím proč, když mám zakomentovanou (REM) SaveChanges() tak je to OK
... nevím ...

Odpovědět 29.10.2017 10:46
Čím víc se učím, tím víc mi přijde, že toho ještě mnoho neumím
Avatar
Odpovídá na slezak-petr
Ondřej Štorc:29.10.2017 12:09

Koukni se na tohle nastavení: Debug->Exceptions->Check Thrown/User-Unhandled

Odpovědět 29.10.2017 12:09
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
slezak-petr
Člen
Avatar
Odpovídá na Ondřej Štorc
slezak-petr:29.10.2017 12:20

Díky za radu ale mám české VS, a nemohu to najít, asi jsem slepý
Soubor | Upravit | Zobrazit | Projekt | Sestavit | Ladit | Tým | Nástroje | Test | Analyzovat | Okno | Nápověda

Odpovědět 29.10.2017 12:20
Čím víc se učím, tím víc mi přijde, že toho ještě mnoho neumím
Avatar
Michaal.K
Člen
Avatar
Michaal.K:19. července 12:38

Ahoj,
mám problém s přidáním dat do lokální databáze DbInvoice.mdf. Pokud přidám nového uživatele v programu přes tento kód:

DbInvoiceEntities db = new DbInvoiceEntities();

Person newPerson = new Person();
newPerson.Name = "Jméno";
newPerson.Surname = "Příjmení";
newPerson.Street = "Ulice";
newPerson.City = "Město";
newPerson.PSC = 73601;
newPerson.ICO = 78321456;
newPerson.DIC = "CZ78321456";
newPerson.Email = "[email protected]";

db.Persons.Add(newPerson);
db.SaveChanges();

a spustím aplikaci a vypíši takto data:

foreach (Person p in db.People)
{
        Console.WriteLine(p.Surname + " " + p.Name + ", city: " + p.City);
}

Tak se mi v programu zobrazí nově založený uživatel. Ale pokud ukončím aplikaci a v Server Explorer dám na připojené databázi zobrazit data tabulky Person, tak je prázdná.
Takže nově zadaný uživatel přes program není uložen v databázi.
Nevíte někdo jakto? Díky za pomoc.....

 
Odpovědět 19. července 12:38
Avatar
Matej Horniak:22. července 10:56

Zdravim chcel by som sa spytat, mam VS 2017 a neukazuje mi tam rovnake moznosti pri tvorbe databazi ako boli v tutorialy preto sa chcem poradit po vybrati tohto modelu pre databazu mi tento riadok kodu ukazuje ze je zly

DbInvoiceEntities db = new DbInvoiceEntities();

a tym padom neviem nic dalej robit

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FakturacnySystem
{
    class Program
    {
        static void Main(string[] args)
        {
            DbInvoiceEntities db = new DbInvoiceEntities();

            Person newPerson = new Person();
            newPerson.Name = "Jméno";
            newPerson.Surname = "Příjmení";
            newPerson.Street = "Ulice";
            newPerson.City = "Město";
            newPerson.PSC = 73601;
            newPerson.ICO = 78321456;
            newPerson.DIC = "CZ78321456";
            newPerson.Email = "[email protected]";

            db.Persons.Add(newPerson);
            db.SaveChanges();

            Console.WriteLine("Persons: ");
            foreach (Person p in db.Persons)
            {
                Console.WriteLine(p.Surname + " " + p.Name + ", city: " + p.City);
            }
            Console.WriteLine(Environment.NewLine);

            Console.WriteLine("Invoices: ");
            foreach (Invoice i in db.Invoices)
            {
                Console.WriteLine("Price: " + i.Price + ", date: " + i.Date);
            }
            Console.WriteLine(Environment.NewLine + "Search Pepa: ");

            Person foundPerson = db.Persons.FirstOrDefault(p => p.Name.Contains("pepa"));
            Console.WriteLine(foundPerson.Surname + " " + foundPerson.Name + ", city: " + foundPerson.City);

            Console.ReadLine();
        }
    }
}
 
Odpovědět 22. července 10:56
Avatar
Karel Labonek:7. srpna 15:11

Ahoj,
omlouvám se asi se ptám špatně, ale mám problém s vytvořením tabulky asi mi něco uniklo.
Dle tutoriálu jdu krok po kroku a narazím na problém s uložením nové tabulky. Konkrétně "add new Table" pak vyplním pár "Name" a "Data type" no a když chci uložit např. křížkem karty tak mi to nabízí : chcete uložit změny? dám ok no a pak se otevře okno s cestou k uložení, mě to nabízí cestu k OneDrive\dokumenty. No evidentně je něco špatně pokud cestu nechám, ale i když ji změním třeba na "D:...něco" tak se mi tabulka nezobrazuje v "Server Explorer" ani po refleši. Děkuji za pomoc :).

 
Odpovědět 7. srpna 15:11
Avatar
Odpovídá na Karel Labonek
Karel Labonek:7. srpna 16:02

Omlouvám se, ale zase jsem se dříve zeptal než jsem měl. Pravě jsem našel na netu u Microsoftu návod dokonce v češtině "":https://docs.microsoft.com/…g-a-designer no a problém se vyřešil zřejmě to bylo řečeno již někde dříve tak se omlouvám, ale mě to uniklo konkrétně mi chybělo přidat zdroj dat (to add a data sorce) po tom už tabulku vidím v "Server Explorer" a z ukládáním nových dat není problém. Nevím jestli jsem sem tento můj koment měl psát, ale třeba to pomůže zase někomu jinému kdo je stejný začátečník jako já :) .

 
Odpovědět 7. srpna 16:02
Avatar
Odpovídá na Karel Fojtík
Karel Labonek:7. srpna 18:55

Ahoj,
jak jsem si všiml tak jsi problém vyřešil, rád bych tě požádal tedy o radu. Mám stejný problém s databází a s uložením dat do ní přes EF tak výpis ok ale v Server Explorer nic. Ty jsi měl problém že to zapisovalo někam jinam jak to mám prověřit či opravit? Předem děkuji za pomoc jsem začátečník tak mi některé věci dochází pomalu :( .

 
Odpovědět 7. srpna 18:55
Avatar
Karel Labonek:8. srpna 19:21

Ahoj,
nechci bejt neodbytný, ale potřebuji se hnout z místa. Tak ještě jednou vás zkušenější žádám o radu. Zkusím to lépe formulovat. Dle tohoto tutoriálu se pokouším měnit data v databázi pomocí EF. Za běhu aplikace běží vše ok. Po uzavření app. Zjistím přes Server Explorer že nedochází k propagaci new dat do databáze. Při opětovném spuštění app. jsem znovu na začátku a tabulka je prázdná. Opačně to funguje pokud tabulku naplním přes Server Explorer, tak se data následně objeví i ve výpisu v app. Moc děkuji za vaše případné rady.

 
Odpovědět 8. srpna 19:21
Avatar
Odpovídá na Karel Fojtík
Karel Labonek:8. srpna 19:26

Ahoj,
jak jsem si všiml tak jsi problém vyřešil, rád bych tě požádal tedy o radu. Mám stejný problém s databází a s uložením dat do ní, přes app a EF a její výpis je vše ok ale v Server Explorer pak nic. Ty jsi měl problém že to zapisovalo někam jinam jak to mám prověřit či opravit? Předem děkuji za pomoc jsem začátečník tak mi některé věci dochází pomalu :( .

 
Odpovědět 8. srpna 19:26
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 58 zpráv z 58.