databáze accdb a VB.NET a datagridview   otázka

VB.NET, SQL, Databáze

Dobrý den,

prosím o nakopnutí...mám v tom trošku hokej. Mám databázi Access (accdb)a pořád tápu i když mi to funguje na základě intenzívního googlení.

Imports System.Data.OleDb
connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
Dim path As String ="cesta + název souboru"
Dim sql As String = "SELECT * FROM vzorky_popis ORDER BY Nazev ASC"
Dim connection As New OleDbConnection(connectionString)
Dim dataadapter As New OleDbDataAdapter(sql, connection)
Dim DS As New DataSet()
Dim mycmd As New OleDbCommand

dále se volá

connectionString = connectionString + path
While DG.RowCount > 0
DG.Rows.RemoveAt(0)
End While
'pripojeni k databazi
connection.Open()
dataadapter.Fill(DS, "vzorky_popis")
'naplneni datagridu
DG.DataSource = DS
DG.DataMember = "vzorky_popis"
DG.Refresh()
pocet_zaznamu = DG.RowCount
connection.Close()
Call vypln_textboxy() 'přepíše data z aktuálního řádku do textboxů

prosím potřeboval bych jasně definovanou utilitu tak aby se zadal SQL příkaz

sql= "SELECT * FROM ..... ORDER BY ..."

nebo i "UPDATE .... SET ..." nebo "INSERT NTO ..."

nebo i vyhledávání SELECT * FROM ... WHERE LIKE..."

pak se připojil k databázi

provedl sql příkaz

naplnil DataGridView aktuálním výsledkem

pokud se přidávají, updatují nebo mažou data, tak aby se to provedlo i v databázi a výsledek se samozřejmě zobrazil v datagriview.

Stačí mi nějaké logická struktura posloupnosti příkazů nejlépe s popisem, s tím ostatním si snad poradím, protože mi to zatím funguje, ale jak píšu vlastně pořádně nevím co dělám.

Omlouvám se za blbost a děkuji za dobrou radu

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Pokud jste začátečník, zkuste si nechat vygenerovat např. TableAdapter pro DataGridview s volbou Generate INSERT,UPDATE DELETE Command a ty si potom můžete prohlédnout, jak se tvoří INSERT,UPDATE DELETE do DB. Vysvětlování, jak pracují jednotlivé commandy je na hodně dlouhý článek (SQL příkazy, parametry příkazů atd.)

PS:

While DG.RowCount > 0
DG.Rows.RemoveAt(0)
End While

To je blbost dělat, stačí nastavit

DG.DataSource = Nothing

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

Vygenerovat...a jak? jinak děkuji

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Choose datasource pro Gridview,

nebo z menu Add new datasource,

nebo ze Server Exploreru přetáhnout tabulku

a použít

Datasource wizard

a projít jednotlivé kroky.

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

A pokud by Vám to nestačilo,

INSERT, DELETE, UPDATE AND SELECT Data in MS-Access with VB 2008

http://www.youtube.com/watch?v=Eiu8UTAvb...

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

Akorát jestli si rozumíme, chci to dělat ve VisualBasic 2010 express, nikoliv v MS Access. Umím to udělat pomocí datasetu z wizardu apod, jak to nabízí VisualBasic, ale já to chci dělat kódem.

Každý zkušený už udělal mraky databází, má vyřešený connect, naplnění datagridview a další věci, tak mi stačí funkční kousky kódu a je to... Ostatní si dorazím sám, zas tak blbej nejsem :-)) abych to nepochopil.

Tak kdo se obětuje a pustí kousek svého knowhow...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

A právě ten wizard udělá na pozadí to, co vy potřebujete a hodí to do typového datasetu např. do dataset1.designer.vb do třídy TableAdapter. Tam si je můžete prostudovat. Upřímně, chce se Vám chce psát ručně všechny SQL příkazy na např. pro tabulku s 10 sloupci?

Ta ukázka na Youtube je sice pro VB 2008, ale

to je úplně stejný jako VB 2010.

Tady je kousek KnowHow z MS:

http://msdn.microsoft.com/en-us/library/...

http://msdn.microsoft.com/en-us/library/...

http://msdn.microsoft.com/en-us/library/...

http://msdn.microsoft.com/en-us/library/...

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

Jen detail... jaký je rozdíl a co je potřeba inportovat? Teď mám:

Imports System.Data.OleDb
connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="

a všechno funguje. Když to přepíšu na

connectionString = "Provider=Microsoft.Jet.Oledb.4.0;Data Source="

hlásí to chybu.

Pomůže mi někdo s orientací v jedntlivých providerech, jak zjistit který je na konkrétním počítači nebo existuje nějaký obecný...?

Aby pak nebyl guláš v providerech a program nehavaroval kvůli tomu.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

http://www.connectionstrings.com/

Microsoft.ACE.OLEDB.12.0 --> Google --> najit

Microsoft.Jet.Oledb.4.0 --> Google --> najit

Rozdíly si najděte, ještě že google neumí hledat.

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

Vyzkoušel jsem to a sice v databázi (accdb) záznam zmizel nebo byl editován, ale datagridview se mi naplnil dvakrát (tedy zůstaly původní data a k tomu se zobrazila nová data).

Když jsem se vrátil k původnímu:

While DG.RowCount > 0
DG.Rows.RemoveAt(0)
End While

rázem bylo po problému...tak kde soudruzi z NDR udělali chybu?

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

Z těch vašich fragmentů kodu, není poznat, co vlastně soudruzi z NDR chtějí dělat. Nastavuju úplně běžně (už asi 10 let) v aplikacích

GV.datasource=nothing

A věřte, že konzumenti těchto aplikací jsou tisíce.

pro znovu načtení dat. A pokud ten dataset máte deklarován a inicializován přímo v těle formuláře (jak je vidět v prvním příspěvku), tak se není čemu divit. A abych vám v tom udělal ještě větší guláš, tak bývá dobrým zvykem, pokud třída má implementováno IDisposable uzavřít použití této třídy do

Using

...

End Using

(Connection, Command ....) a neiniciovat tuto třídu přímo v těle formuláře, ale aspoň do nějaké metody.

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

Ale jelikož jsem v dobrém rozmaru, tak vám poradím, protože evidentně plníte ten Dataset (tabulku) 2x.

'Vyčistit dataset popř. jenom tabulku

DS.Clear()

nebo

DS.Tables("Tabulka").Clear()

GV.Datasource=nothing

A načítám znovu data

DataAdepter.Fill(DS.Tables("Tabulka"))

Tam udělali soudruzi z NDR chybu.

While DG.RowCount > 0
DG.Rows.RemoveAt(0)
End While

Tohle opravdu ne. Ale proti gustu ...

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

Google je rychlejší než smrt.... nicméně děkuji :-)

všechno je jinak...vygooglil jsem toto:

- nastavím si sql

- zavolám tohle:

Private Sub zobraz_v_DG()
Dim connection As OleDb.OleDbConnection = New OleDb.OleDbConnection(connectionString)
connection.Open()
Dim DS As DataSet = New DataSet()
Dim dataadapter As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter()
dataadapter.SelectCommand = New OleDb.OleDbCommand(sql, connection)
dataadapter.Fill(DS)
DG.DataSource = DS.Tables(0)
connection.Close()
dataadapter.Dispose()
DS.Dispose()
connection.Dispose()

End Sub

tak všechno funguje jak má...žádné opakování a tak...naprostá spojojenost.

pro ukázky sql:

sql = "SELECT * FROM vzorky_popis ORDER BY Nazev ASC"
sql = "SELECT * FROM vzorky_popis WHERE Vyrobce_jmeno LIKE '%" & hledame & "%' OR Nazev LIKE '%" & hledame & "%'"

všechno funguje...

ale když dám UPDATE

sql = "UPDATE vzorky_popis SET "
sql = sql + " Nazev = '" & TextBox1.Text & "'"
sql = sql + " WHERE "
sql = sql + " ID = " & Val(txtID.Text)

tak po zavolání zobraz_v_DG() ohlásí chybu na tomto řádku: DG.DataSource = DS.Tables(0), že žádná tabulka s indexem 0 neexistuje.

A kde teď udělali soudruzi z NDR chybu... trápím, se s tím půl dne a nic...

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

DS.Dispose()

tam nemá co dělat, protože ....

To IDisposable jste vzal hopem, koukám, že

pro jistotu jste to napral na všechny objekty.

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

jsem sice blbej, ale úpornej... :-)

nepomohlo to, pořád to samé, tabulka s indexem 0 nenexistuje.

Není problém v tom sql...? jeho celá struktura vypoadá takto:

sql = "UPDATE vzorky_popis SET "
sql = sql + " Nazev = '" & TextBox1.Text & "',"
sql = sql + " Popis = '" & TextBox2.Text & "',"
sql = sql + " Vyrobce_jmeno = '" & TextBox3.Text & "',"
sql = sql + " Vyrobce_adresa = '" & TextBox4.Text & "',"
sql = sql + " Vyrobce_stat = '" & TextBox5.Text & "',"
sql = sql + " Vyrobce_web = '" & TextBox6.Text & "',"
sql = sql + " Prodejce_jmeno = '" & TextBox7.Text & "',"
sql = sql + " Prodejce_web = '" & TextBox8.Text & "',"
sql = sql + " Porizeno_datum = '" & Format(CDate(TextBox9.Text), "d.M.yyyy") & "',"
sql = sql + " Porizeno_misto = '" & TextBox10.Text & "',"
sql = sql + " Porizeno_jmeno = '" & TextBox11.Text & "',"
sql = sql + " Cena_cislo = '" & Val(TextBox12.Text) & "',"
sql = sql + " Cena_mena = '" & ComboBox1.Text & "',"
sql = sql + " Deklarovane_slozeni = '" & TextBox13.Text & "',"
sql = sql + " Nebezpecne_vlastnosti = '" & TextBox14.Text & "',"
sql = sql + " Poznamka = '" & TextBox15.Text & "'"
sql = sql + " WHERE "
sql = sql + " ID = " & Val(txtID.Text)

protože když funguje

sql = "SELECT * FROM vzorky_popis WHERE Vyrobce_jmeno LIKE '%" & hledame & "%' OR Nazev LIKE '%" & hledame & "%'"
sql = "SELECT * FROM vzorky_popis ORDER BY Nazev ASC"

tak proč ne to UPDATE...?

Děkuji za nápady

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

Dejte sem celý kod, z těch fragmentů se dá houby poznat.

(pokud to není tajná aplikace pro NATO)

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

Jestli mi chcete pomoct, za což moc děkuji...nebude to lepší mailem, ten kód je strašně dlouhý...

Stačí písnout na [email protected] odpovím obratem.

Podotýkám, že se tím neživím a živit rozhodně nechci, nicméně jsem kdysi dělal nějaké věci v VB5 a 6 a přechod na platformu NET je docela záhul. Dělám si jen taková udělátka nad daty :-)

Někdy je i jednooký mezi slepými králem...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Takovéto skládání sql commandů a dosazování proměnných je nejhorší jak to můžete dělat.Takže když už googlíte a něco "vyrábíte" ,tak aspon,tak aby to bylo použitelné a alespon trochu bezpečné.

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

Už z principu fakt miluju tyhle poznámky... říct druhéme, že něco dělá blbě, to z prominutím umí každý blbec. Čili o čem to pak je? Buď si čechrám vlastní peří a světu dávám na odiv jaký jsem borec, že "vím", pak nechápu proč chodit na diskuse a zasviňovat je poznámkami o ničem. Nebo chci někomu pomoct nebo aspoň jej nasměrovat...

Takže otázka zní, proč je to blbě a jak to dělat lépe...?

Děkuji

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Jako nemá cenu vymýšlet už jednou objevené,tak stejně tak nemá smysl omílat něco co bylo již tisíckrát řečeno,zmíněno a popsáno - tudíž,naučte se základy a hledejte,než se začnete psát...

nahlásit spamnahlásit spam 0 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