[VB 6] Te lange regel code ( SQL instructie ) ?

Pagina: 1
Acties:
  • 182 views sinds 30-01-2008
  • Reageer

  • fluppie007
  • Registratie: April 2005
  • Laatst online: 28-11 11:17
Ik heb een vrij lange SQL instructie, deze is nu zo lang dat ik ze van VB niet meer op 1 lijn code mag zetten. Dit is de gewenste lijn code:

[CODE=vb]
adoPrimaryRS.Open "SHAPE { SELECT Orders.OrderID, FactuurNummer.FactuurNummer, Orders.OrderDate, Customers.CustomerID, Customers.CompanyName, Customers.CompanyBTW, Customers.ContactFirstName, Customers.ContactLastName, Customers.Address, Customers.City, Customers.PostalCode, Customers.Country FROM Customers INNER JOIN (Orders INNER JOIN FactuurNummer ON Orders.OrderID = FactuurNummer.OrderID) ON Customers.CustomerID = Orders.CustomerID ORDER BY Orders.OrderID;} AS ParentCMD APPEND ({ SELECT Orders.OrderID, Products.ProductName AS Productnaam, Products.UnitPriceSell AS Stukprijs, [Order Details].Quantity AS Aantal, [Totaal Incl]-[Totaal Excl] AS BTW, Products!UnitPriceSell*[Order Details]!Quantity AS [Totaal Excl], [Totaal Excl]*1.21 AS [Totaal Incl], Brands!BrandName & Chr(32) & Products!ProductName AS Omschrijving FROM Brands INNER JOIN (Products INNER JOIN (Orders INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID) ON Products.ProductID = [Order Details].ProductID) ON Brands.BrandID = Products.BrandID; } AS ChildCMD RELATE OrderID TO OrderID) AS ChildCMD", db, adOpenStatic, adLockOptimistic
[/CODE=vb]

Dan dacht ik er dit van te maken:

[CODE=vb]

Dim SQLString As String
Dim SQLString1 As String
Dim SQLString2 As String
SQLString1 = "SHAPE { SELECT Orders.OrderID, FactuurNummer.FactuurNummer, Orders.OrderDate, Customers.CustomerID, Customers.CompanyName, Customers.CompanyBTW, Customers.ContactFirstName, Customers.ContactLastName, Customers.Address, Customers.City, Customers.PostalCode, Customers.Country FROM Customers INNER JOIN (Orders INNER JOIN FactuurNummer ON Orders.OrderID = FactuurNummer.OrderID) ON Customers.CustomerID = Orders.CustomerID ORDER BY Orders.OrderID;}"
SQLString2 = " AS ParentCMD APPEND ({ SELECT Orders.OrderID, Products.ProductName AS Productnaam, Products.UnitPriceSell AS Stukprijs, [Order Details].Quantity AS Aantal, [Totaal Incl]-[Totaal Excl] AS BTW, Products!UnitPriceSell*[Order Details]!Quantity AS [Totaal Excl], [Totaal Excl]*1.21 AS [Totaal Incl], Brands!BrandName & Chr(32) & Products!ProductName AS Omschrijving FROM Brands INNER JOIN (Products INNER JOIN (Orders INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID) ON Products.ProductID = [Order Details].ProductID) ON Brands.BrandID = Products.BrandID;} AS ChildCMD RELATE OrderID TO OrderID) AS ChildCMD, db, adOpenStatic, adLockOptimistic"
SQLString = SQLString1 + SQLString2
adoPrimaryRS.Open SQLString
[/CODE=vb]

Maar om de 1 of andere reden werkt dit niet.
Ik krijg van VB een runtime error ( 3709 ):
"De verbinding is ongeldig of gesloten."

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Ik kan het me haast niet voorstellen dat dit nu nog in VB zo is, maar uit mijn QBasic periode herinner ik me nog dat strings maximaal 255 karakters lang konden zijn. En inderdaad: op een gegeven moment is je sql-string dan te lang. Het over twee regels uitsmeren en dan aan elkaar plakken helpt natuurlijk niet, want de uiteindelijke string wordt nog steeds afgekapt.

Uit mijn Delphi-periode herinner ik me dan weer het TQuery-component, waarbij je een heleboel regels kon zetten:

code:
1
2
3
4
var Q:TQuery;
Q:=TQuery.create;
Q.Lines.Add("select * from tabel");
Q.Lines.Add("where dit=dat");

Wellicht heeft VB ook een dergelijke constructie om lange stukken SQL op te geven?

Maar even serieus: het wil er bij mij toch eigenlijk niet in dat er nog programmeertalen bestaat die geen lange strings toestaan?? Ik hoop echt dat het probleem iets anders is ;-)

Siditamentis astuentis pactum.


  • PolarBear
  • Registratie: Februari 2001
  • Niet online
fluppie007 schreef op woensdag 27 december 2006 @ 04:44:
Ik heb een vrij lange SQL instructie, deze is nu zo lang dat ik ze van VB niet meer op 1 lijn code mag zetten.

[...]

Ik krijg van VB een runtime error ( 3709 ):
"De verbinding is ongeldig of gesloten."
Waar staat in de foutmelding dat het te maken heeft met een lange SQL instructie? Het lijkt er eerder op dat je geeneens een verbinding hebt met je SQL server: "De verbinding is ongeldig of gesloten."

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Ik weet bij delphi dat dit wel zo is, maar dan krijg je bij het compilen al een halt dat er teveel tekens in een string staan.

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Drie variabelen is trouwens nergens voor nodig:

Visual Basic:
1
2
3
mijnString = "lorem ipsum " & _
    "sit amet," & _
    "consectetuer adipiscing elit."

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • martennis
  • Registratie: Juli 2005
  • Laatst online: 27-11 19:57
wat is je connection string?
is die wel goed?

  • fluppie007
  • Registratie: April 2005
  • Laatst online: 28-11 11:17
Deze code doet het, maar hier ontbreken nog enkele gegevens die ik nog nodig heb:

[CODE=vb]adoPrimaryRS.Open "SHAPE { SELECT Orders.OrderID, FactuurNummer.FactuurNummer, Orders.OrderDate, Customers.CustomerID, Customers.CompanyName, Customers.CompanyBTW, Customers.ContactFirstName, Customers.ContactLastName, Customers.Address, Customers.City, Customers.PostalCode, Customers.Country FROM Customers INNER JOIN (Orders INNER JOIN FactuurNummer ON Orders.OrderID = FactuurNummer.OrderID) ON Customers.CustomerID = Orders.CustomerID ORDER BY Orders.OrderID;} AS ParentCMD APPEND ({ SELECT Orders.OrderID, Products.ProductName AS Productnaam, Products.UnitPriceSell AS Stukprijs, [Order Details].Quantity AS Aantal, [Totaal Incl]-[Totaal Excl] AS BTW, Products!UnitPriceSell*[Order Details]!Quantity AS [Totaal Excl], [Totaal Excl]*1.21 AS [Totaal Incl] FROM Products INNER JOIN (Orders INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID) ON Products.ProductID = [Order Details].ProductID; } AS ChildCMD RELATE OrderID TO OrderID) AS ChildCMD", db, adOpenStatic, adLockOptimistic[/CODE=vb]

Deze code doet het niet, al is de SQL string wel ok, want ik maak in access een selectiequery, neem SQL weergave en plak die string in men VB code, werkte tot voorheen perfect, nu is deze string zo lang geworden dat ik ze niet meer op 1 lijn kan plakken

de runtime error maakt deze lijn code geel: [CODE=vb]adoPrimaryRS.Open SQLString[/CODE=vb]

[CODE=vb]Dim SQLString As String

SQLString = "SHAPE { SELECT Orders.OrderID, FactuurNummer.FactuurNummer, Orders.OrderDate, Customers.CustomerID, Customers.CompanyName, Customers.CompanyBTW, Customers.ContactFirstName, Customers.ContactLastName, Customers.Address, Customers.City, Customers.PostalCode, Customers.Country FROM Customers INNER JOIN (Orders INNER JOIN FactuurNummer ON Orders.OrderID = FactuurNummer.OrderID) ON Customers.CustomerID = Orders.CustomerID ORDER BY Orders.OrderID;}" & _
" AS ParentCMD APPEND ({ SELECT Orders.OrderID, Products.ProductName AS Productnaam, Products.UnitPriceSell AS Stukprijs, [Order Details].Quantity AS Aantal, [Totaal Incl]-[Totaal Excl] AS BTW, Products!UnitPriceSell*[Order Details]!Quantity AS [Totaal Excl], [Totaal Excl]*1.21 AS [Totaal Incl], Brands!BrandName & Chr(32) & Products!ProductName AS Omschrijving FROM Brands INNER JOIN (Products INNER JOIN (Orders INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID) ON Products.ProductID = [Order Details].ProductID) ON Brands.BrandID = Products.BrandID;} AS ChildCMD RELATE OrderID TO OrderID) AS ChildCMD, db, adOpenStatic, adLockOptimistic"

adoPrimaryRS.Open SQLString[/CODE=vb]


Dit is de onbewerkte string als ik hem van access kopieër :
Ik zet juist in notepas even alles op 1 regel, deze string is voor mijn ChildCMD, ParentCMD mag behouden worden zoals in vorige code snippet.

[CODE=vb]SELECT Orders.OrderID, Products.ProductName AS Productnaam, Products.UnitPriceSell AS Stukprijs, [Order Details].Quantity AS Aantal, [Totaal Incl]-[Totaal Excl] AS BTW, Products!UnitPriceSell*[Order Details]!Quantity AS [Totaal Excl], [Totaal Excl]*1.21 AS [Totaal Incl], Brands!BrandName & " " & Products!ProductName AS Expr1
FROM Brands INNER JOIN (Products INNER JOIN (Orders INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID) ON Products.ProductID = [Order Details].ProductID) ON Brands.BrandID = Products.BrandID;[/CODE=vb]]

Jullie nog ideeën ? Ik heb kenneth's methode geprobeerd, maar tevergeefs zelfde error.
En ik denk niet dat het miijn connection string is want met die allereerste code doet die het
wel...

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Nu ben ik geen held wat betreft SQL, maar Chr(32) zetten in een var als tekst lijkt me niet echt handig. Dat is gewoon een spatie, en die wordt nu niet omgezet omdat het in een var staat, als tekst dus.

ik zou daar gewoon ' ' van maken, of die chr uit je tekstvariable halen ...." & Chr(32) & "....

Ey!! Macarena \o/


  • BertS
  • Registratie: September 2004
  • Laatst online: 27-10 13:12
Visual Basic:
1
2
3
4
5
Dim SQLString As String
  
SQLString = "SHAPE { SELECT Orders.OrderID, FactuurNummer.FactuurNummer, Orders.OrderDate, Customers.CustomerID, Customers.CompanyName, Customers.CompanyBTW, Customers.ContactFirstName, Customers.ContactLastName, Customers.Address, Customers.City, Customers.PostalCode, Customers.Country FROM Customers INNER JOIN (Orders INNER JOIN FactuurNummer ON Orders.OrderID = FactuurNummer.OrderID) ON Customers.CustomerID = Orders.CustomerID ORDER BY Orders.OrderID;}" & _
  " AS ParentCMD APPEND ({ SELECT Orders.OrderID, Products.ProductName AS Productnaam, Products.UnitPriceSell AS Stukprijs, [Order Details].Quantity AS Aantal, [Totaal Incl]-[Totaal Excl] AS BTW, Products!UnitPriceSell*[Order Details]!Quantity AS [Totaal Excl], [Totaal Excl]*1.21 AS [Totaal Incl], Brands!BrandName & Chr(32) & Products!ProductName AS Omschrijving FROM Brands INNER JOIN (Products INNER JOIN (Orders INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID) ON Products.ProductID = [Order Details].ProductID) ON Brands.BrandID = Products.BrandID;} AS ChildCMD RELATE OrderID TO OrderID) AS ChildCMD"
  adoPrimaryRS.Open SQLString, db, adOpenStatic, adLockOptimistic

zal het wel doen. Je hebt de string niet correct afgekapt, maar de extra parameters ook in je string-variabele opgenomen.

  • fluppie007
  • Registratie: April 2005
  • Laatst online: 28-11 11:17
BertS: Koning !

Jouw code doet het helemaal :). Hartelijk dank voor jullie hulp allemaal.

Groetjes en prettige eindejaarsfeesten :*)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
kenneth schreef op woensdag 27 december 2006 @ 08:41:
Drie variabelen is trouwens nergens voor nodig:

Visual Basic:
1
2
3
mijnString = "lorem ipsum " & _
    "sit amet," & _
    "consectetuer adipiscing elit."
Dat mag overigens van VB6 maar maximaal 25 regels ;) Daarna krijg je een "too many line continuations" :X

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Hahaha :) Nou, sowieso is het ranzig, ik kan me geen situatie bedenken waarin je dat nodig zou hebben. SQL-concatenation wil je niet, en lange constanten zet je in een file ofzo ...

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Probeer de SQL code eens in een stored procedure te zetten, is vaak ook handiger ivm SQL injection etc

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Dat helpt helemaal niets tegen SQL injection, parametrisering helpt daartegen.
Wat een stored procedure verder ("etc") zou toevoegen, vraag ik me ook af.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • ShadowrunR
  • Registratie: Maart 2002
  • Laatst online: 01-12 22:45
Als je je strings concateneert met een '&'-operator ipv een '+', zou het moeten werken. Losstaande van het feit dat 3 variabelen natuurlijk voor niets nodig zijn. ;)

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 17-11 14:00
Een string kan heel lang worden in VB, ik heb er een keer een gehad van 60MB ofzo.
Attachment die naar base64 omgezet was.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
PiepPiep schreef op donderdag 28 december 2006 @ 23:54:
Een string kan heel lang worden in VB, ik heb er een keer een gehad van 60MB ofzo.
Attachment die naar base64 omgezet was.
Een string in VB6 mag inpricipe tot 2Gb "groot" zijn (pas wel op met UNICODE strings; dus 2 bytes per char). Een fixed-length string mag max. 64Kb groot zijn bij mijn weten. Bron. "Heel lang" is ook zo...nattevingerwerk ;)

Maar wat heeft dat te maken met dit topic? ;)

[ Voor 18% gewijzigd door RobIII op 29-12-2006 00:04 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
kenneth schreef op donderdag 28 december 2006 @ 12:49:
Dat helpt helemaal niets tegen SQL injection, parametrisering helpt daartegen.
Wat een stored procedure verder ("etc") zou toevoegen, vraag ik me ook af.
geez, 'geparametriseerde stored procedures' dan voor jou .. |:(

Verdere voordelen van stored procedures: http://blogs.wdevs.com/co...chive/2004/10/01/716.aspx

Of beter:
http://www.google.nl/sear...&btnG=Google+zoeken&meta=

[ Voor 10% gewijzigd door farlane op 29-12-2006 02:38 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

farlane schreef op vrijdag 29 december 2006 @ 02:38:

geez, 'geparametriseerde stored procedures' dan voor jou .. |:(
Je hoeft niet zo te reageren :>
Want het gaat dus om het parametriseren, niet om de stored procedure. Gewone dynamic sql die geparametriseerd is, is dus even veilig. De overhead om ook nog 'ns een stored procedure te maken voegt, in ieder geval wat betreft veiligheid, helemaal niets toe.
Verdere voordelen van stored procedures: http://blogs.wdevs.com/co...chive/2004/10/01/716.aspx
Ik heb er ook nog een paar ...

En dan vooral de eerste link is inmiddels 'n klassieker ;)
Ik zie het :P

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Dat kwam omdat je opmerking overkwam op mij als 'waar heeft die bal gehakt het nou weer over?'
Want het gaat dus om het parametriseren, niet om de stored procedure. Gewone dynamic sql die geparametriseerd is, is dus even veilig.
Hmmkay, ik heb mijn post verkeerd geformuleerd. De SQL code die ik in het voorbeeld zie is echter verre van geparametriseerd, en lijkt op de code die ikzelf een aantal jaren terug maakte. Dat gaat gewoon niet goed komen. ( Ja ik weet het er zitten geen parameters in deze query, maar als deze zonder parameters er zo uit ziet durf ik te wedden dat die queries die er wel wat hebben er hetzelfde uitzien )
Ik heb er ook nog een paar ...

En dan vooral de eerste link is inmiddels 'n klassieker ;)

..etc...
Denk niet dat het nodig is om die discussie hier te gaan herhalen dan. Er zijn bij zoals zoveel dingen voor en tegenstanders van het gebruik van stored procedures. De uiteindelijke doelstelling is echter bij iedereen hetzelfde : veiligheid, snelheid en eenduidigheid.

[edit]
Btw Frans pleit voor een methode waarbij SQL code 'on the fly' gegenereerd wordt. Is ook niet wat hier gebeurt.

[ Voor 4% gewijzigd door farlane op 30-12-2006 17:23 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Stamgastje
  • Registratie: April 2003
  • Laatst online: 02-02-2020
Wat de TS sowieso kan doen, is tabelnamen vervangen door afkortingen (m.b.h. AS):
SQL:
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
SHAPE {
    SELECT
        O.OrderID, F.FactuurNummer, O.OrderDate, C.CustomerID, C.CompanyName, C.CompanyBTW, C.ContactFirstName, C.ContactLastName, C.Address, C.City, C.PostalCode, C.Country 
    FROM 
        Customers AS C 
    INNER JOIN 
        (
            Orders AS O INNER JOIN FactuurNummer AS F ON O.OrderID = F.OrderID
        ) ON C.CustomerID = O.CustomerID 
    ORDER BY 
        O.OrderID;
} 
AS ParentCMD 

APPEND 

(
    {
        SELECT 
            O.OrderID, P.ProductName AS Productnaam, P.UnitPriceSell AS Stukprijs, OD.Quantity AS Aantal, [Totaal Incl]-[Totaal Excl] AS BTW, P!UnitPriceSell*OD!Quantity AS [Totaal Excl], [Totaal Excl]*1.21 AS [Totaal Incl], B!BrandName & Chr(32) & P!ProductName AS Omschrijving 
        FROM 
            Brands AS B 
        INNER JOIN (
            Products AS P INNER JOIN (
                Orders AS O INNER JOIN [Order Details] AS OD ON O.OrderID = OD.OrderID
            ) ON P.ProductID = OD.ProductID
        ) ON B.BrandID = P.BrandID; 
    } AS ChildCMD 
    RELATE OrderID TO OrderID
) AS ChildCMD

Dit zorgt ervoor dat de query korter wordt en daardoor ook leesbaarder is (in mijn ogen).
Pagina: 1