Avatar billede Mike Novice
06. juni 2019 - 13:52 Der er 16 kommentarer og
1 løsning

Inner Join udskriver ingen poster

Jeg har denne sql-streng til at finde en række poster i en access db, og jeg ved at under de rette forhold skulle den finde 8 ud af 10 poster, men den finder ingen...
Jeg har lavet en udskrift af strsql, for at se om der mangler en where-værdi, men det er alt sammen rigtigt.

Er der en som kan se den fejl, som jeg ikke selv kan se, det ville være dejligt :-)


strSQL = "SELECT game_provinces.*, game_buildings_province.*, game_products.*, game_storage_province.*, game_buildings.* FROM game_buildings INNER JOIN (game_products INNER JOIN (game_storage_province INNER JOIN (game_buildings_province INNER JOIN game_provinces ON game_buildings_province.nbldProvinceID = game_provinces.proID) ON game_storage_province.stoStorageID = game_buildings_province.nbldID) ON game_products.prodID = game_storage_province.stoProductID) ON game_buildings.bldID = game_buildings_province.nbldBuildingID Where proNationID=" & Session("nationid") & " AND prodDecay > 0 AND stoLastDecay < #" & Now()-GAME_DECAY_CHECK & "#"
Set rsDecay = ConnMain.Execute(strSQL)
If Not (rsDecay.EOF OR rsDecay.BOF) Then
Avatar billede softspot Forsker
06. juni 2019 - 20:48 #1
Kan du vise et eksempel på en genereret SQL-streng?
Avatar billede Mike Novice
06. juni 2019 - 22:03 #2
SELECT game_provinces.*, game_buildings_province.*, game_products.*, game_storage_province.*, game_buildings.* FROM game_buildings INNER JOIN (game_products INNER JOIN (game_storage_province INNER JOIN (game_buildings_province INNER JOIN game_provinces ON game_buildings_province.nbldProvinceID = game_provinces.proID) ON game_storage_province.stoStorageID = game_buildings_province.nbldID) ON game_products.prodID = game_storage_province.stoProductID) ON game_buildings.bldID = game_buildings_province.nbldBuildingID Where proNationID=100 AND prodDecay > 0 AND stoLastDecay < #05-06-2019 21:58:55#
Avatar billede Mike Novice
06. juni 2019 - 22:25 #3
Jeg har selv lige fundet fejlen, jeg havde ikke konverteret datoen før jeg søgte...

Men det har nu givet mig et andet problem, dato-feltet bliver automatisk udfyldt i access db ved insert  af post, med Now(), men det lader til at give problemer når det drejer sig om datoer, som kan læses "begge veje", hvis du forstår.... Altså 1-3 (1 marts), kan ses som 3-1 (3 januar) osv.

Er det fordi det er bedst at køre alle datoer ind via asp script og igennem samme dato converter, så alle datoer bliver lagt ind og hentet ud på 100% samme måde eller gør jeg noget andet forkert?
Avatar billede softspot Forsker
06. juni 2019 - 22:53 #4
Jeg mener access understøtter parameteriserede queries, så det vil jeg da anbefale at du kigger lidt ind i.

F.eks. noget i stil med

strSQL = "SELECT game_provinces.*, game_buildings_province.*, game_products.*, game_storage_province.*, game_buildings.* FROM game_buildings INNER JOIN (game_products INNER JOIN (game_storage_province INNER JOIN (game_buildings_province INNER JOIN game_provinces ON game_buildings_province.nbldProvinceID = game_provinces.proID) ON game_storage_province.stoStorageID = game_buildings_province.nbldID) ON game_products.prodID = game_storage_province.stoProductID) ON game_buildings.bldID = game_buildings_province.nbldBuildingID Where proNationID=? AND prodDecay > 0 AND stoLastDecay < ?"
set cmd = Server.CreateObject("ADO.Command")
set cmd.Connection = connMain
cmd.sql = strSQL
set rs = cmd.Execute(,array(Session("nationid"), Now()-GAME_DECAY_CHECK))


Gør du det, vil jeg mene du slipper for det formateringsproblem (plus nogle SQL injection problemer du også har i din kode).
Avatar billede Mike Novice
07. juni 2019 - 13:09 #5
Det forstår jeg desværre ikke, har aldrig set noget ala det du skriver der... Skal der sættes en værdi ind istedet for "?"... Og hvordan fungere det array du har lavet i execute?

Where proNationID=? AND prodDecay > 0 AND stoLastDecay < ?"

set rs = cmd.Execute(,array(Session("nationid"), Now()-GAME_DECAY_CHECK))
Avatar billede softspot Forsker
07. juni 2019 - 15:05 #6
Array'et er blot parametrene i den rækkefølge den forekommer sql-sætningen. En parameter er symboloseret ved et spørgsmålstegn i sql-sætningen og skal ikke udskiftes (det sørger command-objektet's execute for).
Avatar billede Mike Novice
08. juni 2019 - 12:28 #7
Okay, den metode kendte jeg ikke...

Men desværre så får jeg fejl når jeg når jeg prøver din kode, i linien.

set cmd = Server.CreateObject("ADO.Command")

Serverobjekt fejl 'ASP 0177 : 800401f3'
Server.CreateObject blev ikke udført

I execute linien, har du sat "," foran array, er det en fejl eller skal det være sådan? (løser ikke problemet hvis jeg fjerner det)
Avatar billede softspot Forsker
08. juni 2019 - 12:51 #8
Prøv med

set cmd = Server.CreateObject("ADODB.Command")

Den tomme parameter skal være der. Det er blot et signal til VBScript om, at den parameter skal ignoreres.
Avatar billede Mike Novice
08. juni 2019 - 12:57 #9
Så kommer der bare fejl i næste linie.

set cmd.Connection = connMain

Der opstod en Microsoft VBScript-kørselsfejl fejl '800a01b6'
Objektet understøtter ikke denne egenskab eller metode: 'cmd.Connection'
Avatar billede Mike Novice
08. juni 2019 - 13:00 #10
Skal der forsten laves noget om i opkaldet til db'en?

DBMain = SITE_FOLDER & "/db/main.mdb"
On Error Resume Next
Set ConnMain = Server.CreateObject("ADODB.Connection")
ConnMain.Open = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" & Server.MapPath ("" & DBMain & "")
If Err.Number<>0 Then
  Response.Redirect "" & SITE_FOLDER & "/error.asp?err=db_main"
End if
Err.Clear
On Error Goto 0
Avatar billede softspot Forsker
08. juni 2019 - 14:19 #11
Jeg kørte den også lidt på hukommelsen, men den er åbenbart ikke så god når alt kommer til alt :-)

Prøv med disse 2 linjer:

set cmd.ActiveConnection = connMain
cmd.CommandText = strSQL

i stedet for disse to:

set cmd.Connection = connMain
cmd.sql = strSQL
Avatar billede softspot Forsker
08. juni 2019 - 14:20 #12
Du kunne i øvrigt også prøve at søge efter ADODB.Command på internettet. Så er jeg ret sikker på, at du vil finde en masse materiale du kan læne dig op ad... :-)
Avatar billede Mike Novice
08. juni 2019 - 14:55 #13
Jep, nu virker det som det skal... Men prøvede for sjov at bruge den oprindelige kode, og mærkeligt nok så virker den også nu. Kan det have noget at gøre med den faktiske dato og så det dato format som det er gemt under?

Det vil vel være mest rigtigt at bruge den metode som du lige har givet mig her? Eller kan der have været noget andet galt, server problem eller den slags?

Uanset hvad så siger jeg i hvert fald mange tak for hjælpen, det er godt der stadig er nogen derude som kender det her uddøende sprog ;-)
Avatar billede softspot Forsker
08. juni 2019 - 15:21 #14
Du kan muligvis styre sproget og dermed formateringen ved at sætte session.lcid. Jeg kan dog ikke huske om dette slår igennem til ADO. Det er muligt, at du på connection-objektet eller command-objektet kan sætte noget med sproget. Alternativt skal det bestemmes i databasen ( jeg brainstormer bare :-) ).

Jeg ville lære den metode jeg har skitseret lidt af her, da det er mere sikkert og hvis du får lavet nogle strategiske funktioner, kan du med lethed anvende parametre i stedet for at strengsammensætte SQL-sætninger. Det har også den anden fordel, at de bliver lettere at gennemskue dine SQL-sætninger, fordi du ikke skifter kontekst (inde i og så udenfor og så inde i strengen igen) hele tiden.
Avatar billede Mike Novice
09. juni 2019 - 11:15 #15
Okay, jeg kan høre at vi nu er nede af en vej, hvor jeg meget hurtigt vil sakke bagud ;-)
Jeg bruger kun ASP for sjov og til private formål og har aldrig lært det på professionelt plan, og derfor ligger min viden ikke så meget i at forstå hvad der sker i den kode jeg bruge, men mere i at jeg ved hvad den stump kode jeg bruger, gør. Det er jo af og til et problem, da jeg flere gange har lavet meget lange koder og senere fundet ud af det kunne klares på 3 linier :-)
Jeg har en ASP bøg tilbage fra 2000, som jeg af og til kigger lidt i. Og så bruger jeg tit og ofte https://www.w3schools.com/, hvis jeg har et specifikt problem.

Men igen, mange tak for din hjælp, vil kigge lidt på dine forslag :-)
Avatar billede softspot Forsker
09. juni 2019 - 12:43 #16
En bog fra 2000 er vist helt up to date hvad ASP angår, så den skal du bare fortsætte med at bruge :-)

Det er klart, at du skal tilpasse din indsats efter behovet. Jeg tænker bare, at hvis du skal lave noget som er rettet mod offentlig adgang, så bør du under alle omstændigheder bekymre dig om sikkerhed og beskyttelse af dine (og andres) data. Beskyttelse mod SQL injections er én parameter, blandt mange, ned ad den vej.
Avatar billede Mike Novice
10. juni 2019 - 12:00 #17
Ja, du har fuldstændig ret angående sikkerhed. Men jeg regner heller ikke med at få en stor omfattende side ud på nettet.
Har haft en simple side derude, for nogle år tilbage. Men da den endelig var kommet rimeligt op i gear, brugte jeg mere tid på slette uønsket indlæg og lappe "huller" i systemet, end jeg gjorde på at udbygge siden.
Og sat op i mod at det er 8 år siden, så tror jeg ikke mine evner rækker til at drive en sikker side i dag :-/
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

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