06. juni 2019 - 13:52Der 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
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?
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))
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).
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
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... :-)
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 ;-)
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.
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 :-)
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.
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 :-/
Synes godt om
Ny brugerNybegynder
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.