Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Tietokantaongelma: Cannot bind to the property

Sivun loppuun

jokke568 [27.01.2013 22:39:05]

#

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

neau33 [28.01.2013 10:28:45]

#

Moi jokke568!

Et viittis laittaa koko tapahtuman koodia esiin sekä tietoa tietokantataulun rakenteesta (sarakkeet ja niiden datatyypit).

jokke568 [28.01.2013 12:29:30]

#

Nea, laitan kun pääsen kotiin, 18 jälkeen....

Kiitos jo etukäteen

t. Jokke

jokke568 [28.01.2013 16:44:31]

#

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

neau33 [28.01.2013 17:35:54]

#

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...

jokke568 [28.01.2013 18:30:46]

#

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!

neau33 [28.01.2013 18:55:25]

#

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
'...

jokke568 [28.01.2013 19:26:33]

#

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...

neau33 [29.01.2013 14:19:57]

#

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...

jokke568 [29.01.2013 19:02:50]

#

Kiitos erittäin selkeästä vastauksestasi.

t. Jokke


Sivun alkuun

Vastaus

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

Tietoa sivustosta