Jeg har en side med en form med mere end 30 felter. Disse skal indsættes i database (Access), men jeg gider (ja... jeg er en doven hund!) ikke at skrive den lange SQl... kan man ikke, evt. via et loop, få den til at fange lægge alle felterne og deres værdier ind i en SQl streng?
Som du kan se er det kun alm. tekst felter... og jeg kan sagtens lave SQL'en... men tænkte bare at det var nemmere at lave et loop der kunne kunne lave den... og som er uafhængig af om der er 10 eller 100 felter...
Hmm... jeg kan se forskellige løsninger på denne her (for du kan jo nok ikke bruge feltnavnene i formularen til at skrive i databasen, for der er vel ikke nogen sammenfald mellem feltnavne i formular og databasen... eller hvad?
Anyway! Du kan gøre det at du definerer en streng med feltnavnne i asp-filen (serverside scriptet) som du benytter til at agere feltliste ifht. databasen og hvis du skal være helt sikker, laver du en parring med hvert feltnavn til et formularfelt, så der ikke er nogen tvivl om hvordan data hører sammen.
strSQL = "UPDATE reklame SET " for idx = 0 to ubound(arrDBFields) strSQL = strSQL & arrDBFields(idx) & " = " if arrDBFieldTypes(idx) = "s" then strSQL = strSQL & "'" end if strSQL = strSQL & Request.Form(arrFrmFields(idx)) if arrDBFieldTypes(idx) = "s" then strSQL = strSQL & "'" end if if idx < ubound(arrDBFields) then strSQL = strSQL & "," else strSQL = strSQL & " " end if next strSQL = strSQL & "WHERE " & strDBIDField & " = " & Request.Form(strFrmIDField) getUpdateSQL = strSQL end function
function getInsertSQL() strSQL = "INSERT INTO reklame (" & strDBFields & ") " arrDBFieldTypes = Split(strDBFieldTypes,",") arrFrmFields = Split(strFrmFields,",") for idx = 0 to ubound(arrFrmFields) if arrDBFieldTypes(idx) = "s" then strSQL = strSQL & "'" end if strSQL = strSQL & Request.Form(arrFrmFields(idx)) if arrDBFieldTypes(idx) = "s" then strSQL = strSQL & "'" end if if idx < ubound(arrFrmFields) then strSQL = strSQL & "," else strSQL = strSQL & ")" end if next getInsertSQL = strSQL end function
Nu siger du nok: "Jamen det der er jo mere besværligt end bare at skrive SQL-sætningen!?", hvortil jeg så kan svare, "Ja, hvis du skal skrive dette hver gang", men det skal du jo ikke, for næste gang skal du bare angive feltlisterne og så kalde funktionerne med de nye feltlister og så har du (med lidt mere arbejde) nogle generiske funktioner til at generere INSERT- og UPDATE-sætninger mod din database... :)
NB: Funkionerne er ikke "perfekte" endnu, men de skitserer da en mulig løsningsstrategi...
Nu er jeg måske dum... og burde have fortalt dig at navnene matcher. Jeg benytter de samme navne i min database som jeg benytter i min form.
Gider du at forsøge at knække den igen? Jeg kigger lige på det du har lavet imens... men vi er vel enige om at det bliver nemmere hvis forudsætningen om samme navn holder?
Well, faktisk tror jeg du får nogle udfordringer med knapper og andre kontroller som ikke skal med i databasen eller som har sammensatte værdier, f.eks. checkbox eller multiselects. For at håndtere dette er du næsten nød til at lave en ekskluderingsliste (i stedet for den inkluderingsliste jeg benyttede mig af før).
Du skal under alle omstændigheder definere datatypen af de enkelte felter, med mindre alle felter er af en teksttype (tekst eller memo i Access).
Jeg er tilbøjelig til bare at generere strDBFields og strFrmFields og så bare bruge de samme funktioner som før...
for each fld in request.form strDBFields = strDBFields & fld & "," next strDBFields = left(strDBFields, len(strDBFields) - 1) strFrmFields = strDBFields
men du skal som sagt have fundet en metode til at definere feltttypene til de enkelte felter...
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.