Avatar billede _petrucci Nybegynder
04. juni 2002 - 13:44 Der er 20 kommentarer og
1 løsning

Flere SQL inserts

Ok, har et lidt tricky problem som jeg skal bruge lidt hjælp til.

Vi har en SQL Server database med tabellen "SAGER". Nu vil min kollega så indsætte et bestemt antal sager fra hans Visual Basic program, der så henter en ASP side der laver et INSERT statement.

Problemet er at hvis han vil tilføje f.eks. 3 sager på samme tid (dvs. den sender 3 forskellige rækker af data afsted lige efter hinanden) så bliver der kun indsat 1 række i tabellen, hvilket er den sidst afsendte sag.

Det er som om den bliver hængende i ASP-siden og ikke får lavet en form for "save and go to next row". Han sender alle disse data via en form post i hans program.

Nogen der har en idé til hvordan dette kan løses?

Her lidt kode:

Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open "DRIVER=SQL Server;SERVER=servernavn;UID=id;PWD=etpassword;DATABASE=dbnavn;"

SQL = "INSERT INTO SAGER (VIRK_ID, HOVEDSAGSNR, UNDERSAGSNR, SAGSNAVN, ARBEJDSADRESSE, KUNDE, ARBEJDSBESKRIVELSE) values('" & Request("virk_id") & "', '" & Request("hovedsagsnr") & "', '" & Request("undersagsnr") & "', '" & Request("sagsnavn") & "', '" & Request("arbejdsadresse") & "', '" & Request("kunde") & "', '" & Request("arbejdsbeskrivelse") & "') "

myConn.Execute( SQL )
response.redirect ("loginstatus.asp?mode=godkendt")
myConn.Close
Avatar billede -master-d- Nybegynder
04. juni 2002 - 13:52 #1
Man er vel nød til at lave tre insert-statements.

altså sag.1

SQL = "INSERT INTO SAGER (VIRK_ID, HOVEDSAGSNR, UNDERSAGSNR, SAGSNAVN, ARBEJDSADRESSE, KUNDE, ARBEJDSBESKRIVELSE) values('" & Request("virk_id") & "', '" & Request("hovedsagsnr") & "', '" & Request("undersagsnr") & "', '" & Request("sagsnavn") & "', '" & Request("arbejdsadresse") & "', '" & Request("kunde") & "', '" & Request("arbejdsbeskrivelse") & "') "

myConn.Execute( SQL )

sag.2

SQL = "INSERT INTO SAGER (VIRK_ID, HOVEDSAGSNR, UNDERSAGSNR, SAGSNAVN, ARBEJDSADRESSE, KUNDE, ARBEJDSBESKRIVELSE) values('" & Request("virk_id") & "', '" & Request("hovedsagsnr") & "', '" & Request("undersagsnr") & "', '" & Request("sagsnavn") & "', '" & Request("arbejdsadresse") & "', '" & Request("kunde") & "', '" & Request("arbejdsbeskrivelse") & "') "

myConn.Execute( SQL )

......

Ikk' ellers er det jo netop den sidste der bliver indsat i en række.
Avatar billede _petrucci Nybegynder
04. juni 2002 - 13:57 #2
Jo men vi ved ikke hvor mange sager, der bliver tilføjet hver gang. Det kan være lige fra 1 - mange sager, alt efter hvad han vælger i programmet :/
Avatar billede -master-d- Nybegynder
04. juni 2002 - 13:59 #3
øhhmmm... så ved jeg ikke lige hvad jeg skal stille op.
Avatar billede _petrucci Nybegynder
04. juni 2002 - 14:01 #4
Yep det er en tricky situation :)  Har dog fået at vide at der er noget galt med ASP'en såå....:/
Avatar billede _petrucci Nybegynder
04. juni 2002 - 14:15 #5
Hvis jeg f.eks. kører myConn.Execute( SQL )  3 gange i asp-filen, indsætter den også bare den sidste sagspost 3 gange i tabellen.

Det virker lidt som om at der er en session der skal afsluttes eller at formen skal resettes eller noget i den stil. Anyone?
Avatar billede tmceu Praktikant
04. juni 2002 - 14:16 #6
Jeg vil foreslå at I bare sender alle INSERT statements afsted i en lang strøm, separeret med semikolon;

SQL variablen vil således eks indeholde "INSERT INTO..VALUES(...);INSERT INTO..VALUES(...);INSERT INTO..VALUES(...);" Denne er totalt dynamisk og SQL Server finder selv ud af at behandle dem enkeltvis.
Avatar billede _petrucci Nybegynder
04. juni 2002 - 14:33 #7
jo men hvordan får man lavet asp-koden så den laver X antal insert-statements efter hinanden?

Han trykker jo bare på en knap i hans program, så sender den alle sager afsted i én køre - f.eks. 3 rækker med data. Problemet er netop at den kører asp-filen igennem med første sagsrække, og derefter kører samme asp-fil igennem med anden sagsrække osv.osv. :/
Avatar billede tmceu Praktikant
04. juni 2002 - 14:36 #8
Det er det, det er hele idéen. Der skal kun laves én myConn.Execute(SQL), uanset antallet af INSERT i SQL strengen :-)
Avatar billede tmceu Praktikant
04. juni 2002 - 14:38 #9
Hvis du eks. har adgang til SQL Server Query Analyzer, kan du teste, hvordan den behandler flere statements adskilt med semikolon, eks. med denne:

SELECT getdate();SELECT getdate();SELECT getdate();

Læg mærke til, at du får 3 seperate resultater tilbage, da den aut. udfører hvert enkelt statement.
Avatar billede _petrucci Nybegynder
04. juni 2002 - 14:38 #10
Jo, men jeg kan stadig ikke vide hvor mange INSERTs der er brug for i koden :) Som sagt varierer antallet af Sager hver gang.
Avatar billede tmceu Praktikant
04. juni 2002 - 14:59 #11
Enten snakker vi forbi hinanden, eller også har en af os ikke fattet en brik :-)

Som jeg forstår dit spørgsmål, er det VB applikationen, der ved hvor mange sager der skal oprettes ?

VB applikationen poster data til din ASP side, der sørger for at indsætte det i databasen ?

Hvis dette er korrekt er det, med mit forslag, hamrende ligegyldigt hvor mange INSERTS der i i den parameter/SQL streng som sendes fra VB applikationen. ASP siden skal uanset hvad, kun udføre én Execute. SQL Server finder selv ud af, om der er en, ti eller x INSERTS i den streng der kommer med.
Avatar billede _petrucci Nybegynder
04. juni 2002 - 15:10 #12
VB applikationen sender sådan set ikke nogen INSERT strenge afsted - den fungerer faktisk bare som en Form med method=post, der sender variabler og værdier direkte til ASP-siden som så finder dem med standard Request("virk_id") kommandoer - det gør den så bare X antal gang efter hinanden :)

Kender ikke selv ret meget til VB applikationen men sådan forklarede min kollega det bare til mig :)
Avatar billede _petrucci Nybegynder
04. juni 2002 - 15:28 #13
myConn.execute(SQL)  kører INSERT strengen, men det er ligesom der mangler en "gem" kommando, der endegyldigt gemmer posten og derefter bevæger sig videre
Avatar billede tmceu Praktikant
04. juni 2002 - 15:40 #14
Kunne du ikke prøve at vise hele din ASP kode og også meget gerne et eksempel på den parameter du får fra VB applikationen. Jeg forstår ikke helt hvordan I overfører parametre mellem VB og ASP.

Hvis det ikke kommer i en samlet masse, men derimod som flere kald efter hinanden, burde det principielt være seperate instancer af ASP koden der kører.
Avatar billede _petrucci Nybegynder
04. juni 2002 - 15:57 #15
Her er noget fra VB applikationen som bliver brugt til at sende sagsdata ud til asp-filen:

URL = "http://asp-filnavnet.asp"
Flags = 0
Headers = "Content-type: application/x-www-form-urlencoded" & vbcrlf

while not rsProject.eof
data = "virk_id=100320&"
data = data & hovedsagsnr=" & rsProjcet!Project & "&"
osv.

debug.print vbcrlf
debug.print data
postdata = data
postdata = strConv(Postdata, vbFromUnicode)
bNavigating = True

Webbrowser1.Navigate URL, Flags, Postdata, Headers
While Webbrowser1.Busy ' vent til url er fundet
Wend
bNavigating = False

rsProject.Movenext
Avatar billede _petrucci Nybegynder
04. juni 2002 - 15:58 #16
Hele ASP-koden står faktisk i det første indlæg fra min side :)
Avatar billede tmceu Praktikant
04. juni 2002 - 17:41 #17
Som det ser ud nu, laver den faktisk et kald til ASP filen for hver post i rsProject i VB applikationen. Dermed vil ASP filen aldrig skulle behandle mere end ét INSERT statement.

Jeg ville ændre VB applikationen til dette:

URL = "http://asp-filnavnet.asp"
Flags = 0
Headers = "Content-type: application/x-www-form-urlencoded" & vbcrlf

postdata = ""

while not rsProject.eof

data = "INSERT INTO...VALUES.... o.s.v. ' her opbygges SQL statement

'data = "virk_id=100320&"
'data = data & hovedsagsnr=" & rsProjcet!Project & "&"
'osv.

debug.print vbcrlf
debug.print data
' opbyg en streng med alle INSERT statements
postdata = postdata & strConv(data, vbFromUnicode) & ";"

rsProject.Movenext


bNavigating = True

Webbrowser1.Navigate URL, Flags, Postdata, Headers
While Webbrowser1.Busy ' vent til url er fundet
Wend
bNavigating = False

Dermed laver du kun et kald af ASP filen, kun et database kald fra ASP filen. Dette er meget mere effektivt.

Samtidig kan du ændre ASP filen til dette:

Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open "DRIVER=SQL Server;SERVER=servernavn;UID=id;PWD=etpassword;DATABASE=dbnavn;"

myConn.Execute( Request.("[SQL INSERT statement fra VB]" )
response.redirect ("loginstatus.asp?mode=godkendt")
myConn.Close
Avatar billede _petrucci Nybegynder
04. juni 2002 - 18:17 #18
Ok, det vil jeg da lige prøve at ændre imorgen engang - vender tilbage med en update imorgen :)
Avatar billede tmceu Praktikant
07. juni 2002 - 19:11 #19
Imorgen er nu i forgårs :-) Af nysgerrighed: fik du løst problemet ?
Avatar billede _petrucci Nybegynder
10. juni 2002 - 10:05 #20
I know ;)

Grunden til mit afventende svar var at min kollega ikke har haft tid til at kigge på det før nu. Han mener det sikkert vil virke, men er lidt bekymret for vores stakkels sql server, idet det kan hænde at man skal overføre op til 100+ sager ad gangen ;)

Det bliver jo noget af en djævelsk insert-statement der bliver fyret af. Men løsningen er brugbar så det takker jeg for :)
Avatar billede tmceu Praktikant
10. juni 2002 - 10:13 #21
Det var så lidt :-)

Jeg ville ikke være bekymret for SQLServer'en, i min virksomhed har vi 20+ SQL Servere og de klarer hver dag ting der er meget værre end dette :-)
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