SQL Dotaz II   zodpovězená otázka

VB.NET, ADO.NET, Databáze

Tak nevím, jestli tenhle problém už nezapadne, ale přesto se ho ještě pokusím rozvířit. Jelikož jsem vlastními silami nikam nepostoupil, rozhodl jsem se přistoupit k problému trochu jinak. Napsal jsem si cvičně kód bez použití DataBinding komponent na připojení k SQL Databázi 2005 Express a pokouším se nejprve zobrazit jednoduchý výběr do DataGritView, ale nedaří se mi. Formulář se zobrazí, bez chybové hlášky, ale okno DataGritView je prázdné. Tady je kód:

Public Class Form1
    Dim com As SqlCommand
    Dim con As SqlConnection

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        con = New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Private\Databaze\Pokus.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True")
        con.Open()
        com = New SqlCommand("SELECT * FROM [tbl_Firmy]", con)
        Me.DataGridView1.DataSource = com.ExecuteReader
    End Sub
End Class

Prosím o radu, proč se nic nezobrazuje ? A jestli se dá vysvětlit ten předchozí můj dotaz(viz fórum SQL Dotaz), proč se neprovádí korektně ten SQL dotaz s "Compute by" ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
Me.DataGridView1.DataBind()

?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Me.DataGridView1.DataBind() - to neumím použít. Jsem asi natvrdlý. :-(.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Možná je to blbina, nemám teď u sebe Visual Studio abych to zkusil.

Každopádně to prostě zavolejte po přiřazení do Me.DataGridView1.DataSource. Tím zajistíte, že se data z datasourcu natáhnou do ovládacího prvku. Napište jak to dopadne.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jde o to, že Me.DataGridView1.DataBind() můj projekt nezná. Ta metoda je neznámá. Buď mi ještě něco chybí v referencích ...?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to se omlouvám. Asi tam ta metoda není. Až dorazím domů, tak se na to mrknu a napíšu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky Tomáši. Vzhledem k Vašemu mládí a mému zralému věku(42) si neodpustím jednu poznámku mimo téma a spíše osobní. Víte, že se říká, jak na Nový rok tak po celý rok. Tak to Vás lituju, protože jestli budete celý rok odpovídat na otázky tohoto druhu(chtěl jsem to napsat trochu expresivněji), tak to Vás lituju. Sobě a mě podobným ovšem přeju, ať se toto rčení co nejvíce naplňuje ;-). Jinak mi v této otázce jde o to, co nejjednodušším způsobem otevřít SQL Databázi a položit SQL dotaz, jenž se mi zobrazí v DataGridView. Pořád se snažím o získání korektního výsledku dotazu, ve kterém je "COMPUTE BY" - jak jsem psal na začátku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pravděpodobně mi silvestrovská kocovina otupila úsudek, ale úplně jsem vypustil fakt, že sloupce v DataGridView musíte definovat. A pokud to nechcete dělat ručně, stačí zapnout vlastnost DataGridView1.AutoGenerateColumns na True. Pak by mělo být všechno v pořádku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak ani po vložení AutoGenerateColumns to není ještě to pravé. Opět prázdné okno. Tady je ten kód:

Public Class Form1
    Dim com As SqlCommand
    Dim con As SqlConnection

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        con = New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Private\Databaze\Pokus.mdf;Integrated Security=True;Connect Timeout=30")
        con.Open()
        com = New SqlCommand("SELECT * FROM [tbl_Firmy]", con)
        Me.DataGridView1.AutoGenerateColumns = True
        Me.DataGridView1.DataSource = com.ExecuteReader
    End Sub
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě si musíte vytvořit prvek BindingSource, pak to už opravdu půjde :)

Public Class Form1
    Dim com As SqlCommand
    Dim con As SqlConnection

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        con = New SqlConnection("Data Source=.\SQLEXPRESS;Integrated Security=True;Connect Timeout=30;Database=onlineinfo")
        con.Open()
        com = New SqlCommand("SELECT * FROM [Users]", con)
        DataGridView1.AutoGenerateColumns = True
        DataGridView1.DataSource = BindingSource1
        BindingSource1.DataSource = com.ExecuteReader()
    End Sub

End Class
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za vyčerpávající "vlákno". Jdu vyzkoušet ten dotaz s "COMPUTE BY", jestli to bude fungovat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vyzkoušel jsem dotaz s "COMPUTE BY" a opět musím konstatovat, že nefunguje. Jak jsem psal již dříve, na tu samou databázi, pokud dotaz provedu v SQL Management Studiu, se mi vrátí korektní výsledek s vysčítanými sumami za skupiny. Pokud to udělám z kódu, je tam pouze první skupina bez sumy a konec. Ještě uvedu pro úplnost znovu ten dotaz:

SELECT distinct tbl_Firmy.Nazev, tbl_Faktury.CisloFaktury

, tbl_Faktury.Cena, tbl_Faktury.Cena, tbl_Faktury.Datum

FROM tbl_Faktury INNER JOIN

tbl_Firmy ON tbl_Faktury.IdFirmy = tbl_Firmy.IdFirmy

order by tbl_Firmy.Nazev

compute sum (tbl_Faktury.Cena) by tbl_Firmy.Nazev

Napadá mě jenom to, že budu muset tyhle vcelku jednoduché sčítací operace dělat pomocí nějakých cyklů a procházení tabulek, ale přijde mi to podivný, když tyhle funkce v SQL jsou již hotové. Co si mám počít ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jestli používáte SQL Server 2005, tak se již nedoporučuje klauzuli COMPUTE BY používat. Je výkonově problémová - právě kvůli té řadě výsledků.

Zkusím odčinit svoje předchozí chyby v tomto vlákně a nabídnout Vám novější a lepší alternativu.

SELECT S.CisloFaktury, S.Cena, tbl_Faktury.Datum, tbl_Firmy.Nazev

(SELECT CisloFaktury, SUM(Cena) AS Cena, IdFirmy, GROUPING(IdFirmy) AS IdFirmyS, GROUPING(CisloFaktury) AS CisloFakturyS FROM tbl_Faktury

GROUP BY IdFirmy, CisloFaktury WITH ROLLUP) AS S

LEFT JOIN tbl_Faktury ON S.CisloFaktury = tbl_Faktury.CisloFaktury

LEFT JOIN tbl_Firmy ON S.IdFirmy = tbl_Firmy.IdFirmy

ORDER BY IdFirmyS, IdFirmy, CisloFakturyS, CisloFaktury

Jen se jedná už o trošku složitější konstrukci, tak bude chtít možná trošku upravit podle vašich potřeb, popřípadě poopravit nějaké upsané písmenko.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Moc děkuju, je mi to jasné, jdu zkusit tu vaši konstrukci a zdokonalovat se v pokládání SQL dotazů.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dovolím si ještě jednou navázat na toto vlákno a požádat o menší radu. Zkoušel jsem ten dotaz dotáhnou do zdárného konce a narazil jsem na tento problém. Tuším, že by mělo být před "LEFT JOIN" asi FROM a název tabulky. Upravil jsem to tedy asi takto:

SELECT S.CisloFaktury, S.Cena, tbl_Faktury.Datum, tbl_Firmy.Nazev

,(SELECT CisloFaktury, SUM(Cena) AS Cena, IdFirmy, GROUPING(IdFirmy) AS IdFirmyS, GROUPING(CisloFaktury) AS CisloFakturyS FROM tbl_Faktury GROUP BY IdFirmy, CisloFaktury WITH ROLLUP) AS S

from tbl_Firmy left join tbl_Faktury ON S.CisloFaktury = tbl_Faktury.CisloFaktury

left JOIN tbl_Firmy ON S.IdFirmy = tbl_Firmy.IdFirmy

ORDER BY IdFirmyS, IdFirmy, CisloFakturyS, CisloFaktury

To mi ale ještě píše toto hlášení:

Msg 4104, Level 16, State 1, Line 2

The multi-part identifier "S.CisloFaktury" could not be bound.

Msg 1013, Level 16, State 1, Line 2

The objects "tbl_Firmy" and "tbl_Firmy" in the FROM clause have the same exposed names. Use correlation names to distinguish them.

Je mi jasné, že nemáte čas to analyzovat, ale pokud by vás něco napadlo, budu rád. Jinak vnořené dotazy jsou na mě už trochu moc, ale je to asi nezbytné, pokud chce člověk získat nějaká smysluplná data. Jdu si namáhat hlavu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Můj starý kód byl správně. FROM tbl_Firmy je tam špatně. Vytvořit jsem totiž tabulku pojmenovanou S. Další FROM tam být nemá. Co to píše u toho mého kódu?

Bohužel se blbě ladí dotaz, když človek ty tabulky nemá u sebe.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je mi to jasné. Tak ten váš kód hlásí toto:

Msg 156, Level 15, State 1, Line 4

Incorrect syntax near the keyword 'LEFT'.

Tam jsem přišel na jednu chybějící čárku před druhým (SELECT...

tak jsem jí doplnil a pak tedy to hlásí tuhle výše uvedenou chybu. Vypadá to teď takto:

SELECT S.CisloFaktury, S.Cena, tbl_Faktury.Datum, tbl_Firmy.Nazev,

(SELECT CisloFaktury, SUM(Cena) AS Cena, IdFirmy, GROUPING(IdFirmy) AS IdFirmyS, GROUPING(CisloFaktury) AS CisloFakturyS FROM tbl_Faktury

GROUP BY IdFirmy, CisloFaktury WITH ROLLUP) AS S

LEFT JOIN tbl_Faktury ON S.CisloFaktury = tbl_Faktury.CisloFaktury

LEFT JOIN tbl_Firmy ON S.IdFirmy = tbl_Firmy.IdFirmy

ORDER BY IdFirmyS, IdFirmy, CisloFakturyS, CisloFaktury

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak ještě jednou, doufám, že tentokrát již správně :)

SELECT S.CisloFaktury, S.Cena, tbl_Faktury.Datum, tbl_Firmy.Nazev FROM
(SELECT CisloFaktury, SUM(Cena) AS Cena, IdFirmy, GROUPING(IdFirmy) AS IdFirmyS, GROUPING(CisloFaktury) AS CisloFakturyS FROM tbl_Faktury
GROUP BY IdFirmy, CisloFaktury WITH ROLLUP) AS S
LEFT JOIN tbl_Faktury ON S.CisloFaktury = tbl_Faktury.CisloFaktury
LEFT JOIN tbl_Firmy ON S.IdFirmy = tbl_Firmy.IdFirmy
ORDER BY IdFirmyS, IdFirmy, CisloFakturyS, CisloFaktury 

Místo té čárky tam mělo být FROM.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Super, už to pracuje. Jen jsem tam musel u posledního řádku dodat název tabulky:

SELECT S.CisloFaktury, S.Cena, tbl_Faktury.Datum, tbl_Firmy.Nazev FROM

(SELECT CisloFaktury, SUM(Cena) AS Cena, IdFirmy, GROUPING(IdFirmy) AS IdFirmyS, GROUPING(CisloFaktury) AS CisloFakturyS FROM tbl_Faktury

GROUP BY IdFirmy, CisloFaktury WITH ROLLUP) AS S

LEFT JOIN tbl_Faktury ON S.CisloFaktury = tbl_Faktury.CisloFaktury

LEFT JOIN tbl_Firmy ON S.IdFirmy = tbl_Firmy.IdFirmy

ORDER BY IdFirmyS, tbl_Firmy.IdFirmy, CisloFakturyS, CisloFaktury

Ono to jinak hlásilo: Msg 209, Level 16, State 1, Line 6

Ambiguous column name 'IdFirmy'.

Moc díky. Já si tu konstrukci rozeberu a snad budu schopen podle toho dělat podobné výběry už sám. Musím přijít na systém tvorby těchto vnořených dotazů, to se přiznám, že mi uniká. Přeju dobrou noc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Není zač. A není čemu se divit. Je to už opravdu pokročilejší funkce, která využívá řadu konstrukcí. Trvalo mi asi hodinu a půl než jsem ten dotaz splodil. Brzy ale vyjde můj seriál právě o T-SQL jazyku, tam vše vysvětlím.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback