27. januar 2005 - 17:50Der er
32 kommentarer og 1 løsning
Arrays og SQL HJÆLP
Jeg skal have indsat data fra en txt-fil, som jeg læser via FSO og lægger i et array. Jeg skal lave et check på 2 ting før jeg læser det ind i en database:
1) Om de enkelte poster findes eller ikke findes. 2) Om de skal opdateres, oprettes eller slettes via en kommando, der står i txt-filen, som det første ord.
Jeg har nedenfor et array, hvor jeg fjerner alle semikolon'er fra txt-filen:
Do While not f.AtEndOfStream arrM = Split(f.ReadLine,";") 'Response.write arrM(0) 'Response.write arrM(1) 'Response.write arrM(2) 'Response.write arrM(3) 'Response.write arrM(4)
' her vil jeg tjekke om det første ord er UPDATE eller DELETE.
Do while not rs.EOF strFelt1 = arrM(0) if instr(strFelt1, "UPDATE") Then Response.write "Lav et script, der opdaterer felterne i databasen, hvis de findes ellers opret dem" ELSE Response.write "Lav et script, der sletter poster i databasen, hvis de findes"
rs.movenext loop End if
Conn.Close Set Conn = Nothing
Loop f.Close
Jeg er gået kold i opgaven, så hvis der er en hjælpsom sjæl og ekspert på området, hører jeg meget gerne derfra. Hjælpen er uvurderlig!
if instr(strFelt1, "UPDATE")>0 Then Response.write "Lav et script, der opdaterer felterne i databasen, hvis de findes ellers opret dem" ELSE Response.write "Lav et script, der sletter poster i databasen, hvis de findes" End if
Du har ret med det med loopen, men nu får jeg desværre fejlen:
Fejltype: ADODB.Recordset (0x800A0E78) Handlingen er ikke tilladt, mens objektet er lukket.
Der henvises til linien med: Do while not rs.EOF ?
Koden ser nu sådan ud:
<% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DBQ=" & Server.Mappath("Branche.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};" Set rs = Server.CreateObject("ADODB.RecordSet")
Dim fso, f, filespec Set fso = CreateObject("Scripting.FileSystemObject") filespec = Server.Mappath("/Import/Branche.txt") Set f = fso.OpenTextFile(filespec,1) Do While not f.AtEndOfStream arrM = Split(f.ReadLine,";")
Do while not rs.EOF strFelt1 = arrM(0) if instr(strFelt1, "UPDATE")>0 Then Response.write "Lav et script, der opdaterer felterne i databasen, hvis de findes ellers opret dem" ELSE Response.write "Lav et script, der sletter poster i databasen, hvis de findes" End if rs.movenext Loop
Conn.Close Set Conn = Nothing
Loop f.Close %>
Hvis jeg tømmer databasen, indsættes værdierne fint med sætningen:
Da det jo allerede ligger i en loop...og det synes at virke...
Til info er Felt4 primærnøgle; Felt1, Felt2 er tal, og Felt3 er et tekst-felt i databasen. Der skal også tages højde for, at nogle felter kan være tommme... (Men jeg ved dog ikke om du har tid og lyst til at hjælpe med SQL-sætningerne)?
Ikke helt... Scriptet udfører ikke handlingerne: DELETE og UPDATE?? Men det indskriver nye poster, som det skal. Og så er der lige det med de tomme felter (;;), der også skal tages højde for...
Scriptet ser nu sådan ud:
<% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DBQ=" & Server.Mappath("Branche.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};" Set rs = Server.CreateObject("ADODB.RecordSet")
Dim fso, f, filespec Set fso = CreateObject("Scripting.FileSystemObject") filespec = Server.Mappath("/Import/Branche.txt") Set f = fso.OpenTextFile(filespec,1) 'Emp = replace((f.ReadLine), ";;", ";0") Do While not f.AtEndOfStream
'Response.write arrM(0) & arrM(4) SQL="Update Branche set "&_ "Felt1='"&arrM(1) &"'," &_ "Felt2='"&arrM(2) &"'," &_ "Felt3='"&arrM(3) &"'," &_ "Felt4='"&arrM(4) &"'" &_ "where Felt4=" & arrM(4) set rs = Conn.Execute(strSQL) End if
Else if instr(strFelt1, "DELETE")>0 Then if not rs.eof then 'response.Write arrM(0) & arrM(4) SQL = "DELETE FROM Branche where Felt4=" & arrM(4) & ";" set rs = Conn.Execute(strSQL) End if End if
End if
Loop f.Close 'rs.Close Conn.Close Set Conn = Nothing
Mht. UPDATE, så ændrer jeg blot en værdi i txt-filen (naturligvis ikke primærnøglen) - så de findes i databasen i forvejen. Det samme med DELETE.
Jeg får kun fejl, hvis jeg sletter et "felt" i txt-filen, for scriptet fjerner semikolon, når det indlæses. En linie i txt-filen kunne f.eks. se sådan ud:
opstår naturligvis fejl. Måske skal jeg indlæse hele txt-filen først og replace ;; med et eller andet - ellers skriver den kun de 3 første ind i databasen, uden at tage det sidste felt med...
strSQL = "select * from branche where Felt4='" & arrM(4) & "';"
Får jeg følgende fejl:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07) [Microsoft][ODBC Microsoft Access-driver] Datatyperne stemmer ikke overens i kriterieudtrykket
Under både UPDATE og DELETE har jeg lavet en response.write, som fortæller hvad der skal ske, og her skrives det rigtigt. Fx. DELETE 1003, UPDATE 1002 - så den tidligere sætning må tilsyneladende være rigtig... Den udfører dog ikke selve handlingen...????
if arrM(4)<>"" then strSQL = "select * from branche where Felt4='" & arrM(4) & "';" set rs = Conn.Execute(strSQL) if not rs.eof then found=true else found=false end if else found = false end if
arrM(4) er det, der fungerer som primærnøgle i databasen (en unik ID - den er dog ikke autogeneret), så den må ikke være blank.. det er kun de andre der må...
Ja, jeg har også lige testet det - genialt !!!! Den sidste ting er dog det med en tom celle. Hvis man i txt'en sletter et felt, så der står
UPDATE;;4;Stål;1001
Så fejler scriptet. Jeg ved ikke om man fra start kunne replace ;; med ;0 så der i databasen bare kommer til at stå 0 i de felter, der ikke benyttes??? Måske har du et mere prof forslag?
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.