<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Programování Archivy - blog.vyoralek.cz</title>
	<atom:link href="https://blog.vyoralek.cz/kategorie/programovani/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.vyoralek.cz/kategorie/programovani/</link>
	<description>Tech témata, které mě baví</description>
	<lastBuildDate>Sun, 25 Nov 2018 19:51:53 +0000</lastBuildDate>
	<language>cs</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.2</generator>

<image>
	<url>https://i0.wp.com/blog.vyoralek.cz/wp-content/uploads/2019/10/cropped-512px-Circle-icons-pencil_2.svg_.png?fit=32%2C32&#038;ssl=1</url>
	<title>Programování Archivy - blog.vyoralek.cz</title>
	<link>https://blog.vyoralek.cz/kategorie/programovani/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">133748570</site>	<item>
		<title>ASP.NET Core 2.1 import CSV seed dat</title>
		<link>https://blog.vyoralek.cz/programovani/asp-net-core-2-1-import-csv-seed-dat/</link>
					<comments>https://blog.vyoralek.cz/programovani/asp-net-core-2-1-import-csv-seed-dat/#respond</comments>
		
		<dc:creator><![CDATA[jvyoralek]]></dc:creator>
		<pubDate>Mon, 17 Sep 2018 18:25:08 +0000</pubDate>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[ASP.NET Core]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[Seeddata]]></category>
		<guid isPermaLink="false">https://blog.vyoralek.cz/?p=597</guid>

					<description><![CDATA[<p>Jedním se základních kamenů většiny komplexnější webů jsou seed data &#8211; jinými slovy základní číselníky. Dnes se podíváme jak jednoduše taková data dostat přímo do databáze z CSV souborů. Jak na to? V základu máme dvě možnosti: Použijeme jednoduchý způsob čtení CSV souborů a postupného procházení řádků a &#8222;ručního&#8220; parsování atributů do objektů Použijeme poněkud [&#8230;]</p>
<p>The post <a href="https://blog.vyoralek.cz/programovani/asp-net-core-2-1-import-csv-seed-dat/">ASP.NET Core 2.1 import CSV seed dat</a> appeared first on <a href="https://blog.vyoralek.cz">blog.vyoralek.cz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Jedním se základních kamenů většiny komplexnější webů jsou seed data &#8211; jinými slovy základní číselníky. Dnes se podíváme jak jednoduše taková data dostat přímo do databáze z CSV souborů.</p>



<h2 class="wp-block-heading">Jak <g class="gr_ gr_13 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling" id="13" data-gr-id="13">na</g> to?</h2>



<p>V základu máme dvě možnosti:</p>



<ol><li>Použijeme jednoduchý způsob čtení CSV souborů a postupného procházení řádků a &#8222;ručního&#8220; parsování atributů do objektů</li><li>Použijeme poněkud chytřejší postup, kdy budeme chtít aby na základě hlavičky se jednotlivé řádky samy naparsovaly na jednotlivé atributy objektů &#8211;<span style="text-decoration: underline;"> tomuto způsobu se budeme věnovat dále.</span></li></ol>



<h2 class="wp-block-heading">Komponenta pro mapování</h2>



<p>Existuje hned několik komponent, které poskytují pro .NET možnost mapování CSV sloupců na atributy objektů. My se však podíváme na použití jedné konkrétní a to <a href="https://www.filehelpers.net/">FileHelperu</a> ve verzi 3.3</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img fetchpriority="high" decoding="async" src="https://i0.wp.com/www.filehelpers.net/images/use_case1.jpg?resize=484%2C243&#038;ssl=1" alt="general read write of filehelpers" width="484" height="243" data-recalc-dims="1" /></figure></div>



<h2 class="wp-block-heading">Úprava <g class="gr_ gr_11 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" id="11" data-gr-id="11">definice</g> třídy</h2>



<p>Samotná definice datového objektu může být krapet komplikovanější, než data která chceme z CSV nahrát. Naštěstí však máme poměrně velké množství <a href="https://www.filehelpers.net/mustread/">atributů</a>, které můžeme buďto celé třídě a nebo jednotlivým vlastnostem přiřadit.</p>



<p>Jedním s nejdůležitějším je pak atribut [FieldHidden], který nám říká, že pro import z CSV bude tento prvek ignorován.</p>



<p>Dále se mi hodilo:</p>



<ul><li>FieldOptional &#8211; určuje nepovinný prvek</li><li>FieldConverter &#8211; lze definovat specifickou konverzi hodnoty z CSV do třídy</li></ul>



<pre class="wp-block-code"><code> [DelimitedRecord(";"), IgnoreFirst]
 [Table("City")]
 public class City
 {
     [Key]        
     public int Id { get; set; }
        
     [Required]
     [StringLength(255)]        
     public string Name { get; set; }

     [FieldOptional]
     [FieldConverter(typeof(EmptyStringConverter))]
     public string CountryCode { get; set; }
     [FieldHidden]
     public Country Country { get; set; }

     [FieldHidden]
     public virtual ICollection&lt;Place> Places { get; set; }
}</code></pre>



<h2 class="wp-block-heading"><g class="gr_ gr_5 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" id="5" data-gr-id="5">Definice</g> <g class="gr_ gr_12 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" id="12" data-gr-id="12">importu</g>&nbsp;Seed <g class="gr_ gr_60 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" id="60" data-gr-id="60">dat</g> v DbContextu</h2>



<p>Jelikož ASP.NET Core od verze 2.1 přidává určitou podporu nahrávání Seed data bude definice velice jednoduchá.</p>



<p>Otevřeme si pouze definici našeho DbContextu a v metodě OnModelCreating přidáme tři řádky:</p>



<pre class="wp-block-code"><code>var engineCity = new FileHelperEngine&lt;City>();
var recordsCity = engineCity.ReadFile(@"Data\City.csv");
builder.Entity&lt;City>().HasData(recordsCity);</code></pre>



<p>Jak můžeme vidět pouze definuje s kterou datovou třídou budeme pracovat, z jakého souboru se data mají načíst a konečně kam se mají uložit.</p>



<h2 class="wp-block-heading">Import seed data</h2>



<p>K samotnému importu data pak dojde až pomocí migrace a její aplikace na databázi.</p>



<p>Do migračního skriptu se nám přidá něco v tomto stylu:</p>



<pre class="wp-block-code"><code>   migrationBuilder.InsertData(
                table: "City",
                columns: new[] { "Id", "CountryCode", "Name" },
                values: new object[,]
                {
                    { 1, "ARM", "Goris" },
                    { 46, "PHL", "Parañaque" },
                    { 45, "PHL", "Palawan" },
                    { 44, "PHL", "Malay" },
....</code></pre>
<p>The post <a href="https://blog.vyoralek.cz/programovani/asp-net-core-2-1-import-csv-seed-dat/">ASP.NET Core 2.1 import CSV seed dat</a> appeared first on <a href="https://blog.vyoralek.cz">blog.vyoralek.cz</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.vyoralek.cz/programovani/asp-net-core-2-1-import-csv-seed-dat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">597</post-id>	</item>
		<item>
		<title>ASP.NET Core 2.1 s napojením na MySQL databázi</title>
		<link>https://blog.vyoralek.cz/programovani/asp-net-core-2-1-s-napojenim-na-mysql-databazi/</link>
					<comments>https://blog.vyoralek.cz/programovani/asp-net-core-2-1-s-napojenim-na-mysql-databazi/#comments</comments>
		
		<dc:creator><![CDATA[jvyoralek]]></dc:creator>
		<pubDate>Sun, 19 Aug 2018 12:36:20 +0000</pubDate>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[ASP.NET Core]]></category>
		<category><![CDATA[databáze]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Web framework]]></category>
		<guid isPermaLink="false">https://blog.vyoralek.cz/?p=582</guid>

					<description><![CDATA[<p>ASP.NET Core framework ve verzi 2 obsahuje standardně podporu Microsoft SQL Serveru a SQL Lite. Pokud však z jakýchkoliv důvodů chcete pro data použít databázi MySQL/MariaDB pak je zatím stále potřeba podporu nainstalovat. Podíváme se jak na to. Přehled komponent V době psaní toho článku jsou k dispozici v podstatě dvě komponenty NuGet Package Autor [&#8230;]</p>
<p>The post <a href="https://blog.vyoralek.cz/programovani/asp-net-core-2-1-s-napojenim-na-mysql-databazi/">ASP.NET Core 2.1 s napojením na MySQL databázi</a> appeared first on <a href="https://blog.vyoralek.cz">blog.vyoralek.cz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>ASP.NET Core framework ve verzi 2 obsahuje standardně podporu Microsoft SQL Serveru a SQL Lite. Pokud však z jakýchkoliv důvodů chcete pro data použít databázi MySQL/MariaDB pak je zatím stále potřeba podporu nainstalovat. Podíváme se jak na to.</p>



<figure class="wp-block-image"><img decoding="async" width="770" height="385" src="https://i0.wp.com/blog.vyoralek.cz/wp-content/uploads/2018/08/NET-core-2.1-1-793x397.png?resize=770%2C385&#038;ssl=1" alt="" class="wp-image-585" data-recalc-dims="1"/></figure>



<h2 class="wp-block-heading">Přehled komponent</h2>



<p>V době psaní toho článku jsou k dispozici v podstatě dvě komponenty</p>



<table class="wp-block-table"><tbody><tr><td><strong>NuGet Package</strong></td><td><strong>Autor</strong></td></tr><tr><td><a href="https://www.nuget.org/packages/Pomelo.EntityFrameworkCore.MySql">Pomelo.EntityFrameworkCore.MySql</a></td><td><a href="https://github.com/PomeloFoundation">Pomelo Foundation Project</a></td></tr><tr><td><a href="https://www.nuget.org/packages/MySql.Data.EntityFrameworkCore">MySql.Data.EntityFrameworkCore</a></td><td><a href="http://dev.mysql.com/">MySQL project</a> (Oracle)</td></tr></tbody></table>



<p>Já jsem se po přečtení pár článků rozhodl pro komponentu Pomela, jelikož Oracle ve své komponentě neřeší vše podle standardů Microsoftu pro ostatní databáze.</p>



<h2 class="wp-block-heading">Instalace komponenty</h2>



<p>Pokud používáme Microsoft Visual Studio Code pak stačí přidat jeden řádek mezi reference .csproj:</p>



<pre class="wp-block-code"><code>&lt;Project Sdk="Microsoft.NET.Sdk.Web">
...
  &lt;ItemGroup>
    ...
    &lt;PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.1.1" />
  &lt;/ItemGroup>
&lt;/Project></code></pre>



<p>Pokud používáme Microsoft Visual Studio pak můžeme použít NuGet explorer:</p>



<figure class="wp-block-image"><img decoding="async" width="666" height="181" src="https://i0.wp.com/blog.vyoralek.cz/wp-content/uploads/2018/08/asp.net_mysql.png?resize=666%2C181&#038;ssl=1" alt="" class="wp-image-583" data-recalc-dims="1"/><figcaption>NuGet explorer a komponenta od Pomela</figcaption></figure>



<h2 class="wp-block-heading">Konfigurace</h2>



<p>Prvním krokem je úprava Startup.cs, konkrétně části ConfigureServices:</p>



<pre class="wp-block-code"><code>...
using Pomelo.EntityFrameworkCore.MySql;
...
  public void ConfigureServices(IServiceCollection services)
  {
    ...
    services.AddDbContext&lt;YourDbContext>(options =>
      options
         .useMySql(
            Configuration.GetConnectionString("MySQL")));
...</code></pre>



<p>Další krok už je potřeba jen pokud jste využili Identity frameworku. Ten má v základu nadefinované určité primární a unikátní klíče tak, že s tím má MySQL v kombinaci s UTF8 problém.</p>



<p>Doporučované kódování databáze je <code>utf8mb4</code>, přičemž pokud si nejste jistí co máte nastaveno, pak můžete použít tento příkaz:</p>



<pre class="wp-block-code"><code>show variables like 'character_set_database';</code></pre>



<p>Využijeme tedy vlastnosti DBContext třídy, kde máme ještě možnost &#8222;ladit&#8220; vlastnosti jednotlivých modelů a my si tak změníme vlastnosti Identity modelů, které už nám Microsoft předdefinoval.</p>



<p>Konkrétně využijeme metody OnModelCreating, která po úpravě může vypadat nějak takto:</p>



<pre class="wp-block-code"><code>base.OnModelCreating(builder);

// Shorten key length for Identity
builder.Entity&lt;IdentityUser>(entity => {
  entity.Property(m => m.Id).HasMaxLength(127);
  entity.Property(m => m.NormalizedUserName).HasMaxLength(127);
});

builder.Entity&lt;IdentityRole>(entity => {
  entity.Property(m => m.Id).HasMaxLength(127);
  entity.Property(m => m.NormalizedName).HasMaxLength(127);
});

builder.Entity&lt;IdentityUserLogin&lt;string>>(entity => {
  entity.Property(m => m.LoginProvider).HasMaxLength(127);
  entity.Property(m => m.ProviderKey).HasMaxLength(127);
});
 
builder.Entity&lt;IdentityUserRole&lt;string>>(entity => {
  entity.Property(m => m.UserId).HasMaxLength(127);
  entity.Property(m => m.RoleId).HasMaxLength(127);                
});

builder.Entity&lt;IdentityUserToken&lt;string>>(entity => {
  entity.Property(m => m.UserId).HasMaxLength(127);
  entity.Property(m => m.LoginProvider).HasMaxLength(127);
  entity.Property(m => m.Name).HasMaxLength(127);
});</code></pre>



<h2 class="wp-block-heading">Aplikace změn modelů</h2>



<p>Pokud jsme už vytvořili inicializační migrační model včetně identity frameworku, pak jsme se zřejmě setkali s touhle chybou:</p>



<pre class="wp-block-code"><code>CREATE UNIQUE INDEX `RoleNameIndex` ON `AspNetRoles` (`NormalizedName`);
...
Specified key was too long; max key length is 767 bytes ---> MySql.Data.MySqlClient.MySqlException </code></pre>



<p>Musíme tedy předchozí migraci smazat a vytvořit novou verzi a aplikovat na DB. Dost možná se pak setkáte i s hláškou:</p>



<pre class="wp-block-code"><code>Table 'AspNetRoles' already exists</code></pre>



<p>Bude tedy potřeba promazat i příslušnou tabulku ručně z DB.</p>



<p>Sekvence příkazů pro vytvoření migrace a aplikaci na DB je:</p>



<pre class="wp-block-code"><code>dotnet ef migrations add &lt;nameOfStep> 
dotnet ef database update</code></pre>



<p>Vše ostatní zatím vypadá, že funguje stejně jako v případě použití MSQL nebo SQL Lite.</p>
<p>The post <a href="https://blog.vyoralek.cz/programovani/asp-net-core-2-1-s-napojenim-na-mysql-databazi/">ASP.NET Core 2.1 s napojením na MySQL databázi</a> appeared first on <a href="https://blog.vyoralek.cz">blog.vyoralek.cz</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.vyoralek.cz/programovani/asp-net-core-2-1-s-napojenim-na-mysql-databazi/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">582</post-id>	</item>
		<item>
		<title>Vrácení hodnoty output parametru Oracle procedury do Javy</title>
		<link>https://blog.vyoralek.cz/programovani/vraceni-hodnoty-output-parametru-oracle-procedury-do-javy/</link>
					<comments>https://blog.vyoralek.cz/programovani/vraceni-hodnoty-output-parametru-oracle-procedury-do-javy/#respond</comments>
		
		<dc:creator><![CDATA[jvyoralek]]></dc:creator>
		<pubDate>Sat, 05 Aug 2017 15:52:45 +0000</pubDate>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[oracle]]></category>
		<guid isPermaLink="false">https://blog.vyoralek.cz/?p=34</guid>

					<description><![CDATA[<p>Potřeboval jsem vyřešit poněkud složitější SQL update o kterým by ostatním stačilo vědět co mají mít jako vstup a co by jim mohlo být vráceno. Na tenhle případ se úplně vybízela uložená procedura v Oraclu, které se ale u nás ve firmě zatím netěší velké oblibeně. Nezbývalo než být průkopníkem a pohledat řešení jak z Javy [&#8230;]</p>
<p>The post <a href="https://blog.vyoralek.cz/programovani/vraceni-hodnoty-output-parametru-oracle-procedury-do-javy/">Vrácení hodnoty output parametru Oracle procedury do Javy</a> appeared first on <a href="https://blog.vyoralek.cz">blog.vyoralek.cz</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Potřeboval jsem vyřešit poněkud složitější SQL update o kterým by ostatním stačilo vědět co mají mít jako vstup a co by jim mohlo být vráceno. Na tenhle případ se úplně vybízela uložená procedura v Oraclu, které se ale u nás ve firmě zatím netěší velké oblibeně.</p>
<p>Nezbývalo než být průkopníkem a pohledat řešení jak z Javy Oracle SP zavolat a jak si poradit s čtením výstupního parametru.</p>
<p>Řešení není až tak složité, pokud poskládáte ty správné příkazy dohromady.</p>
<h2>Základní kameny</h2>
<ol>
<li><strong>prepareCall</strong> &#8211; který nám vytvoření statement do kterého se dají registrovat výstupní parametry, což je zásadní benefit oproti klasickému prepareStatement</li>
<li>vstupní parametry si napojíme přes <strong>setString</strong>, <strong>setInt</strong> atp..  s dvěmi parametry
<ol>
<li>název vstupního (IN) parametru v Oracle SP</li>
<li>hodnota předaná v parametru</li>
</ol>
</li>
<li>výstupní parametry se registrují pomocí <strong>registerOutParameter</strong> a opět budeme potřebovat dva parametry:
<ol>
<li>název výstupního (OUT) parametru v Oracle SP</li>
<li>datový typ který očekáváme z třídy java.sql.Types</li>
</ol>
</li>
<li>celé to odpálíme pomocí <strong>execute()</strong></li>
<li>vystupní parametry si přečteme z naplněného statementu pomocí <strong>getInt</strong>, <strong>getString</strong> atp.. pouze s jedním parametrem, který je názvem výstupního parametru</li>
</ol>
<pre class="eckosc_syntax eckosc_syntax_theme_dark"><code data-language="java">package com.company;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.CallableStatement;
import java.sql.Types;
import java.sql.DriverManager;

public class Main {

    public static void main(String[] args) {

        Connection connection = null;

        try {
            connection = DriverManager.getConnection("jdbc:oracle:thin:oracleip:sid", "user", "pswd");
            CallableStatement cstmt = connection.prepareCall("{call INTEGRATION.deact_items_if_missing_in_st(?, ?)}");
            cstmt.setString("p_entity_type", "VProductSalesData");
            cstmt.registerOutParameter("po_affected_item", Types.INTEGER);
            cstmt.execute();
            int value = cstmt.getInt("po_affected_item");
            System.out.println("Value is " + value);
        } catch (SQLException e) {
            System.out.println("Error: " + e.getMessage());
        } finally {
            if (connection := null) {
                 connection.close();
            }
        }
    }
}
</code></pre>
<p>Uložená procedura v Oraclu pak může vypadat nějak takto:</p>
<pre class="eckosc_syntax eckosc_syntax_theme_dark"><code>PROCEDURE deact_matsales_if_not_in_st(p_entity_type varchar, po_affected_items OUT INT) 
IS 
BEGIN 
    Update V_VPRODUCTSALESDATA ... ; 
    po_affected_items := SQL%ROWCOUNT; 
END deact_matsales_if_not_in_st;</code></pre>
<p>The post <a href="https://blog.vyoralek.cz/programovani/vraceni-hodnoty-output-parametru-oracle-procedury-do-javy/">Vrácení hodnoty output parametru Oracle procedury do Javy</a> appeared first on <a href="https://blog.vyoralek.cz">blog.vyoralek.cz</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.vyoralek.cz/programovani/vraceni-hodnoty-output-parametru-oracle-procedury-do-javy/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">34</post-id>	</item>
	</channel>
</rss>
