Oprettet ons. d. 19. oktober 2011 kl. 10:54:19

angelenglen
angelenglen (7.306 point. Point ude: 200)

MS SQL Fejl ved mange updates, men ingen fejlbesked

Jeg har et ASP-script der genererer nogle SQL updates, i stil med:

UPDATE items SET name="abc" WHERE id=1;
UPDATE items SET name="def" WHERE id=2;
UPDATE items SET name="ghi" WHERE id=3;

osv osv - op til omkring 5000 linjer.
- alt samles i en variabel, og executes samlet på én gang.

Når jeg er over ca. 100 linjer fejler - men uden jeg får en fejl - det ligner alting er udført korrekt, det tager også længere tid jo flere linjer jeg har med.

Jeg har også prøvet at sætte en tæller ind, og fyre linjerne af i "batches" af fx 100 eller 500 linjer, den melder stadig ingen fejl, men udfører ikke ændringerne i databasen.

- dvs. det ligner at alt udføres korrekt, men når jeg kigger i databasen, er værdierne ikke updated som de skal være.

Hvis jeg outputter mine linjer på siden, og kopierer dem ind i Microsoft SQL Management Studio og udfører dem derfra, bliver de udført korrekt, og databasen opdateres som den skal.
DVS. det er ikke selve mine update-sætninger den er gal med.

Men jeg får ingen fejl! Jeg forstår det ikke - hvordan kan jeg fejlfinde på den slags?

Skrevet ons. d. 19. oktober 2011 kl. 11:03:28| #1

kalp
kalp (244.223 point)
Ja, men du har kunne konkludere at det ikke er dit SQL den er gal med og alligevel er det eneste kode du viser 3 linjers SQL:)

Er det klassisk ASP eller ASP.NET du benytter?
og har du sikret dig der overhovedet er en forbindelse igennem til databasen?

Hvis noget kode evt.

Start altid småt.. se at der er forbindelse til databasen.. indsæt en række eller opdater en række og udvid derefter din kode.

Skrevet ons. d. 19. oktober 2011 kl. 11:40:17| #2

buzzzz
buzzzz (48.826 point)
ifyoudo.net
UPDATE items SET name="ghi" WHERE id=3;
er ikke sql ... de bruger single quotes.

Ved ikke med MySql.

Hvorfor bruger du ikke "MERGE" hvis det er MSSQL 2008?

Måske timeout ... hvor lang tid tager din statement om at køre?
Timeout i SSMS er vist nok unlimited.

Er der andre ting du synes vi burde vide om dit setup? Sql version, web server, timeout settings?

Du får helt sikkert en exception eller noget. Men måske noget i system sluger den.

mvh

Skrevet ons. d. 19. oktober 2011 kl. 11:50:21| #3

angelenglen
angelenglen (7.306 point)
beklager, skrev " i stedet for ' da jeg skrev dem her, men min pointe var egentligt bare at vise at det var en række updates, og at deres individuelle syntax var korrekt.

Merge - den kender jeg ikke - kan du forklare lidt om hvad den gør, og hvordan jeg bruger den?

- og det er classic ASP, jeg opretter min forbindelse som:

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "database_dsn","web_user","p@ssw0rd"
Conn.CommandTimeout=300

og udfører SQL'en som:

Conn.execute(SQL)

- og sql er en string-variabel, der indeholder alle disse updates.

CommandTimeout var noget jeg satte på i håb om at løse problemet, men det ændrede ikke noget.

Skrevet ons. d. 19. oktober 2011 kl. 12:12:26| #4

buzzzz
buzzzz (48.826 point)
ifyoudo.net
Men hvor lang tid tager den update ?

Her kan du læse om MERGE: http://technet.microsoft.com/ (...)

Har aldrig brugt classic ASP, så har ingen ide om hvordan den smider rundt om sig med exception etc.

mvh

Skrevet ons. d. 19. oktober 2011 kl. 12:17:24| #5

angelenglen
angelenglen (7.306 point)
Hvis jeg fyrer alle 5000 af, tager det ca. 30-45 sekunder.
Ved 500 tager det få sekunder.
100 er næsten instant.

Har lige kigget lidt på Merge, tror det er overkill.

Skrevet ons. d. 19. oktober 2011 kl. 12:27:52| #6

kalp
kalp (244.223 point)
prøv lige en af disse SQL connections:
http://www.sqlstrings.com/ (...)

som du kan se angiver de provider/driver og det skal du måske også gøre.

nr. 2 er decideret til MSSQL

Skrevet ons. d. 19. oktober 2011 kl. 12:30:35| #7

kalp
kalp (244.223 point)
Jeg går ud fra du også lukker din forbindelse efter du har udført din SQL?
Du viser det ikke i dit eksempel, men det skal du også sørge for.

Skrevet ons. d. 19. oktober 2011 kl. 12:52:44| #8

angelenglen
angelenglen (7.306 point)
Jeg har prøvet connection nummer to, det ændrede ingenting :-/

Jeg lukker altid forbindelsen, men hvad skulle der ske hvis jeg ikke gjorde?
Linjen der ikke kom med er:
Conn.Close()

Egentligt burde forbindelsen jo dø når IIS har behandlet ASP-scriptet færdigt.

Skrevet ons. d. 19. oktober 2011 kl. 13:01:03| #9

kalp
kalp (244.223 point)
men så er din forbindelse okay.
Det er nok ikke tilladt at updatere flere rækker via. klassisk ASP på den måde.

kan du ikke benytte UpdateBatch:
http://msdn.microsoft.com/ (...)

Skrevet ons. d. 19. oktober 2011 kl. 13:05:53| #10

angelenglen
angelenglen (7.306 point)
Det ér tilladt at køre flere updates på den måde, fx 50 updates går glat igennem.

I bund og grund er jeg efterhånden bare ude efter en måde at finde årsagen til at det fejler - for conn-objektet fejler ikke execute-kommandoen.

Normalt hvis jeg fx har skrevet "SLECT" i stedet for "SELECT" får jeg en fejlbesked, og så stopper ASP scriptet - men her kører det bare videre som om intet var galt.

Eftersom jeg jo ikke får nogen fejl ud i ASP-scriptet, gætter jeg på at fejlfindingen skal fortsætte serverside, men jeg har ingen anelse om hvor jeg skal lede :-/
- der står eksempelvis intet i Windows' event-log.

Skrevet ons. d. 19. oktober 2011 kl. 13:06:08| #11

kalp
kalp (244.223 point)
Derfor kan man sige at din egen kode også burde fungere hvis du affyre én update statement af gangen.

Ud fra din første kommentar skrev du ikke noget om du har prøvet det, men at du blot lavede mindre grupper.. og det vil ikke fungere.

Skrevet ons. d. 19. oktober 2011 kl. 13:14:10| #12

kalp
kalp (244.223 point)
Hvis du tror det er server side så kan du se hvad der sker på SQL serveren om ikke andet.
Hvis altså du har SQL management installeret:)
Du kan følge med i præcist hvad der kommer ind på SQL serveren på den måde og evt. se fejl.

Skrevet ons. d. 19. oktober 2011 kl. 13:15:03| #13

buzzzz
buzzzz (48.826 point)
ifyoudo.net
Om MERGE er overkill ... nej, den er netop lavet til dette og er 10000000000000000 gange hurtigere hvis dine Indexes er rigtige.

Jeg har noget hvor jeg laver bacthes af ca. 3-5000 ... og de er nærmest instant. Dvs max 1-2 sek, men det kommer selvf også an på hvad hardware der er bag.

Hvis det ikke fejler ved 500, men fejler ved 5000 ... så ville jeg klart prøve MERGE. Super speed, rimelig syntax når man lige får styr på det.

try it

mvh

Skrevet ons. d. 19. oktober 2011 kl. 13:16:45| #14

buzzzz
buzzzz (48.826 point)
ifyoudo.net
Kalp#
Er det ikke SQL Profiler du tænker på?

Mener det kræver en Dev, Stand eller Enterprise version.

Skrevet ons. d. 19. oktober 2011 kl. 13:23:15| #15

kalp
kalp (244.223 point)
buzzzz >> yep:) Det er et fantastisk værktøj!

Skrevet ons. d. 19. oktober 2011 kl. 13:28:29| #16

buzzzz
buzzzz (48.826 point)
ifyoudo.net
efprofiler og nhprofiler er også cool, dog koster de penge og i dette tilfælde ikke specielt værdi fulde, da de ikke kan bruges sammen med ASP.

Native SQL går nok også uden om de ORMs, med mindre man kalder ExecuteSql på sin context ... who knows.

mvh

Skrevet ons. d. 19. oktober 2011 kl. 14:04:32| #17

angelenglen
angelenglen (7.306 point)
Databasen er en MS SQL 2005 Standard Edition, og har SQL Profiler værktøjet til rådighed.

- har i nogen tips til hvad jeg skal gøre med det? Har aldrig haft det program startet før.

Skrevet ons. d. 19. oktober 2011 kl. 14:29:28| #18

kalp
kalp (244.223 point)
10min video.. nok mest relevant efter 5min
http://sqlserverpedia.com/ (...)

Det som du får med værktøjet er en oversigt over de queries der bliver afviklet på SQL serveren..
Du kan se hvor længe de er om at blive afviklet, men vigtigst er at du kan se præcis hvad ASP sender til din SQL server.

Det kan hjælpe med at afklare om requests fra ASP bliver sendt korrekt til din SQL server.

Skrevet ons. d. 19. oktober 2011 kl. 14:50:14| #19

kalp
kalp (244.223 point)
prøv lige denne provider i din sql connection: Provider=sqloledb

så vidt jeg kan se er problemet at der er en begrænsning på hvor meget SQL du må proppe ind i Conn.execute(SQL)
og den er måske provider afhængig..

men jeg kan da lige tjekke om ikke man kan overwrite det..

Skrevet ons. d. 19. oktober 2011 kl. 15:26:27| #20

kalp
kalp (244.223 point)
jeg kan ikke rigtig finde noget om hvordan man skal overskrive det - hvis man kan.
Folk har bla. løst det ved at lave en loop.

Men en begrænsning på hvor lang den SQL må være er der i hvert fald.

Skrevet ons. d. 19. oktober 2011 kl. 16:50:25| #21

angelenglen
angelenglen (7.306 point)
Ok, det med at der er en begrænsning på SQL'ens længde giver god mening - jeg har dog søgt efter dokumentation for det, men kan ikke finde det.

Har du nogen anelse om hvor den grænse ligger?
- for det kunne sagtens være årsagen til mine problemer.

Skrevet ons. d. 19. oktober 2011 kl. 16:50:56| #22

angelenglen
angelenglen (7.306 point)
Ps. du har rigeligt fortjent nogle points, så du må meget gerne lægge et svar, så du kan få når jeg deler points ud :-)

Skrevet ons. d. 19. oktober 2011 kl. 16:58:52| #23

buzzzz
buzzzz (48.826 point)
ifyoudo.net
#angelenglen
Siden du har prøvet SQL Profiler ... hvordan ser den sql sætning, så ud som du kan se via SQL Profiler. den burde jo vise en sætning som er blevet forkortet hvis det er tilfældet.

Måske begrænsningen er i ASP delen og ikke MSSQL. Jeg sender vel ca. 2MB SQL filer fra .NET til MSSQL uden problemer.

mvh

Skrevet ons. d. 19. oktober 2011 kl. 19:17:39| #24

sjang
sjang (15.578 point)
www.geniiius.com
Det er meget fint at du sætter command timeout, for det vil også være nødvendigt hvis querien tager mere end 30 sekunder (som jeg mener er default). Men så kunne det meget vel tænkes, at du render ind i ScriptTimeout på selve asp-siden i stedet. Den kan du sætte lidt højere med:

Server.ScriptTimeout = 300

Har du nogle "on error resume next" i din asp kode? For så vil en eventuel fejl nemlig blive slugt. Hvis det er tilfældet, så start med at udkommenter den linje, og se så om du får fejlen vist.

Sidste input: Ifølge http://msdn.microsoft.com/ (...) er max batch size = 65.536 * network packet size. Som note på siden står der, at default er 4KB. Dvs, at din batch max må fylde ca. 256KB. Hvis du har 5000 update linjer, med hver ca. 40 tegn - så er du jo allered på 200KB.. Så hvis dine update linjer bare er lidt længere end de eksempler du viste, så kan det være det problem du render ind i. Men så er jeg 99,9% sikker på, at du ville få en fejl smidt tilbage i hovedet - altså med mindre den bliver slugt med en "on error resume next" som førnævnt.

/Sjang

Skrevet ons. d. 19. oktober 2011 kl. 19:22:56| #25

buzzzz
buzzzz (48.826 point)
ifyoudo.net
Håber ikke han har error handeling. Det er i hvert fald blevet nævnt flere gang. Men det kan selvfølgelig være druknet i andre ting.

Skrevet tor. d. 20. oktober 2011 kl. 01:06:21| #26

kalp
kalp (244.223 point)
buzzz begrænsningen er i ASP delen kan man jo sige.. eller rettere i den provider/driver han benytter til at forbinde med.

Skrevet tor. d. 20. oktober 2011 kl. 10:53:43| #27

angelenglen
angelenglen (7.306 point)
Sjang: Det lyder meget rigtigt, passer også meget godt med antal linjer jeg kunne nå at fyre af før det gik galt.

Jeg fik dog ingen fejl, og havde ingen "on error resume next".

Du må gerne lægge et svar, så jeg kan dele points ud :-)

Skrevet tor. d. 20. oktober 2011 kl. 11:13:50| #28

buzzzz
buzzzz (48.826 point)
ifyoudo.net
Men har du set hvad du modtager på SQL Serveren med SQL Profiler når det går galt?

Skrevet tor. d. 20. oktober 2011 kl. 11:19:01| #29

angelenglen
angelenglen (7.306 point)
Ja, den modtager en hel række update-statements, og den sidste på listen er ikke komplet, og er ikke den sidste af dem jeg sender afsted fra ASP-scriptet.

- det tolker jeg som om at jeg sender for meget data afsted, og den derfor fejler.

Hvorfor den ikke kommer med en fejlbesked, det forstår jeg dog stadig ikke.

Skrevet tor. d. 20. oktober 2011 kl. 12:27:59| #30

buzzzz
buzzzz (48.826 point)
ifyoudo.net
Super ... så fik vi da det på det rene, og så er der ingen tvivl om det er den driver du bruger som fucker op :-)

mvh

Skrevet fre. d. 21. oktober 2011 kl. 11:00:15| #31

angelenglen
angelenglen (7.306 point)
Jeg lader lige spørgsmålet stå åbent lidt, så Sjang har en chance for at lægge et svar.

Skrevet fre. d. 21. oktober 2011 kl. 15:56:44| #32


Skrevet fre. d. 21. oktober 2011 kl. 18:42:24| #33

angelenglen
angelenglen (7.306 point)
Hov, opdagede lige at jeg mangler et svar fra buzzzz :-)
Vil gerne give dig lidt points også :-D

Skrevet fre. d. 21. oktober 2011 kl. 19:29:53| #34


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Stored procedure og triggers

Oprettet den 22. maj 2012 kl. 10.11
htm giver 60 point for svar | Giv et svar »

SELECT by NEWID

Oprettet den 14. maj 2012 kl. 10.21
zentral giver 200 point for svar | Giv et svar »

Hvor finder jeg logfiler?

Oprettet den 14. maj 2012 kl. 10.07
hundevennen giver 100 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger