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?
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
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. :/
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 + "%'"
Kokeilin muuttaa tuota filtterin kirjoitusasua, mutta ei vaikuttanut mitenkään. Edelleenkään editori ei hyväksy TextBox1.text -kohtaa ja virheilmoitus on sama. :(
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...
Toimii, viimeinkin! Kiitos Nea! :)
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.