[VB.NET] Update Query op Access Database

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Hallo,

Ik kan de select query van hieronder perfect uitvoeren maar de update query lukt niet meer. Alles wat erna komt in deze functie wordt niet meer uitgevoerd vanaf myUpdateCommand.executenonquery.

Het lijkt dat hij hier uit de functie vliegt en heeft de update ook niet doorgevoerd.

Hieronder de code:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 Dim antwoordgebr As String = ""
            Dim antwoord As String = ""
            Dim antwoord2 As String = ""
            Dim verbindingsString As String = _
                    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\TrivialPursuit.accdb"

            Dim verbinding As New OleDb.OleDbConnection(verbindingsString)

            verbinding.Open()

            Dim opdracht As New OleDb.OleDbCommand("SELECT TOP 1 tblVragen.ID, tblCategorie.Categorie, tblVragen.Vraag, tblVragen.A1, tblVragen.A2 FROM tblCategorie INNER JOIN tblVragen ON tblCategorie.ID = tblVragen.Categorie where tblCategorie.kleur = '" & categorie & "' Order by Rnd(-10000000*TimeValue(Now())*tblVragen.ID);", _
            verbinding)


            Dim dataLezer As OleDb.OleDbDataReader = _
            opdracht.ExecuteReader
            'lstAllusers.Show()

            While dataLezer.Read
                'MessageBox.Show(dataLezer.Item("Vraag"))

                antwoordgebr = InputBox(dataLezer.Item("Vraag"), "Vraag over" & dataLezer.Item("Categorie"))
                antwoord = dataLezer.Item("A1")
                antwoord2 = dataLezer.Item("A2")

            End While

            Dim myUpdateCommand As OleDb.OleDbCommand

            myUpdateCommand = New OleDb.OleDbCommand("Update tblVragen Set gesteld=1 where ID=2", verbinding)
            myUpdateCommand.ExecuteNonQuery()


Dit is normaal de manier waarop je een update query doet, althans beschreven op het internet. Toch lukt het mij nog steeds niet om deze werkende te krijgen.

Acties:
  • 0 Henk 'm!

  • Kishi
  • Registratie: Juni 2007
  • Laatst online: 31-08 23:18
Hoe bedoel je "Het lijkt dat hij hier uit de functie vliegt"? Krijg je een exception?

Ook is het best practise om je connection pas te openen wanneer je hem nodig hebt, en te sluiten wanneer je hem niet meer nodig hebt. Kwestie van je resources vrijgeven, en je DB niet onnodig te belasten.

Ik zie je verbinding.Close() ook niet staan, maar dat kan natuurlijk zijn omdat je dat stukje net niet erbij hebt gezet.

[ Voor 9% gewijzigd door Kishi op 10-05-2009 15:36 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:51

Haan

dotnetter

Ik heb ook een progje dat iets doet met een Acces database, maar die werkt toch anders. Kijk maar eens naar onderstaande code (wel in C#, en bepaalde onderdelen weggehaald).
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public void Execute()
{
    // .. 

    using (OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\MyDocuments\Boekhouding.accdb"))
    {
        connection.Open();
        OleDbCommand cmd = new OleDbCommand(CreateTable(tableName), connection);
        cmd.ExecuteNonQuery();
        OleDbDataAdapter adapter = CreateDataAdapter("SELECT * FROM " + tableName, connection);
        DataSet dataSet = new DataSet();

        adapter.Fill(dataSet, tableName);

        DataRow newRow = dataSet.Tables[tableName].NewRow();
        //vull newRow met data, bijvoorbeeld column0 is pk en column1 is voornaam                
        newRow[0] = 1;
        newRow[1] = "Henk";
        dataSet.Tables[tableName].Rows.Add(newRow);

        adapter.Update(dataSet, tableName);

        connection.Close();
     }

    // ..
}

public OleDbDataAdapter CreateDataAdapter(string selectCommand, OleDbConnection connection)
{
    OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand, connection);
    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
    adapter.InsertCommand = builder.GetInsertCommand();
    adapter.UpdateCommand = builder.GetUpdateCommand();

    return adapter;
}


Je voert dus niet direct een update query uit, maar je vult een dataset met nieuwe data en voert daar een Update() op uit. De CreateTable method is in mijn geval ook zelf geschreven en bevat een sql statement om een tabel met aantal kolommen te maken, maar je kan natuurlijk ook een bestaande tabel uit de database opvragen :)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:04
Volgens mij moet je je DataReader sluiten vooraleer je die update query uitvoert; je gebruikt nl. dezelfde connection.
Als ik het me nog goed herinner, moet een DataReader exclusieve access hebben tot de connectie. Volgens mij krijg je dus idd een exception.

Zowiezo moet je die reader sluiten/disposen als je 'm niet meer nodig hebt.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Zowiezo kun je het probleem gewoon makkelijk achterhalen door eens een break-point aan het begin van je methode te zetten en er doorheen te stappen. Je krijgt dan vanzelf ergens een Exception als er iets fout gaat, en daar staat meestal gewoon in wat je fout doet. ( Debuggen: Hoe doe ik dat? )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”