Avatar billede sbkrem Nybegynder
23. juli 2004 - 21:34 Der er 21 kommentarer og
1 løsning

Køre sql-sætning, men hvordan?

Jeg har nogle data som skal indsættes i en tabel via SQL.
Jeg har styr på SQL og kan da også connecte OleDbConnection1 til min Access-database, men hvad gør' jeg så derfra?
Avatar billede arne_v Ekspert
23. juli 2004 - 21:36 #1
Noget a la:

OleDbCommand ins = new OleDbCommand("INSERT INTO tabelnavn VALUES(123, 'abc')", con);
ins.ExecuteNonQuery();
Avatar billede arne_v Ekspert
23. juli 2004 - 21:37 #2
Sorry.

Dim ins As OleDbCommand = new OleDbCommand("INSERT INTO tabelnavn VALUES(123, 'abc')", con)
ins.ExecuteNonQuery()

forkert sprog !
Avatar billede sbkrem Nybegynder
23. juli 2004 - 21:53 #3
Den siger at "OleDbCommand" ikke er defineret.
Jeg har også smidt en OleDbCommand1 ind i projektet.
Avatar billede arne_v Ekspert
23. juli 2004 - 21:55 #4
Må jeg lige se lidt kode ?

(og du har taget min VB.NET kode 21:37 og ikke C# koden 21:36)
Avatar billede sbkrem Nybegynder
23. juli 2004 - 22:03 #5
Ja, men projektet er egenligt meget simpelt. Det eneste jeg har gjort er at indsætte OleDbConnection1, OleDbCommand1 og en Button1, som du ser koden for nedenfor (din kode). OleDbConnection1 er endvidere connected til databasen.


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim ins As OleDbCommand = New OleDbCommand("INSERT INTO tabelnavn VALUES            (123, 'abc')", con)

ins.ExecuteNonQuery()

End Sub
Avatar billede arne_v Ekspert
23. juli 2004 - 22:04 #6
con skal være  OleDbConnection1
Avatar billede arne_v Ekspert
23. juli 2004 - 22:04 #7
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim ins As OleDbCommand = New OleDbCommand("INSERT INTO tabelnavn VALUES            (123, 'abc')", OleDbConnection1)

ins.ExecuteNonQuery()

End Sub
Avatar billede arne_v Ekspert
23. juli 2004 - 22:05 #8
Og du skal nok lige checke INSERT sætningen. Mit eksmepel forudsætter 2
felter: et tal og et tekst. Og tabelnavn skal vel også rettes.
Avatar billede sbkrem Nybegynder
23. juli 2004 - 22:08 #9
Ok, men OleDbCommand er stadigvæk ikke defineret.
Avatar billede arne_v Ekspert
23. juli 2004 - 22:10 #10
Har du importeret System.Data.OleDb ?

Ellers skriv:

Dim ins As System.Data.OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand(
Avatar billede sbkrem Nybegynder
23. juli 2004 - 22:41 #11
Der er fejl ved:  ins.ExecuteNonQuery()

Den skriver at:
An unhandled exception of type 'System.InvalidOperationException' occurred in system.data.dll

Additional information: ExecuteNonQuery kræver en åben og tilgængelig Connection. Forbindelsens aktuelle tilstand er Closed.
Avatar billede arne_v Ekspert
23. juli 2004 - 22:46 #12
Den fejl er jo helt klar.

Du har ikke kaldt:

OleDbConnection1.Open

eller hvis du har kaldt den, så har du kaldt:

OleDbConnection1.Close

bagefter.
Avatar billede sbkrem Nybegynder
23. juli 2004 - 22:57 #13
Ja, så lykkedes det at indsætte en enkel record. Hvis jeg trykker på knappen igen fremkalder det en fejl.

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

Noget jeg mangler i koden?

Min kode er nu således under Button1:

Dim ins As System.Data.OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand("INSERT INTO Spillere VALUES (123, 'abc')", OleDbConnection1)

OleDbConnection1.Open()
ins.ExecuteNonQuery()
OleDbConnection1.Close()
Avatar billede sbkrem Nybegynder
23. juli 2004 - 22:59 #14
Tabellen er med 2 kolonner - Autonummer og Tal - så det er ikke her den er gal.
Avatar billede sbkrem Nybegynder
23. juli 2004 - 23:00 #15
Undskyld, Autonummer og Tekst mente jeg naturligvis :)
Avatar billede arne_v Ekspert
23. juli 2004 - 23:02 #16
Hm. Får du ikke mere fejl meddelelse.

Et gæt kunne være at flytte

OleDbConnection1.Open()

op over

Dim ins As System.Data.OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand("INSERT INTO Spillere VALUES (123, 'abc')", OleDbConnection1)
Avatar billede arne_v Ekspert
23. juli 2004 - 23:02 #17
Eller endnu bedre:
  - flyt open kaldet op liger under der hvor du laver OleDbConnection1
  - slet close kaldet
Avatar billede sbkrem Nybegynder
23. juli 2004 - 23:18 #18
Har forsøgt alle kombinationer af de 3 linier, men de virker ikke. Siden det lykkedes at sætte en record ind, har der været fejl. Access er i øvrigt ikke åben, så her er den heller ikke gal. Jeg får samme fejl og der står ikke mere end det jeg skrev.

Du kan evt. maile et forslag, hvis det virker hos dig, så jeg kan se om der er forskelle.

Når det virker, skal det kunne klare 25 indsættelser på en gang, så det må helst ikke give fejl efter første indsættelse.
Avatar billede arne_v Ekspert
23. juli 2004 - 23:20 #19
Hov.

Er det første felt prmær nøgle ?

Hvis ja, så skal du jo indsætte forskellige tal !
Avatar billede sbkrem Nybegynder
23. juli 2004 - 23:35 #20
Hehe, ja det var det - så nu virker det :-))

Tusind for svaret.

Skal lige høre, er det smart at gøre det på denne måde, hvis det kaldes 20-25 gange i en enkelt operation? Jeg ved at jeg kan sammensætte et sql-udtryk med alle poster, men er det mest effektivt?
Avatar billede arne_v Ekspert
23. juli 2004 - 23:37 #21
Det er OK performance mæssigt.

Undlad at kalde Open og Close for hver gang. Kun Open når connection oprettes.
Kun Close når programmet lukkes.

Du kan overveje at bruge parametre for at håndtere situationer med single quotes
i den tekst der skal indsættes.
Avatar billede sbkrem Nybegynder
23. juli 2004 - 23:45 #22
Ok, endnu engang tak.
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