Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: VB2008 & Access2010: Hakulomake

Sivun loppuun

highwater [10.11.2010 21:06:39]

#

Uusi ongelma, vaikkakin edelleen liittyen tietokantayhteyteen ja tietokantaan. Minulla on tietokanta, johon lisätään erilaisia tarviketietoja, tässä esimerkissä olen käyttänyt kameralinssien tietoja sisältävää taulua. Tämän olen tehnyt (jo monta kertaa erillisiin projekteihin) pilkulleen Microsoftin videotutoriaalin (How Do I: Create a search form?) mukaan, mutta ei vaan onnistu.

Luon DataSetin (Add new datasource…) normaalisti ja lisään sen sisältämän taulun lomakkeelle (DataGridView). Seuraavaksi haluan lisätä kyselyyn parametrin, eli valitsen DataGridView:sta Add query. Avautuvasta Search Criteria Builderista valitsen Query Builderin. Lisään esim. linssivalmistaja-kentälle filterin: LIKE @linssivalmistaja + ’%’.

Execute query-painikkeen pitäisi avata erillinen ikkuna, jossa pitäisi pystyä testaamaan kyselyä kokeilemalla erilaisia hakusanoja. Tämä on näytetty mm. MS:n videotutoriaalissa. Mulla Execute query –painike suorittaa kyselyn (ehkä?) ja antaa tyhjän vastauksen. Mitään erillisiä ikkunoita ei ilmesty eikä hakusanaa voi syöttää mihinkään. Kysely on kenttien nimiä lukuun ottamatta samanlainen kuin MS:n tutoriaalissa:
SELECT linssiID, linsValmistaja, linsValmistusnro, linsValmistusvuosi, linsTyyppi FROM linssit WHERE (linsValmistaja LIKE '@linsValmistaja' + '%')

Kun klikataan ok ja palataan takaisin lomakkeelle, pitäisi ohjelman luoda automaattisesti lomakkeen yläreunaan työkalurivi, jolla hakuja voi suorittaa. Työkalurivin pitäisi sisältää tekstikenttä ja hakupainike. Minulle ohjelma luo pelkän hakupainikkeen, ei lainkaan tekstikenttää.

Eräässä toisessa videotutoriaalissa automaattisesti luotu työkalurivi korvattiin lomakkeelle itse lisätyillä TextBoxilla ja Buttonilla. Automaattisesti luodusta työkalurivistä siirrettiin seuraavanlainen koodi itse lisättyyn Buttoniin:

Try
Me.LinssitTableAdapter.FillByHaku(Me.TarvikedbDataSet.linssit, TextBox.text)
Catch ex As System.Exception
System.Windows.Forms.MessageBox.Show(ex.Message)
End Try

Kokeilin itse samaa, eli lisäsin lomakkeelle textboxin ja buttonin ja lisäsin buttoniin koodin automaattisesta työkalurivistä. Tämä onkin seuraava asia, joka herätti ihmetystä. Videotutoriaalin koodissa oli määritelty, mistä hakusana otetaan, eli TextBox.text (ylläolevassa koodissa). Minulla Visual Studio ei kuitenkaan tätä ole automaattisesti koodiin lisännyt, eikä se sitä hyväksy, jos yritän sen koodiin itse lisätä. öToo many arguments..ö jne.

Tehtyä ohjelmaa testatessa hakukaan ei tietenkään toimi, koska missään ei ole määritelty, mistä hakusana luetaan. Onko nyt vika koodaajassa vai koneessa/ohjelmassa/tietokannassa/tms.? Tietokannan ja tietokantayhteyden kanssa olen taistellut jo viikkoja. Jostain syystä koneellani oleva Visual Studio tekee tietokantojen käsittelyn aina eri tavoin kuin ohjeiden mukaan pitäisi tapahtua, vaikka seuraisin ohjeita pilkulleen. Voiko siis itse ohjelmassa olla joku vika/asetus/muu juttu, mikä tämän kaiken voisi aiheuttaa? Tai voiko ongelma johtua esim. siitä, että käytän Access 2010-tietokantaa ja Visual Studion 2008-versiota?

neau33 [10.11.2010 23:05:02]

#

Moi highwater!

En puutu siihen mitä Visual Studion pitäisi automaattisesti milloinkin luoda. Sen sijaan hieman tuosta koodista elikä olet raahannut formille tekstiruudun johon on tarkoitus syötellä hakuarvoja sekä painikkeen, jonka click_tapahtumassa pitäisi suorittaa haku.

Oletetaan että tekstiruudun nimi on TextBox1, jolloin tuntuisi melko loogiselta, että koodi näyttäisi jokseenkin seuraavalta...

Try
   Me.LinssitTableAdapter.FillByHaku( _
   Me.TarvikedbDataSet.linssit, TextBox1.text)
Catch ex As System.Exception
   System.Windows.Forms.MessageBox.Show(ex.Message)
End Try

highwater [10.11.2010 23:47:32]

#

Textboxin nimi on tosiaankin TextBox1, mutta se ei muuta tilannetta miksikään. Koodi ei edelleenkään toimi. Editori alleviivaa TextBox1.text-kohdan ja virhehuomautus on seuraava: "Too many arguments to 'Public Overridable Overloads Function FillByHaku(dataTable As tarvikedbDataSet.linssitDataTable) As Integer'. Menee tosiaankin yli minun ymmärrykseni. :/

neau33 [11.11.2010 19:06:41]

#

Moikka taas highwater!

Kun nyt käytät Accessia niin kokeile kirjoittaa Query Builder'in filtteriin: Like %linsValmistaja + '%'

Esim. Access OleDb-querystring muodostettaan seuraavasti jos hakuehto tuodaan tekstiruudusta:

query = "Select Kenttä1, Kenttä2, jne. From [Taulu] WHERE Kenttä Like '%" + textBox1.Text  + "%'"

highwater [11.11.2010 20:28:50]

#

Kokeilin muuttaa tuota filtterin kirjoitusasua, mutta ei vaikuttanut mitenkään. Edelleenkään editori ei hyväksy TextBox1.text -kohtaa ja virheilmoitus on sama. :(

neau33 [11.11.2010 22:44:09]

#

Moikka taas highwater!

Unohda kaikennäköiset builderit ja kokeile koko jutskaa suoraan koodista niin pääset ehkä paremmin jyvälle siitä mistä oikeastaan on kysymys.

Luo aluksi aivan uusi Windows Forms projekti (nimeksi esim. AccessSearchFormTest).
Lisää lomakkeelle TextBox, Button ja DataGridView kontrollit ja lisää lomakkeen tapahtumiin From1_Load, Form1_FormClosing ja Button1_Click -tapahtumat.

Lisää Imports lauseet:

Imports System.Data
Imports System.Data.OleDb

Kirjoita heti Public Class Form1 jälkeiselle riville:

Private ds As DataSet = New DataSet
Private conn As OleDbConnection = Nothing
Dim query As String = String.Empty

Kirjoita Form1_Load tapahtuman koodiksi:

Dim dbPath As String = "C:\HakemistonPolku\TiedostonNimi.accdb"
Dim connstr As String = _
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
+ dbPath + ";Persist Security Info=False;"
conn = New OleDbConnection(connstr)
conn.Open

Kirjoita Button1_Click tapahtuman koodiksi:

If textBox1.Text = String.Empty Then
   textBox1.Focus: Exit Sub
End If

query = "Select * From [TaulunNimi] WHERE HakuKentänNimi Like '%" + textBox1.Text  + "%'"

ds.Tables.Clear
Dim da As OleDbDataAdapter = New OleDbDataAdapter(query, conn)
da.Fill(ds): da = Nothing
DataGridView1.DataSource = ds.Tables(0)
textBox1.Clear

Ja kirjoita vielä Form1_FormClosing tapahtuman koodiksi:

Try
   conn.Close
Catch ex As Exception
End Try
ds = Nothing: conn = Nothing

käännä projekti ja testaa...

highwater [12.11.2010 09:17:33]

#

Toimii, viimeinkin! Kiitos Nea! :)

neau33 [12.11.2010 13:16:02]

#

Moikka taas highwater!

Nyt voidaankin sitten siirtyä tutkimaan TableAdapteria & QueryBuilderia

Elikä kun käytössä on Microsoft Access tietokanta niin kirjoita Query Builderissa filter-ruutuun:
LIKE '%' + ? + '%'

Nyt kun testaat SQL-lausetta Query Builder'ssa niin esiin pitäisi avautua ikkuna, jonka Name-kentässä näkyy ? ja Value-kentässä NULL

Nyt voit liittää Button1_Click tapahtumassa tekstiruuduun sisällön parametrinä TableAdapterin SQL-lauseeseen tyyliin:
Me.LinssitTableAdapter.FillByHaku(Me.TarvikedbDataSet.linssit, TextBox1.Text)
Jos DataGridView ei päivity niin lisää koodiin vielä seuraavat rivit:
Me.DataGridView1.DataSource = Me.TarvikedbDataSet.linssit
Me.DataGridView1.DataBind()

Vastauksena kysymykseesi: "voiko ongelma johtua esim. siitä, että käytän Access 2010-tietokantaa ja Visual Studion 2008-versiota?"
Ei voi! Vaan siitä, että valtaossassa netistä löytyvistä Visual Studion tietokantaohjelmoinnin video & muissa tutoriaaleissä käytetään SQL Server tietokantoja.
Microsoft SQL Serverin ja Microsoft Accessin SQL-syntaksit sekä tietotyypit poikkeavat toisistaan. Myös tapa, jolla Visual Studion (.NET Frameworkin) Data Provider'it käsittelevät SQL-syntakseja poikkeaa hieman toisistaan.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta