Avatar billede dehaas Nybegynder
23. september 2004 - 15:56 Der er 71 kommentarer og
2 løsninger

Hjælp til programering med access database

Hej,

Jeg er for første gang begyndt at arbejde med databaser i Visual Basic .NET 2003. Nogle der kn give mig en lille start guide eller noget i den retning. ?
Avatar billede snepnet Nybegynder
23. september 2004 - 17:01 #1
Du kan lige få en lynhurtig sag.

Hvis du opretter et nyt konsolprojekt, og laver en lille bitte database i access, som du så lægger i din bin-folder under dit projekt (folderen kommer først frem når du har bygget første gang).

Så kan du lave en kode som denne :

Imports System.Web
Imports System.Data.OleDb
Module Module1
    Sub Main()
        ' ny forbidelse
        Dim connection As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=TestDB.mdb;User Id=admin;Password=;")
        ' en kommando
        Dim command As OleDbCommand = New OleDbCommand("SELECT * FROM TblSomething", connection)
        ' en adapter
        Dim adapter As OleDbDataAdapter = New OleDbDataAdapter(command)
        ' et dataset
        Dim ds As DataSet = New DataSet("SomeDataSet")

        Try
            ' fyld dataset vha. adapteren
            adapter.Fill(ds)
            ' pil lidt ved data
            ds.Tables(0).Rows(0)("SomeString") = "En ny tekst"
            ' opret commandbuilder
            Dim commandBuilder As OleDbCommandBuilder = New OleDbCommandBuilder(adapter)
            ' og opdater
            adapter.Update(ds)
        Catch ex As Exception
            ' bare udskriv fejl til skærmen
            Console.WriteLine(ex.Message)
        End Try

        ' vent på at der trykkes
        Console.Read()
    End Sub
End Module
Avatar billede snepnet Nybegynder
23. september 2004 - 17:07 #2
hov.... det var ikke meningen det skulle sendes afsted allerede :o)

ovenstående er baseret på at der som sagt ligger en database i bin-folderen, og den database jeg har benyttet hedder TestDB.mdb.
Den indeholder en enkelt tabel TblSomething, og i den tabel er defineret
Id som autonummer
SomeString som Text
SomeInteger som number
og
SomeDate som DateTime

Koden sørger for :
1) at forbinde til databasen
2) hente alt hvad der ligger i TblSomething
3) Opdatere feltet SomeString i række nummer 1
4) Og opdatere igen.

Det er så et eksempel hvor der bruges et dataset, men det er der ingen der siger at du skal.

Desuden benyttes en commandbuilder, som gør det muligt at få generet de statements der er nødvendige for at opdatere i databasen.
(insert, update og delete).

Du kan gøre alt hvad du vil med de data der er læst op i datasettet (opdatere, slette og tilføje), og kaldet til Update(ds) skulle gerne gå godt pga. commandbuilderen.

Håber du kunne bruge det til et eller andet... Jeg bliver nødt til at løbe, men er herude igen senere.

mvh
Avatar billede arne_v Ekspert
23. september 2004 - 17:09 #3
Et par lidt andre eksempler:

console app med datareader:

Imports System
Imports System.Data.OleDb

Class MainClass
    Public Shared Sub Main(ByVal args As String())
        Dim con As OleDbConnection = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=")
        con.Open
        Dim cmd As OleDbCommand = New OleDbCommand ("SELECT * FROM T1", con)
        Dim rdr As OleDbDataReader = cmd.ExecuteReader
        While rdr.Read
            Dim f1 As Integer = CType(rdr(0), Integer)
            Dim f2 As String = CType(rdr(1), String)
            Console.WriteLine(f1 & " " & f2)
        End While
        con.Close
    End Sub
End Class

GUI app med datagrid og dataset:

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Drawing
Imports System.Windows.Forms

Namespace DefaultNamespace
    Public Class MainForm
        Inherits Form
        Private dg As DataGrid
        Private save As Button
        Private con As OleDbConnection
        Private da As OleDbDataAdapter
        Private cb As OleDbCommandBuilder
        Private ds As DataSet

        Public Shared Sub Main
            Dim fMainForm As New MainForm
            fMainForm.ShowDialog()
        End Sub

        Public Sub New()
            MyBase.New
            Me.InitializeComponent
        End Sub

        Private Sub InitializeComponent()
            con = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;UserId=admin;Password=")
            con.Open
            da = New OleDbDataAdapter("SELECT * FROM T1", con)
            cb = New OleDbCommandBuilder(da)
            da.UpdateCommand = cb.GetUpdateCommand
            ds = New DataSet
            da.Fill(ds, "T1")
            dg = New DataGrid
            save = New Button
            SuspendLayout
            dg.Location = New Point(50, 50)
            dg.Size = New Size(300, 200)
            dg.SetDataBinding(ds, "T1")
            save.Location = New Point (50, 300)
            save.Size = New Size (100, 25)
            save.Text = "Save"
            AddHandler save.Click, AddressOf SaveClick
            ClientSize = New Size(400, 400)
            Controls.Add(dg)
            Controls.Add(save)
            Text = "Main Form"
            ResumeLayout(false)
        End Sub
       
        Sub SaveClick(ByVal sender As Object, ByVal e As EventArgs)
            da.Update(ds, "T1")
            ds.AcceptChanges
            dg.Refresh
        End Sub
    End Class
End Namespace
Avatar billede dehaas Nybegynder
23. september 2004 - 17:25 #4
Hvordan indsætter jeg så data i min database ?
Avatar billede arne_v Ekspert
23. september 2004 - 17:29 #5
Enten via direkte SQL:

        Dim con As OleDbConnection = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=")
        con.Open
        Dim cmd As OleDbCommand = New OleDbCommand ("INSERT INTO T1 VALUES(123,'ABC')", con)
        cmd.ExecuteNonQuery

eller via DataSet (både snepnets eksempel og mit GUI eksempel opdaterer
faktisk databasen)
Avatar billede arne_v Ekspert
23. september 2004 - 17:29 #6
Direkte SQL kan forbedres via brug af parameters.
Avatar billede dehaas Nybegynder
23. september 2004 - 17:34 #7
er ikke heælt sikker på at jeg forstår dig... jeg har jo ikke en Sql database... men en acces (.mdb) hvad er kommandoerne til at kommunikere med den ?
Avatar billede arne_v Ekspert
23. september 2004 - 17:36 #8
Alle ovenstående eksempler snakker med en Access database !
Avatar billede dehaas Nybegynder
23. september 2004 - 17:51 #9
okay... men så vil jeg meget gerne have en forklaring på følgendekode, som du siger kan bruges til at indsætte data i dabasen...

        Dim con As OleDbConnection = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=")
        con.Open
        Dim cmd As OleDbCommand = New OleDbCommand ("INSERT INTO T1 VALUES(123,'ABC')", con)
        cmd.ExecuteNonQuery
Avatar billede arne_v Ekspert
23. september 2004 - 17:59 #10
Den udfører en SQL kommando:

INSERT INTO T1 VALUES(123,'ABC')

Du kan sagtens bruge SQL kommandoer (ikke at forveksle med SQLServer kommandoer) mod Access.

I et mere realistisk eksempel ville du jo nok indsætte nogle værdier som
kom et sted fra og ikke bare to konstanter.
Avatar billede dehaas Nybegynder
23. september 2004 - 18:13 #11
Okay, så TI er Tabellens navn. og det der står i parantesen er det dre skal sættes ind ? (her bliver ABC sat ind i kollonnen 123) ??
Avatar billede arne_v Ekspert
23. september 2004 - 18:23 #12
Nej.

Tabel T 1har 2 kollonner, 123 bliver læst ind i den første, 'ABC' bliver læst ind i den anden.
Avatar billede arne_v Ekspert
23. september 2004 - 18:24 #13
Du er ny til SQL ?

Prøv og læs de første afsnit her:
  http://www.w3schools.com/sql/default.asp
Avatar billede arne_v Ekspert
23. september 2004 - 18:24 #14
For SELECT evt. her:
  http://www.eksperten.dk/artikler/389
Avatar billede dehaas Nybegynder
23. september 2004 - 19:09 #15
når jeg køre dit program får jeg følgende fejl:

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in system.data.dll

... og den markerer linien

        cmd.ExecuteNonQuery()
Avatar billede arne_v Ekspert
23. september 2004 - 19:12 #16
Har du en tabel T1 med 2 felter ?
Avatar billede arne_v Ekspert
23. september 2004 - 19:12 #17
Eller en tabel med det navn og de felter som du måtte have erstattet den med ?
Avatar billede dehaas Nybegynder
23. september 2004 - 19:36 #18
Har en database der hedder Test.mdb, deti ligger det en tabel, som hedder T1, og deri er to felter som hedder info1 og info 2
Avatar billede arne_v Ekspert
23. september 2004 - 19:37 #19
Og hvilke data typer er de to felter ?
Avatar billede snepnet Nybegynder
23. september 2004 - 19:37 #20
hvor ligger den, og bruger du den her direkte ?
Dim con As OleDbConnection = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=")
Avatar billede dehaas Nybegynder
23. september 2004 - 19:39 #21
Her rettet det til

Dim con As OleDbConnection = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb;User Id=admin;Password=")

Da databasen ligger her : C:\Test.mdb
begge felter er sat til tekst
Avatar billede arne_v Ekspert
23. september 2004 - 19:41 #22
Hvis de begge er tekst, så skal der '' omkring begge værdierne !
Avatar billede dehaas Nybegynder
23. september 2004 - 19:42 #23
så der kommer til at stå

        Dim cmd As OleDbCommand = New OleDbCommand ("INSERT INTO T1 VALUES("123","ABC")", con)
        cmd.ExecuteNonQuery

??
Avatar billede arne_v Ekspert
23. september 2004 - 19:44 #24
single quotes ikke double quotes
Avatar billede arne_v Ekspert
23. september 2004 - 19:45 #25
Dim cmd As OleDbCommand = New OleDbCommand ("INSERT INTO T1 VALUES('123','ABC')", con)
cmd.ExecuteNonQuery
Avatar billede arne_v Ekspert
23. september 2004 - 19:46 #26
Man kan faktisk godt bruge double quotes i databasen, men da VB.NET bruger
double quotes til strenge, så virker det bedst/nemmest/pænest med single quotes
Avatar billede dehaas Nybegynder
23. september 2004 - 19:51 #27
nu ser det sådan ud, men den kommer stadig med fejlen....

        Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb;User Id=admin;Password=")
        con.Open()
        Dim cmd As OleDbCommand = New OleDbCommand("INSERT INTO T1 VALUES('123','ABC')", con)
        cmd.ExecuteNonQuery()
Avatar billede arne_v Ekspert
23. september 2004 - 19:53 #28
Du har vel ikke en primær nøgle og allerede indsat en række med de data ?
Avatar billede dehaas Nybegynder
23. september 2004 - 19:55 #29
der er ingen data, men den er primær, må den ikke det ?
Avatar billede arne_v Ekspert
23. september 2004 - 19:57 #30
Jo.

Men når der er en primær nøgle får man fejl hvis der allerede var indsat en række
med de data.

Men det er jo så ikke tilfældet.
Avatar billede dehaas Nybegynder
23. september 2004 - 19:58 #31
sådan, det var det der var galt... nu virker det... man tak for hjælpen...
Avatar billede snepnet Nybegynder
23. september 2004 - 19:58 #32
hvis du bruger det første eksempel jeg skrev, får du skrevet en fejlmeddelelse ud i konsollen, hvis der er noget der kikser... så kan du se hvad der er galt, eller poste det her, så vi kan give en hånd.
Avatar billede snepnet Nybegynder
23. september 2004 - 19:58 #33
nå hov - kryds der :o)
Avatar billede dehaas Nybegynder
23. september 2004 - 19:58 #34
hvordan søger man så i databasen ?
Avatar billede snepnet Nybegynder
23. september 2004 - 20:01 #35
select * from T1 where info1 = 'etellerandet'
Avatar billede arne_v Ekspert
23. september 2004 - 20:01 #36
Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb;User Id=admin;Password=")
con.Open()
Dim cmd As OleDbCommand = New OleDbCommand("SELECT FROM T1')", con)
Dim rdr As OleDbDataReader = cmd.ExecuteReader
While rdr.Read
    Dim info1 As Integer = CType(rdr(0), Integer)
    Dim info2 As String = CType(rdr(1), String)
    ' gør noget med data
End While

henter alle rækker
Avatar billede arne_v Ekspert
23. september 2004 - 20:02 #37
Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb;User Id=admin;Password=")
con.Open()
Dim cmd As OleDbCommand = New OleDbCommand("SELECT FROM T1 WHERE info2='ABC')", con)
Dim rdr As OleDbDataReader = cmd.ExecuteReader
While rdr.Read
    Dim info1 As Integer = CType(rdr(0), Integer)
    Dim info2 As String = CType(rdr(1), String)
    ' gør noget med data
End While

henter alle rækker hvor info2 er 'ABC'
Avatar billede arne_v Ekspert
23. september 2004 - 20:03 #38
Og der fik jeg vist ikke rettet rigtigt til. De 2 kommandoer skal være:

Dim cmd As OleDbCommand = New OleDbCommand("SELECT FROM T1", con)

Dim cmd As OleDbCommand = New OleDbCommand("SELECT FROM T1 WHERE info2='ABC'", con)
Avatar billede dehaas Nybegynder
23. september 2004 - 20:09 #39
hvorfor kommer den med en fejl når jeg skriver således ?

        Dim fornavn As String = TextBox1.Text
        Dim efternavn As String = TextBox2.Text


        Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb;User Id=admin;Password=")
        con.Open()
        Dim cmd As OleDbCommand = New OleDbCommand("INSERT INTO T1 VALUES(fornavn,efternavn)", con)
        cmd.ExecuteNonQuery()
Avatar billede arne_v Ekspert
23. september 2004 - 20:11 #40
Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb;User Id=admin;Password=")
        con.Open()
        Dim cmd As OleDbCommand = New OleDbCommand("INSERT INTO T1 VALUES('" + fornavn + "','" + efternavn + "')", con)
        cmd.ExecuteNonQuery()
Avatar billede arne_v Ekspert
23. september 2004 - 20:12 #41
(og når du føler at du har lidt styr på den slags INSERT så bør du kigge på
Parameters)
Avatar billede dehaas Nybegynder
23. september 2004 - 20:15 #42
får stadig en fejl

        Dim fornavn As String = TextBox1.Text
        Dim efternavn As String = TextBox2.Text


        Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb;User Id=admin;Password=")
        con.Open()
        Dim cmd As OleDbCommand = New OleDbCommand("INSERT INTO T1 VALUES(" + fornavn + "','" + efternavn + "')", con)
        cmd.ExecuteNonQuery()
Avatar billede arne_v Ekspert
23. september 2004 - 20:17 #43
Der mangler en single quote foran fornavn
Avatar billede dehaas Nybegynder
23. september 2004 - 20:17 #44
hah... ups hvade jeg ikke lige set...
Avatar billede arne_v Ekspert
23. september 2004 - 20:17 #45
Dim cmd As OleDbCommand = New OleDbCommand("INSERT INTO T1 VALUES('" + fornavn + "','" + efternavn + "')", con)
Avatar billede dehaas Nybegynder
23. september 2004 - 20:18 #46
hvordan får jeg så mine data vist i et datagrid ?
Avatar billede arne_v Ekspert
23. september 2004 - 20:22 #47
Se min 17:09:01 kode (som tilfældigvis bruger samme tabel)
Avatar billede dehaas Nybegynder
23. september 2004 - 20:36 #48
får denne fejl når jeg køre dette program :

The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.

        Dim soeg As String = textbox3.text
        Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\Christopher de Haas\My Documents\Visual Studio Projects\app1\WindowsApplication1\Test.mdb;User Id=admin;Password=")
        con.Open()
        Dim cmd As OleDbCommand = New OleDbCommand("SELECT FROM T1 WHERE info2='" + soeg + "'", con)
        Dim rdr As OleDbDataReader = cmd.ExecuteReader
        While rdr.Read
            Dim info1 As Integer = CType(rdr(0), Integer)
            Dim info2 As String = CType(rdr(1), String)
            MsgBox(info1 & info2)
        End While
Avatar billede arne_v Ekspert
23. september 2004 - 20:45 #49
Min fejl.

Der mangler en stjerne !

Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM T1 WHERE info2='" + soeg + "'", con)
Avatar billede dehaas Nybegynder
23. september 2004 - 20:49 #50
hvorfor kan jeg ikke dim'me info1 som String itedetfor info2 ?
Avatar billede arne_v Ekspert
23. september 2004 - 20:51 #51
Felterne skal naturligvis olaves til de rigtige typer (mit oprindelige eksempel
havde et integer felt og et string felt)
Avatar billede dehaas Nybegynder
23. september 2004 - 20:52 #52
skulle det ikke virker sådanhar ?, når det i databasen er tekst i begge felter ?

        Dim soeg As String = textbox3.text
        Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\Christopher de Haas\My Documents\Visual Studio Projects\app1\WindowsApplication1\Test.mdb;User Id=admin;Password=")
        con.Open()
        Dim cmd As OleDbCommand = New OleDbCommand("SELECT FROM T1 WHERE info2='" + soeg + "'", con)
        Dim rdr As OleDbDataReader = cmd.ExecuteReader
        While rdr.Read
            Dim info1 As Integer = CType(rdr(0), Integer)
            Dim info2 As String = CType(rdr(1), String)
            MsgBox(info1 & info2)
        End While
Avatar billede arne_v Ekspert
23. september 2004 - 20:54 #53
Så skal det vel være:

        While rdr.Read
            Dim info1 As String = CType(rdr(0), String)
            Dim info2 As String = CType(rdr(1), String)
            MsgBox(info1 & info2)
        End While
Avatar billede dehaas Nybegynder
23. september 2004 - 20:56 #54
nå jo var selfnogså det der skulle have stået, men så kommer dem igen med fejl
Avatar billede dehaas Nybegynder
23. september 2004 - 20:57 #55
nej nu virker det.. sorry
Avatar billede dehaas Nybegynder
23. september 2004 - 21:00 #56
hvordan opdatere man informationerne i en datagrid ?
Avatar billede arne_v Ekspert
23. september 2004 - 21:04 #57
Kig på min SaveClick sub
Avatar billede arne_v Ekspert
23. september 2004 - 21:04 #58
Og nu vil jeg ligge et svar
Avatar billede dehaas Nybegynder
23. september 2004 - 21:05 #59
fatter jeg ikke... er det ikke en kommando ? DataGridView1.??????
Avatar billede dehaas Nybegynder
23. september 2004 - 21:06 #60
forresten, mange tak for hjælpen
Avatar billede arne_v Ekspert
23. september 2004 - 21:10 #61
da.Update(ds, "T1") // gem ændrede data i databasen
            ds.AcceptChanges // nulstil ændringer så næste også kun gemmer ændringer
            dg.Refresh // refresh data
Avatar billede arne_v Ekspert
23. september 2004 - 21:10 #62
da.Update(ds, "T1") ' gem ændrede data i databasen
ds.AcceptChanges ' nulstil ændringer så næste også kun gemmer ændringer
dg.Refresh ' refresh data
Avatar billede dehaas Nybegynder
23. september 2004 - 21:12 #63
så skal dg da erklæres først, kan du ikke skrive præcist hvad du har skrevet ?
Avatar billede arne_v Ekspert
23. september 2004 - 21:14 #64
Begge kode eksemplerne i 23/09-2004 17:09:01 er testet kode !

(dg er en instans variabel i klassen)
Avatar billede arne_v Ekspert
23. september 2004 - 21:15 #65
Jeg tog kun de 3 linier ud for at forklare hvad de gør.
Avatar billede dehaas Nybegynder
23. september 2004 - 21:15 #66
kan ikke få den til at opdate sit datagrid efter jeg har tilføjet data til databasen !!
Avatar billede dehaas Nybegynder
23. september 2004 - 21:18 #67
skal man ikke lukke databsen efter mna har tilføjet data ? ligesaom man skal med filer
Avatar billede arne_v Ekspert
23. september 2004 - 21:20 #68
Jo enten eksplicit med en save button som i mit eksempel eller ved
at putte samme kode i formens close event.
Avatar billede arne_v Ekspert
23. september 2004 - 21:20 #69
Når du er helt færdig kalder du bare:

con.Close
Avatar billede snepnet Nybegynder
02. oktober 2004 - 02:32 #70
nå - jeg lægger også et svar hvis hvis noget af det jeg skrev gjorde nytte, men er du færdig dehaas, eller driller det stadig ?
mvh
Avatar billede arne_v Ekspert
02. oktober 2004 - 10:05 #71
Jeg vil da også ligge et svar her så
Avatar billede arne_v Ekspert
17. oktober 2004 - 18:20 #72
dehaas>

Tid at få afsluttet spørgsmålet ?
Avatar billede arne_v Ekspert
24. oktober 2004 - 21:57 #73
??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester