Provedení selectu při vložení řádku do SQL – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Provedení selectu při vložení řádku do SQL – .NET – Fórum – Programujte.comProvedení selectu při vložení řádku do SQL – .NET – Fórum – Programujte.com

 

MichaelXX
~ Anonymní uživatel
12 příspěvků
1. 7. 2017   #1
-
0
-

Ahojte,

chtěl jsem se zeptat - programuji viizualizaci dat, která jsou uložena v SQL. 

Představte si, že mám HW tlačítko napojené na váhu a pokaždé když se zmáčkne, tak se odešlou data do SQL databáze.

Pro čtení a zobrazení dat píšu ve Win Forms software. Potřebuji, aby se data aktualizovala hned po přidání nového řádku do SQL.

Jak zajistit to, aby SW který píšu nemusel mít smyčku, kdy každou jednu sekundu bude posílat select dotaz a data zpracovávat, ale aby provedl select vždy, jakmile se vloží nový řádek do konkrétní tabulky.

Určitě to půjde nějak ošetřit, chci se zeptat jakým způsobem ? Dokumentaci a jak to provést si už dohledám. 

Díky

Nahlásit jako SPAM
IP: 81.200.56.–
VladislavK0
Super člen
3. 7. 2017   #2
-
0
-

Tech způsobu je vícero zaleží na tom co mas jako konektor mezi WinForms a vlastni DTB.

Jedna ze zarucených možností je DTB triger ktery je chycen tvým kodem a do toho datagrid view napise ty hdnty ktere byly do DTB zalozeny.

Tak hledej databazovy triger a asi využiješ i store procedure 

Nahlásit jako SPAM
IP: 93.99.6.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
MichaelXX
~ Anonymní uživatel
12 příspěvků
3. 7. 2017   #3
-
0
-

Ahoj,

děkuji za info.

Každopádně nepoužívám datagridview, protože se mi nepodařilo naformátovat podle svých představ (vzhled).

Řeším to tedy přes klasické labely - viz kód.

Tedy, potřebuji zajistit to, aby se tato funkce spustila v případě, že se vloží řádek do tabulky.

Na netu jsem našel pouze SQLDependency, ale nepodařilo se mi to rozjet :(

Jsou tedy nějaké jiné způsoby ?

Děkuji

Nahlásit jako SPAM
IP: 78.157.163.–
3. 7. 2017   #4
-
0
-

Nejjednodušší se mi jeví aby tvoje aplikace na stisk tlačítka provedla zápis do DB a hned po jeho dokončení si data z DB načetla. Obvykle po zápisu obdržíš počet dotčených řádků nebo chybu.

Pokud tlačítko obsluhuje jiná aplikace, možná by šlo přesměrovat vstup a tlačítko "předzpracovat" tvou aplikací, tak získat informaci o jeho stisku a pak ho přeposlat aplikaci pro zápis do DB.

Triger se mi jeví obtížný. Např. u MySQL je velice problematické aby DB sama zahajovala komunikaci s aplikací. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MichaelXX
~ Anonymní uživatel
12 příspěvků
3. 7. 2017   #5
-
0
-

#3 MichaelXX
Kód:

public void Obnov_data() {
            string constring = @"Data Source=xxxxxxxx";
            string query = "select TOP 10 * FROM xxxxxxx ORDER BY create_datetime desc, scaling_id desc ";

            SqlConnection con = new SqlConnection(constring);
            SqlDataAdapter ada = new SqlDataAdapter(query, con);
            DataTable dt = new DataTable();
            ada.Fill(dt);

            //float celkem = 0;


            DataRow dr = dt.Rows[0];
            created_9.Text = dr["create_datetime"].ToString();
            netto_9.Text = dr["_weight"].ToString() + " kg";
            brutto_9.Text = dr["brutto"].ToString() + " kg";
            tara_9.Text = dr["tara"].ToString() + " kg";
            carriage_9.Text = dr["carriage"].ToString();
            scaleid_9.Text = dr["scaling_id"].ToString();
            //   celkem+= float.Parse(dr["_weight"].ToString());


            dr = dt.Rows[1];
            created_8.Text = dr["create_datetime"].ToString();
            netto_8.Text = dr["_weight"].ToString() + " kg";
            brutto_8.Text = dr["brutto"].ToString() + " kg";
            tara_8.Text = dr["tara"].ToString() + " kg";
            carriage_8.Text = dr["carriage"].ToString();
            scaleid_8.Text = dr["scaling_id"].ToString();
            //       celkem += Int32.Parse(dr["_weight"].ToString());

            dr = dt.Rows[2];
            created_7.Text = dr["create_datetime"].ToString();
            netto_7.Text = dr["_weight"].ToString() + " kg";
            brutto_7.Text = dr["brutto"].ToString() + " kg";
            tara_7.Text = dr["tara"].ToString() + " kg";
            carriage_7.Text = dr["carriage"].ToString();
            scaleid_7.Text = dr["scaling_id"].ToString();
            //       celkem += Int32.Parse(dr["_weight"].ToString());

            dr = dt.Rows[3];
            created_6.Text = dr["create_datetime"].ToString();
            netto_6.Text = dr["_weight"].ToString() + " kg";
            brutto_6.Text = dr["brutto"].ToString() + " kg";
            tara_6.Text = dr["tara"].ToString() + " kg";
            carriage_6.Text = dr["carriage"].ToString();
            scaleid_6.Text = dr["scaling_id"].ToString();
            //      celkem += Int32.Parse(dr["_weight"].ToString());

            dr = dt.Rows[4];
            created_5.Text = dr["create_datetime"].ToString();
            netto_5.Text = dr["_weight"].ToString() + " kg";
            brutto_5.Text = dr["brutto"].ToString() + " kg";
            tara_5.Text = dr["tara"].ToString() + " kg";
            carriage_5.Text = dr["carriage"].ToString();
            scaleid_5.Text = dr["scaling_id"].ToString();
            //     celkem += Int32.Parse(dr["_weight"].ToString());

            dr = dt.Rows[5];
            created_4.Text = dr["create_datetime"].ToString();
            netto_4.Text = dr["_weight"].ToString() + " kg";
            brutto_4.Text = dr["brutto"].ToString() + " kg";
            tara_4.Text = dr["tara"].ToString() + " kg";
            carriage_4.Text = dr["carriage"].ToString();
            scaleid_4.Text = dr["scaling_id"].ToString();
            //       celkem += Int32.Parse(dr["_weight"].ToString());

            dr = dt.Rows[6];
            created_3.Text = dr["create_datetime"].ToString();
            netto_3.Text = dr["_weight"].ToString() + " kg";
            brutto_3.Text = dr["brutto"].ToString() + " kg";
            tara_3.Text = dr["tara"].ToString() + " kg";
            carriage_3.Text = dr["carriage"].ToString();
            scaleid_3.Text = dr["scaling_id"].ToString();
            //      celkem += Int32.Parse(dr["_weight"].ToString());

            dr = dt.Rows[7];
            created_2.Text = dr["create_datetime"].ToString();
            netto_2.Text = dr["_weight"].ToString() + " kg";
            brutto_2.Text = dr["brutto"].ToString() + " kg";
            tara_2.Text = dr["tara"].ToString() + " kg";
            carriage_2.Text = dr["carriage"].ToString();
            scaleid_2.Text = dr["scaling_id"].ToString();
            //       celkem += Int32.Parse(dr["_weight"].ToString());

            dr = dt.Rows[8];
            created_1.Text = dr["create_datetime"].ToString();
            netto_1.Text = dr["_weight"].ToString() + " kg";
            brutto_1.Text = dr["brutto"].ToString() + " kg";
            tara_1.Text = dr["tara"].ToString() + " kg";
            carriage_1.Text = dr["carriage"].ToString();
            scaleid_1.Text = dr["scaling_id"].ToString();
            //     celkem += Int32.Parse(dr["_weight"].ToString());

            dr = dt.Rows[9];
            created_0.Text = dr["create_datetime"].ToString();
            netto_0.Text = dr["_weight"].ToString() + " kg";
            brutto_0.Text = dr["brutto"].ToString() + " kg";
            tara_0.Text = dr["tara"].ToString() + " kg";
            carriage_0.Text = dr["carriage"].ToString();
            scaleid_0.Text = dr["scaling_id"].ToString();
            //     celkem += Int32.Parse(dr["_weight"].ToString());

            //  sum_netto.Text = celkem.ToString() + " kg";
        }

Nahlásit jako SPAM
IP: 78.157.163.–
3. 7. 2017   #6
-
0
-

Pokud zápis i čtení provádí jedna aplikace, mohlo by i stačit provést tento scénář: 

INSERT tabulka (sloupec1, sloupec2) VALUES (hodnota1, hodnota2); SELECT sloupec1, sloupec2 FROM tabulka;

SELECT by bylo vhodné rozšířit o vhodnou podmínku

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MichaelXX
~ Anonymní uživatel
12 příspěvků
3. 7. 2017   #7
-
0
-

Zápis do SQL provádí právěže jiná aplikace, což je právě ten problém :(

Dávat selectování na každou sekundu je asi prasárna a zahltím tím celou databázi.

Používám jinak MS SQL

Nahlásit jako SPAM
IP: 78.157.163.–
3. 7. 2017   #8
-
0
-

Jaká je aplikace provádějící zápis? (konzolovka, služba ...) Zobrazuje změnu stavu, odezvu na tlačítko? Jak je připojen HW - (virtuální) COM? 

Použití triggeru bylo diskutováno např v https://stackoverflow.com/questions/5302074/sql-server-trigger-to-net-call nebo v https://stackoverflow.com/questions/18318178/on-table-update-trigger-an-action-in-my-net-code 

Zkus hledat "ms sql trigger send to net application" nebo "ms sql trigger call net application".

Trigger je specifický typ uložené procedury, podrobnosti najdeš v dokumentaci k DB.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MichaelXX
~ Anonymní uživatel
12 příspěvků
3. 7. 2017   #9
-
0
-

Je to klasické HW tlačítko na zařízení,které, když se zmáčkne odešle data na IP adresu s portem 27 (nebo 23 teď si nejsem jistý) do aplikace, která poslouchá na oné IP adrese. 

Ještě me napadlo ,,odposlouchávat" tu komunikaci na té IP adrese, kam jdou data ze zařízení (váhy). Dá se to nějak ?

Každopádně ti děkuji za info :)

Nahlásit jako SPAM
IP: 78.157.163.–
VladislavK0
Super člen
3. 7. 2017   #10
-
0
-

Muj názor! zcela korektne ti toto prave reši ten triger coz je vlastne udalost na zmenu v DTB a tento trigr smeruje tam kam si ho posles. Tedy do tve applikace.

Nahlásit jako SPAM
IP: 93.99.6.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
MichaelXX
~ Anonymní uživatel
12 příspěvků
3. 7. 2017   #11
-
0
-

No on je problém v tom, že jsem ukládání do SQL nastaivil dodatečně (v configu softwaru, který získává data), on si to primárně ukládá do texťáku. V configu nastavuji IP váhy, tzn. váha vysílá na své IP data a onen SW od výrbce váhy (ne můj) ty data čte. Netuším jak je to ale řešeno, takto máme dodaný SW a HW od jednoho výrobce.

Pro upřesnění příkládám ilustrační obrázek jak to je. Napadlo mě, jestli se dá nějakým způsobem napojit přímo na tu váhu, kde bude naslouchat můj SW stejně jako SW výrobce oné váhy.

Připojen obrázek.

Nahlásit jako SPAM
IP: 78.157.163.–
MichaelXX
~ Anonymní uživatel
12 příspěvků
3. 7. 2017   #12
-
0
-

#11 MichaelXX
Ještě doplním, váha používá SOCKET

Nahlásit jako SPAM
IP: 78.157.163.–
MichaelXX
~ Anonymní uživatel
12 příspěvků
3. 7. 2017   #13
-
0
-

#12 MichaelXX
Jak tak přemýšlím, pomocí tcp listener můžu vlastně naslouchat té váze ? A tím vlastně úplně nahradit ten SW, který ukládá data do txt souboru a následně sql  ?

Nahlásit jako SPAM
IP: 78.157.163.–
3. 7. 2017   #14
-
0
-

#9 MichaelXX
Jde to poslat i na jinou IP a/nebo port pokud máš přístup k nastavení aplikace. Takže odposlech je možný a přeposlat to také jde. Znamená to napsat server který pracuje s HW a klienta který to pošle "firemní" aplikaci, docela dost práce. Dále by mohlo jít odposlechnout přímo tu IP a port ("hackerské" řešení), to znamená "nabořit se" do otevřeného soketu.

Co jsem vygůůůglil na stackoverflow naznačuje možnost použít RPC (= Remote Procedure Call) v triggeru u MS SQL. Tou vzdálenou procedurou může být funkce ve tvé aplikaci. Ze zkušenosti s ASP .NET a signalR usuzuji, že použití RPC v triggeru nebude nic složitého. Myslím, že při troše gůůglení máš šanci narazit na podobný a vyřešený problém. Pro vytvoření triggeru potřebuješ mít v DB příslušné oprávnění. Navzdory zkušenostem u MySQL kde je tento způsob použití triggeru velice problematický bych pro MS SQL právě trigger a RPC zvolil jako "první pokus" a teprve v případě neúspěchu to zkusil získat z komunikace vah s jejich aplikací.

Trigger bude fungovat jen u DB. Při ukládání dat z vah do souboru by se na to muselo jít jinak - např. kontrola data a času poslední změny souboru. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MichaelXX
~ Anonymní uživatel
12 příspěvků
3. 7. 2017   #15
-
0
-

Přesně tak, podle mě bude nejlepší se jak říkáš nabořit do otevřeného portu :) Teď akorát otázka, server je ta váha a sw který data čte klient nebo opačně ? 

Nahlásit jako SPAM
IP: 78.157.163.–
3. 7. 2017   #16
-
0
-

#13 MichaelXX
v podstatě můžeš vytvořit svou serverovou aplikaci, která pracuje s váhou a firemní odinstalovat.

Ještě jsem se nezeptal, zda máš k dispozici komunikační protokol?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MichaelXX
~ Anonymní uživatel
12 příspěvků
3. 7. 2017   #17
-
0
-

Ten právě nemám .. Dal by se ale dát zjistit pomocí Wiresharku ? Případně jiným způsobem ?

Nahlásit jako SPAM
IP: 78.157.163.–
3. 7. 2017   #18
-
0
-

Nabourání soketu, analýza komunikačního protokolu... pracné, komplikované
Nahrazení firemní aplikací svou vlastní aplikací je zrovna tak problematické.
Pokud se k DB přihlásíš jako její administrátor, trigger "after insert" vytvoříš za pár minut. Pokud nastuduješ RPC v triggeru, odhaduji, že za 2 hod bys mohl dokázat po každém zápisu do tabulky zavolat jednoduchou funkci ve své jednoduché demo aplikaci. To už pak je "know how".

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MichaelXX
~ Anonymní uživatel
12 příspěvků
3. 7. 2017   #19
-
0
-

Asi máš pravdu, zkusím nastudovat ty triggery a RPC :)

Děkuji ti mnohokrát (i ostatním) za cenné info a pohled dalších osob :)

Ještě jednou díky

Nahlásit jako SPAM
IP: 78.157.163.–
3. 7. 2017   #20
-
0
-

#10 VladislavK
že je to MS SQL, tvůj přístup se jeví nejlepší.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
12. 7. 2017   #21
-
0
-

#20 hlucheucho
#19 MichaelXX

Ahoj, píšu sem protože mě toto téma docela zajímá, komunikace z SQL do Apky.

Hledal jsem řešení přes RPC v trigeru a nějak nemůžu nic najít, ale narazil jsem na jiné možnosti:

- MSMQ - Microsoft Message Queuing

- nebo odeslání zprávy na URL

Někde ta aplikace naslouchat musí.

Nahlásit jako SPAM
IP: 91.139.9.–
12. 7. 2017   #22
-
0
-
Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
12. 7. 2017   #23
-
0
-

#22 hlucheucho
heh HU tohle je to vlákno :D

Nahlásit jako SPAM
IP: 91.139.9.–
MichaelXX
~ Anonymní uživatel
12 příspěvků
25. 7. 2017   #24
-
0
-

Nakonec jsem původní SW zrušil a naslouchám na podařilo se mi komunikovat přes telnet s váhou, takže jsem ten SW nahradil :)

Nahlásit jako SPAM
IP: 78.157.163.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý