Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: vb.net ja access

Sivun loppuun

kayttaja-2845 [26.08.2004 10:08:07]

#

Tein ohjelmanpätkän ja access tietokannan. Teen vain muutamia kyselyjä sinne ohjelmakoodilla, jotka ovat buttoneiden takana. Sain toimimaan muuten paitsi max arvoa. Eli SELECT MAX(nro) FROM... Ilman MAX ehtoa toimii kyllä. Pitääköhän tässä tietää jotain erityistä? Onko kenelläkään kokemuksia?

Antti [26.08.2004 10:11:26]

#

Hmmm... tarvitsisi ehkä vähän pidemmän pätkän koodia, että näkisi missä on vika...

kayttaja-2845 [26.08.2004 11:15:46]

#

Sorry, toi tekstin asettelu on vähän heikkoa. Tässä on melkein koko koodi siitä. Otin selkeyden vuoksi pois muutaman if- lauseen jotka liittyy vähän eri juttuun. Sen unohdin vielä sanoa, että kyllähän se hakee isoimman era_nro:n, vaikka tota MAX() arvoa ei laita. Ei taida olla oikein hyvä luottaa siihen, koska sitä ei ole määritelty mitenkään.

Kiitos etukäteen vaivannäöstäsi.

Try
   Dim dbConn As OleDbConnection
   Dim dbCommand As New OleDbCommand
   Dim strPath As String
   Dim era_nro As Integer
   txtasiakas.Text = cmbasiakas.Text

   strPath = txtPath.Text
   dbConn = New OleDbConnection    Provider=Microsoft.Jet.OLEDB.4.0;" _
                        & "DATA SOURCE=" _
                         & strPath)
dbCommand.CommandText = "SELECT (MAX)era_nro FROM rekisteri where asiakas=" & cmbasiakas.Text

            dbCommand.Connection = dbConn
            dbConn.Open()
            Dim dbDR As OleDb.OleDbDataReader =   dbCommand.ExecuteReader

            While dbDR.Read

               era_nro = dbDR("era_nro".ToString)

            End While

            dbConn.Close()


        Catch err As System.Exception
            MsgBox(err.Message)
        End Try
    End Sub

BadSource [26.08.2004 11:32:59]

#

En tiedä onko tuo virhe sitten syntynyt kopioinnin yhteydessä (tai SQL on muuttunut siirryttäessä VB6:sta .Net:n), mutta voisi näin aluksi laittaa nuo sulut tuon MAX:n ympäriltä sen jälkeen olevan era_nro:n ympärille.

kayttaja-2845 [26.08.2004 12:38:20]

#

Jeps, toi oli oma virhe. Kyllä se on ollut MAX(era_nro).

BadSource [27.08.2004 09:09:30]

#

Miten era_nro on määritelty tietokantaan? Number, AutoNumber vai mikä? MAX:han käsittelee vain numeerisia arvoja. Palauttaako tuo hakusi jotain vai aiheuttaako se ohjelman suorituksen pysäyttävän virheen?

Antti [27.08.2004 09:54:38]

#

Voisit kokeilla muotoilla lausetta seuraavasti:

dbCommand.CommandText = "SELECT ISNULL(MAX(era_nro), 0) as maxnbr FROM rekisteri WHERE asiakas='" & cmbasiakas.Text & "'"

Näin saat aina arvoksi vähintään 0 riippumatta hakuehdon toteutumisesta ja ainakaan Access ei ihmettele puuttuvaa sarakenimeä, joka on nyt maxnbr.

Huom.Testattu vain SQLServer 2000:sella, mutta pitäisi toimia myös Accessissa.

kayttaja-2845 [27.08.2004 09:54:56]

#

Era_nro on luku tyyppiä. Haku ei anna mitään tulosta, eikä myöskään pysäytä ohjelmaa. Antaa ainoastaan virkeilmoituksen msgboxissa jossa teksti "era_nro".

Kiitos vihjeestä Antti. Ei vaan halunnut toimia.Funktin argumenttien määrä on virheellinen kyselylausekkeessa "ISNULL(MAX(era_nro), 0)" Tällainen virhe tuli. Aika kumma kun ei saa toimimaan mitenkään, tai oikeastaan tämä ohjelma toimii. Se antaa aina kyselyssä suurimman era_nro:n ilman hakuehtoa max. Siihen ei voi ehkä luottaa tulevaisuudessa.

BadSource [27.08.2004 11:24:11]

#

Katselin netistä tuota IsNull:ia ja löytyi tälläinen:

SQLTeam kirjoitti:

SQL Server has a handy little function called ISNULL. It checks if a value is NULL (hence the clever name) and allows you to return a different value if it is. You might use it just like this:

SQLTeam kirjoitti:

Note: Looking back over this (after I wrote my answer of course), it seems you might be using Access. I don't know the comparable function for ISNULL in Access. It shouldn't be to hard to find though.

Eli Accessilla oikea käyttömuoto on IsNull(MAX(era_nro)) joka palauttaa TRUE/FALSE. Eli hieman soveltamalla...

dbCommand.CommandText = "SELECT IIF(ISNULL(MAX(era_nro)),0,MAX(era_nro)) as maxnbr FROM rekisteri WHERE asiakas='" & cmbasiakas.Text & "'"

kayttaja-2845 [27.08.2004 11:48:38]

#

Nyt tulee jo vaikeaa koodia mulle. Tota pitää jo sulatella että ymmärtäisi sen. Ongelma pysyy edelleen. MsgBox(err.Message) antaa virhetekstiksi "era_nro"

BadSource [27.08.2004 11:56:36]

#

IIF on ehto-rakenne SQL-kyselyille ja on rakenteeltaan

IIF(ehto, palautusarvo jos ehto on True, palautusarvo jos ehto on False)

Tunteeko .Net err.Descriptionia tai mitään vastaavaa? Saisi tarkemman tiedon mikä tuo virhe on.

kayttaja-2845 [27.08.2004 12:34:00]

#

MsgBox(Err.Description) =An unhandled exception of type 'System.IndexOutOfRangeException' occurred in system.data.dll

Additional information: era_nro

Kohta tipahtaa kokonaan.

Antti [28.08.2004 10:26:33]

#

.Netissä toimii sekä vanha kunnon error-objekti, että siihen on lisätty vanha kunnon Try, Catch:

Try
   ...koodia
Catch ex as Exception
   msbbox(ex.Message)
End Try

Olisiko mahdollista, että Access ei osaa käsitellä Null-tilannetta tuolla Max-operaattorilla?

kayttaja-2845 [30.08.2004 10:26:51]

#

Ei sen pitäis olla mahdollista, koska joka sarakkeessa on tietoa.

BadSource [30.08.2004 10:29:51]

#

Jos kyse on tuosta minkä Antti otti esille

Antti kirjoitti:

Olisiko mahdollista, että Access ei osaa käsitellä Null-tilannetta tuolla Max-operaattorilla?

niin voisi kokeilla tiputtaa sen MAX-valinnan pois IsNull-tarkistuksesta tyyliin

dbCommand.CommandText = "SELECT IIF(ISNULL(era_nro),0,MAX(era_nro)) as maxnbr FROM rekisteri WHERE asiakas='" & cmbasiakas.Text & "'"

kayttaja-2845 [30.08.2004 10:49:44]

#

Yritit suorittaa kyselyn, jossa määritetty lauseke "IIF(ISNULL(era_nro),0,MAX(era_nro))" ei ole funktion osa. En ihan saanut tosta lauseesta kiinni, niin eipä siihen osaa itse tehdä muutoksiakaan.

En minä kauan enää piinaa...

BadSource [30.08.2004 11:10:12]

#

Jos sulla on käytössä Access, (kuten varmaan on), niin kokeile kopioida tuo lauseke

SELECT IIF(ISNULL(era_nro),0,MAX(era_nro)) as maxnbr FROM rekisteri WHERE asiakas='[lisää tähän jokin tunnus joka kannasta löytyy]'

ja tehdä Accessissa kysely (query) käyttämääsi tietokantaan, että palauttaako tuo mitään sitä kautta. Eli onko virhe kyselyssä vai vb:n puolella...

kayttaja-2845 [30.08.2004 13:23:10]

#

Sama virhe tuli accessissa eli, yritit suorittaa kyselyn, jossa määritetty lauseke "IIF(ISNULL(era_nro),0,MAX(era_nro))" ei ole koostefunktion osa.

Antti [30.08.2004 20:04:17]

#

Hmmm... mitäköhän yhteyttä tietokantaan mahdat käyttää? MS Jet tukee tuota IIF-lausetta, mutta muista en mene takuuseen...

kayttaja-2845 [31.08.2004 12:27:22]

#

("Provider=Microsoft.Jet.OLEDB.4.0;")

BadSource [31.08.2004 13:25:28]

#

kayttaja-2845 kirjoitti:

Sama virhe tuli accessissa

Eli virhe on kyselyssä...

Mikä versio Accessista? Lähinnä ajureiden versiot kiinnostaa... Ainakin meikäläisen 97 hyväksyi IIF()-rakenteen nikottelematta...

kayttaja-2845 [31.08.2004 13:58:44]

#

Access on ver. 2000 ja driver do microsoft access[*.mdb] 4.00.6019.00, pvm. 16.09.2002


Sivun alkuun

Vastaus

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

Tietoa sivustosta