Just nu i M3-nätverket
Jump to content

Köra flera INSERT kommandon på en gång.


gsa.wmga

Recommended Posts

Hej,

 

Jag har ett problem med prestandan i en DLL jag utvecklat i VB. DLL:en ska öppna en fil med INSERT kommandon och köra dessa till en databas.

Här kommer problemet. Varje gång är det minst 500 rader som ska läggas in så att exekvera varje rad enskilt tar över 10 sekunder, vilket inte är acceptabelt. Problemet med det hela är att DLL:en ska fungera emot både Access 97 och Oracle, så det går med andra ord inte att använda stored procedures.

Jag har försökt lagra alla queries i en variabel åtskillda med semikolon + vbcrlf, men jag får alltid meddelandet "Characters found after end of statement"

 

Min fråga är nu om det endast kan vara något syntaxfel eller är det helt enkelt inte möjligt att göra som jag tänkt.

 

Tacksam för hjälp.

Glenn

 

Link to comment
Share on other sites

Magnus Gladh

Om du menar att ett enda INSERT kommando tar 10 sekunder att utföra så har du helt rätt att det inte skall vara acceptabelt. Har aldrig råkat ut för sådan extrem tider. Du kanske har miljoner med indexes på dina tabeller.

 

Om du har syntaxfel är omöjligt att säga om man inte ser någon kod.

 

- Magnus

-----------------------------------------------------

Ropen skalla, BBB (eller BOSTREAM) åt alla!!!

 

Link to comment
Share on other sites

Jag kanske förklarade lite otydligt, jag menade att köra alla INSERT kommandon (över 500 st.) tar över 10 sekunder. Vad jag skulle vilja undvika är att köra "Connection.Execute" för varenda rad, eftersom jag är rädd att prestandan kommer att vara väldigt dålig annars när programmet körs över WAN.

Syntaxen i själva INSERT kommandona är OK, eftersom de går att kör en och en. Vad jag undrar över är hur man ska koppla ihop de enskilda INSERT kommandona för att man ska kunna köra allt med ett enda "Execute"

 

Nedan är exempel på tre rader jag försökt köra på en gång men jag får bara felmeddelandet "Characters found..."

 

INSERT INTO c_u_s(id, slct_grp_id, slct_fld, slct_value) VALUES('000001-141', 'CUD_Scope', 'C_QLUF1[1,1]', '0.00');

INSERT INTO c_u_s(id, slct_grp_id, slct_fld, slct_value) VALUES('000001-141', 'CUD_Scope', 'C_QLUF2[1,1]', '0.00');

INSERT INTO c_u_s(id, slct_grp_id, slct_fld, slct_value) VALUES('000001-141', 'CUD_Scope', 'C_ISGS[1,1]', '0.00');

 

Link to comment
Share on other sites

jag hade kanske använt isql om det var ms sql. men på access och oracle,, vet ej.

 

[inlägget ändrat 2003-08-18 12:25:08 av dw33]

Link to comment
Share on other sites

Magnus Gladh

Det borde fungera att bara ha semikolon mellan de olika INSERT satserna, så testa att ta bort vbcrlf och testa igen.

 

Det finns dock säkert en gräns på hur många tecken som man kan skicka med, men om du får igång 2 INSERT satser med semikolon emellan, så är det bara att lägga på och se hur många rader du kan skicka åtgången.

 

- Magnus

-----------------------------------------------------

Ropen skalla, BBB (eller BOSTREAM) åt alla!!!

 

Link to comment
Share on other sites

Mjae, har nog prövat men det funkar varken emot Access eller Oracle. Access meddelar "Characters found..." och från Oracle kommer meddelandet "ORA-00911:invalid character". Har försökt köra med både mellanslag och radbrytning mellan kommandona, men samma fel kommer hela tiden.

 

Link to comment
Share on other sites

Bara en följdfråga (mest till Magnus tror jag) ;-):

 

Kan man verkligen stapla SQL-satser på varandra så här? Rent logiskt borde ju felen här bero på att databasen tror att allt ihop är en enda SQL-sats och därför returnerar "invalid character", eftersom syntaxen i SQL-satsen blir fel.

 

Eller? Jag vet inte hur det funkar i VB eller så, men det känns galet ...

 

Bara en fundran

---

vänligen

 

Andreas

 

Link to comment
Share on other sites

Magnus Gladh

Jodå, du skall kunna "stapla" SQL satser på varandra och avskilja dem med ;

 

Det är blanda annat detta som uttnytjas när man hackar databaser via SQL Injection.

 

- Magnus

-----------------------------------------------------

Ropen skalla, BBB (eller BOSTREAM) åt alla!!!

 

Link to comment
Share on other sites

Kan problemet tro ligga i hur ADO sköter detta? Jag tror jag löser det så jag skapar en stored procedure på Oracle och helt enkelt kör rad för rad emot Access, borde i alla fall ge något bättre prestanda än tidigare.

Hoppas ändå på hjälp med min fråga, då det skulle även ge bättre prestanda på Access.

 

Mvh.

Glenn

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...