Mistä päin voisi alkaa etsimään virhettä? Työvuoroja selattaessa TyövuorotBindingNavigatorin avulla arvon muuttuessa TyövuoroAIKAIDtext.boxissa hakee ohjelma Työvuoroajan tarkemmat tiedot näkyviin.
Toimii ihan hyvin, kun hakee ensimmäisen kerran jonkun työvuoroAIKA tarkennukset, mutta hakiessa seuraavan työvuoron tarkennukset ilmoittaa seuraavasta virheestä "Cannot bind to the property or column TyövuoroAikaID on the DataSource.
Parameter name: dataMember".
Virheilmoitus kohta on koodissa...
Mistä kannattaisi alkaa etsiä vääriä määrityksiä tms.?
conn = New OleDbConnection Try conn.ConnectionString = connstr conn.Open() Catch ex As Exception MsgBox(ex.Message) End Try If conn.State = ConnectionState.Open Then Dim query As String = "SELECT * FROM TyövuoroAjat WHERE TyövuoroAikaID =" + TyövuoroAikaIDTextBox.Text TietoAdapter = New OleDbDataAdapter(query, connstr) TietoDataSet = New DataSet TietoAdapter.Fill(TietoDataSet, "TyövuoroAjat") If TietoDataSet.Tables("TyövuoroAjat").Rows.Count > 0 Then TyövuoroAjatBindingSource.DataSource = TietoDataSet ' TÄSSÄ KOHDASSA ILMOITTAA VIRHEESTÄ TyövuoroAjatBindingSource.DataMember = "Työvuoroajat" End If End If
Moi jokke568!
Et viittis laittaa koko tapahtuman koodia esiin sekä tietoa tietokantataulun rakenteesta (sarakkeet ja niiden datatyypit).
Nea, laitan kun pääsen kotiin, 18 jälkeen....
Kiitos jo etukäteen
t. Jokke
Tässä Formin alku
Imports System Imports System.Data Imports System.Data.OleDb Public Class frmTyövuorot Dim conn As OleDbConnection = Nothing Dim TietoDataSet As DataSet = Nothing Dim TietoAdapter As OleDbDataAdapter = Nothing ' Dim connstr As String = String.Empty ' Määritetty ja arvo Modulissa ' tämä rivi modulessa: ( Public connstr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Database\Tietokanta.accdb" ' String.Empty ) Private Sub frmTyövuorot_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'TODO: This line of code loads data into the 'TietokantaDataSet.TyövuoroAjat' table. You can move, or remove it, as needed. Me.TyövuoroAjatTableAdapter.Fill(Me.TietokantaDataSet.TyövuoroAjat) 'TODO: This line of code loads data into the 'TietokantaDataSet.TyöVuorot' table. You can move, or remove it, as needed. Me.TyöVuorotTableAdapter.Fill(Me.TietokantaDataSet.TyöVuorot) End Sub
Tässä on tuo ylläkin oleva koodi
Private Sub TyövuoroAikaIDTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TyövuoroAikaIDTextBox.TextChanged If TyövuoroAikaIDTextBox.Text = "" Then Exit Sub conn = New OleDbConnection Try conn.ConnectionString = connstr conn.Open() Catch ex As Exception MsgBox(ex.Message) End Try If conn.State = ConnectionState.Open Then Dim query As String = "SELECT * FROM TyövuoroAjat WHERE TyövuoroAikaID =" + TyövuoroAikaIDTextBox.Text TietoAdapter = New OleDbDataAdapter(query, connstr) TietoDataSet = New DataSet TietoAdapter.Fill(TietoDataSet, "TyövuoroAjat") If TietoDataSet.Tables("TyövuoroAjat").Rows.Count > 0 Then TyövuoroAjatBindingSource.DataSource = TietoDataSet TyövuoroAjatBindingSource.DataMember = "Työvuoroajat" End If End If End Sub
Tämä tallentaa työvuoron työajat
Private Sub TallennaTyöajat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TallennaTyöajat.Click conn = New OleDbConnection Dim rivi As Integer = 0 Try conn.ConnectionString = connstr conn.Open() Catch ex As Exception MsgBox(ex.Message) End Try If conn.State = ConnectionState.Open Then ' RIVI on seuraava vapaa paikka taulussa Dim Rk As DataRow = TietokantaDataSet.Tables("TyövuoroAjat").NewRow() ' Rk("TyövuoroAikaID") = rivi Rk("TyövuoroAlkaaKlo") = FormatDateTime(TyövuoroAlkaaKloDateTimePicker.Value, DateFormat.ShortTime) Rk("TyövuoroLoppuuKlo") = FormatDateTime(TyövuoroLoppuuKloDateTimePicker.Value, DateFormat.ShortTime) Rk("RuokisAlkaaKlo") = FormatDateTime(RuokisKloDateTimePicker.Value, DateFormat.ShortTime) Rk("RuokisLoppuuKlo") = FormatDateTime(RuokisKloDateTimePicker.Value, DateFormat.ShortTime) TietokantaDataSet.Tables("TyöVuoroAjat").Rows.Add(Rk) Dim kUpdateB() As DataRow = Me.TietokantaDataSet.TyövuoroAjat.Select("", "", DataViewRowState.Added Or DataViewRowState.ModifiedCurrent) TyövuoroAjatTableAdapter.Update(kUpdateB) MsgBox("Lisätty") ' Haetaan seuraava vapaa rivi, Dim query As String = "SELECT MAX(TyövuoroAikaID) FROM TyövuoroAjat" TietoAdapter = New OleDbDataAdapter(query, connstr) TietoDataSet = New DataSet TietoAdapter.Fill(TietoDataSet, "TyövuoroAjat") If TietoDataSet.Tables("TyövuoroAjat").Rows.Count > 0 Then rivi = (TietoDataSet.Tables("TyövuoroAjat").Rows(0)(0)) ' MsgBox(rivi.ToString) End If ' ' Tallentaa TyövuoroaikaID:n TyövuorotDatasettiin TyövuoroAikaIDTextBox.Text = rivi.ToString Me.Validate() Me.TyöVuorotBindingSource.EndEdit() Me.TableAdapterManager.UpdateAll(Me.TietokantaDataSet) End If End Sub
Tietokannassaa
Työvuorot (taulu)
mm.
- ID (pitkä kokonaisluku, koko 4) PK
- TV (Teksti, Työvuoron nimi)
- TyövuoroAikaID (Pitkä kokonaisluku, koko 4)
Työvuoroajat (taulu)
mm.
- TyövuoroAikaID (pitkä kokonaisluku, koko 4) PK
- TyövuoroAlkaaKlo (pvm./klo. koko 8) (lyhyt aika 00:00:0
- TyövuoroLoppuuKlo --- // ---
- RuokisALkaaKlo --- // ---
- RuokisLoppuuKlo --- // ---
Onko tässä riittävästi tietoa, jotta osaisit neuvoa, missä virhe voisi olla...
Lisäys:
Ohjelma toimii, jos korvaan ekaksi näyttämistäni riveistä
TyövuoroAjatBindingSource.DataSource = TietoDataSet TyövuoroAjatBindingSource.DataMember = "Työvuoroajat"
Riveillä
TyövuoroAlkaaKloDateTimePicker.Value = TietoDataSet.Tables("Työvuoroajat").Rows(0)("TyövuoroAlkaaKlo") TyövuoroLoppuuKloDateTimePicker.Value = TietoDataSet.Tables("Työvuoroajat").Rows(0)("TyövuoroLoppuuKlo") RuokisAlkaaKloDateTimePicker.Value = TietoDataSet.Tables("Työvuoroajat").Rows(0)("RuokisAlkaaKlo") RuokisLoppuuKloDateTimePicker.Value = TietoDataSet.Tables("Työvuoroajat").Rows(0)("RuokisLoppuuKlo")
Joten ongelma ratkesi, mutta rivejä vain tulee enempi... Olisiko tähän olemassa fiksumpi tapa?
Työvuorot taulusta olen Accesin kautta tehnyt Yhteyden Työvuoroajat tauluun, joka näkyy myös VB:n tietokantakäsittelyssä.
Nythän avaan erikseen TyövuoroAjatTaulun, ja sitten tallennan sen muutokset ja haen vapaan rivin, jonka ID tallennan erikseen Työvuorot tauluun...
Miten näitä "suhteita?" saa hyödynnettyä parhaiten?
T. Jokke
Moi jokke568!
Private Sub TyövuoroAikaIDTextBox_TextChanged... 'Mitä ihmettä? Joka kerta kun lyöt uuden kirjaimen niin... 'Siirrä nyt ihmeessä koodi täältä vaikkapa jonkun nappulan Click_Tapahtuman taakse! 'ja testaa sitten koko tämä osuus: Dim IsExisting As Boolean = False For Each dt As DataTable In TietoDataSet.Tables If dt.TableName = "Työvuoroajat" Then IsExisting = True: Exit For End If Next If IsExisting Then TyövuoroAjatBindingSource.Clear TyövuoroAjatBindingSource.DataSource = TietoDataSet Try TyövuoroAjatBindingSource.DataMember = "Työvuoroajat" Catch ex As Exception MsgBox(ex.Message) End Try Else MsgBox("Niin että mitkä Työvuoroajat?") End If '...
En nyt puutu mihinkään muuhun, mutta tykkään vahvasti, että systeemisi on vähintäänkin sekava. Olet näemmä lätkinyty siihen vähän kaikkea googlesta poimimaasi...
Hei
Kaikkea on räpelletty. Ja olen samaa mieltä että sakavaa on...
esimerkkisi ilmoittaa ekasta rivistä samaa virhettä kuin minun räpellykseni "Cannot bind to the property or column TyövuoroAlkaaKlo on the DataSource.
Parameter name: dataMember"
Joten epäilen kovasti, että vika on nyt bingindsourcen asetuksissa tai jossain vastaavissa. Yritin niiden asetuksia vaihtelemalla saada yhdisteltyä asioita...
Nyt yritän sitten keksiä mikä asetus on pielessä..
t. Jokke
Kiitos vaivannäöstä.
Lisäys:
Nyt toimii esimerkistäsi.
Tohkeissani unohtui ladata tietokanta ja adapteri..
Suuri kiitos taas!
MOI jokke568!
jokke568 kirjoitti:
(alunperin)
...ilmoittaa seuraavasta virheestä "Cannot bind to the property or column TyövuoroAikaID on the DataSource.
Parameter name: dataMember".
jokke568 kirjoitti:
(viimeksi)
...esimerkkisi ilmoittaa ekasta rivistä samaa virhettä kuin minun räpellykseni "Cannot bind to the property or column TyövuoroAlkaaKlo on the DataSource
Parameter name: dataMember
Siis mikä esimerkki, kyseessähän oli testi! No laajennetaan sitä testiä:
'... Dim IsExisting As Boolean = False For Each dt As DataTable In TietoDataSet.Tables If dt.TableName = "Työvuoroajat" Then For Each dcol As DataColumn In dt.Columns If dcol.ColumnName = "TyövuoroAlkaaKlo" Then IsExisting = True: Exit For End If Next dcol End If If IsExisting Then Exit For Next dt If IsExisting Then TyövuoroAjatBindingSource.Clear TyövuoroAjatBindingSource.DataSource = TietoDataSet Try TyövuoroAjatBindingSource.DataMember = "Työvuoroajat" Catch ex As Exception MsgBox(ex.Message) End Try Else MsgBox("Niin että mikä TyövuoroAlkaaKlo?") End If '...
Hei taas
Enempi kun kokeili ja tarkisti esille tulleilta työaikoja niin eivät ole TyövuoroID:n mukaisia aikoja kun tarkistaa Accesista vastaavaa riviä.
Olin jo poistamassa testiä ja palaamassa alkuperäiseen monta riviä räpellykseeni kun tulin vielä käymään täällä...
Ja huomasin, että juttu jatkuu.
Luvut eivät siis täsmää nyt accesin rivien kanssa.
lisäsin aikaisemmin unohtuneet "tietokannan ja data adapteriin" liittyen seuraavat rivit
Dim query As String = "SELECT * FROM TyövuoroAjat WHERE TyövuoroAikaID =" + TyövuoroAikaIDTextBox.Text TietoAdapter = New OleDbDataAdapter(query, connstr) TietoDataSet = New DataSet TietoAdapter.Fill(TietoDataSet, "TyövuoroAjat")
tietoadapter = new ... lienee turha kun jatkon koodi tekee haun?
Mutta jos adapterin jätän pois niin mihin syötän queryn, jotta tietää minkä TyövuoroID:n mukaan haetaan.
Ei nyt oikein mene jakeluun...
Moi taas jokke568!
Olen iskenyt vuosien varrella tänne putkaan muutamia enemmän tai vähemmän kattavia esimerkkejä datasetin & data-adapterin (Access/OleDbDataAdapter & SQL Server/SqlDataAdapter) käytöstä. Esimerkeissäni olen yleensä luonut datasetistä uuden instanssin tyyliin: ds = new DataSet ja data-adapterista olen yleensä luonut uuden instanssin tyylin da = New OleDbDataAdapter tai da = New SqlDataAdapter riippuen käytettävästä tietokannasta.
Kun datasetin sisältöä päiviteään data-adapterin avulla tietokantaan niin tarvittavia objekteja ovat DataSet-objekti, DataAdapter-objekti sekä CommandBuilder-objekti.
Kuten tässä taannoin toisaalla tällä sivustolla tulikin mainittua niin putkan hausta löytyy yllättävän paljon tietoa.
Vinkki:
Kirjoita hakusanaksi: da.Update
Sikäli kun hakutulokisia löytyy niin valitse jokin linkeistä
Pina Ctrl+F näppäinyhdistelmää ja kirjoita selaimen etsi ruutuun: da.Update
Klikkaile sitten Edellinen/Seuraava nappuloita mielesi mukaan.
Sikäli mikäli jotain kiinnostavaa löytyy niin TUTKI IHMEESSÄ ennen, kuin siirryt Googleen copy/pasteamaan kaikenlaista aivan turhaa sälää.
Toinen vinkki:
Kirjoita hakusanaksi: ExecuteNonQuery
Sikäli kun hakutulokisia löytyy niin...
Paina Ctrl+F näppäinyhdistelmää ja kirjoita selaimen etsi ruutuun: neau33
Klikkaile taas Edellinen/Seuraava nappuloita mielesi mukaan...
Jos tutkit niin löydät vastauksia esim. kysymykseen miten päivitellä tietokantaa ilman data-adapteria...
Kiitos erittäin selkeästä vastauksestasi.
t. Jokke
Aihe on jo aika vanha, joten et voi enää vastata siihen.