Avatar billede maddog_em Nybegynder
22. november 2010 - 10:40 Der er 20 kommentarer og
2 løsninger

Tømme en kolonne i access

Hej

Jeg har et problem med at tømme en kolonne i access fra en asp fil.
jeg kender godt sql= "Delete * from table_name where area = 'E'"
så slettes en række, men hvoedan pokker sletter jeg indholdet i en bestemt kolonne, og hvordan får jeg nyt indhold ind igen?

Jeg har prøve med ALTER TABLE men uden held, hvis det er den rigtige vej at gå, så håber jeg der er en der kan smide et eksempel på sql statment - fordi jeg må gøre noget forkert.....
Avatar billede fennec Nybegynder
22. november 2010 - 10:52 #1
Som jeg opfatter dit problem, skal du bare opdatere med "tom" data:

update table_name set kolonneNavn=NULL where area = 'E'
Avatar billede maddog_em Nybegynder
22. november 2010 - 11:07 #2
Hej Fennec

vil det være muligt at gøre følgende:
update priser set 'E'= '"& request.form("u_newpris") &"'
Avatar billede hnteknik Novice
22. november 2010 - 12:17 #3
ja og du kan selektere ved at forsætte med & " where ....

Og pas nu SQL injection ved at teste om det er et tal, der kommer ind ;-)
Avatar billede maddog_em Nybegynder
22. november 2010 - 13:45 #4
Hmm - nu får jeg denne fejl:
Microsoft OLE DB Provider for ODBC Drivers fejl '80040e10'

[Microsoft][ODBC Microsoft Access-driver] Der er for få parametre. Der var ventet 1.

/Options/UpdatePris1.asp, linje 15


--------------min kode----------------------

Set Conn = Server.CreateObject("ADODB.Connection")
DBPath = "DBQ=" & server.mappath("/Members.mdb")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};"&DBPath

SQL = "update priser set '"& request.form("u_pris") &"' = '"& request.form("u_newpris") &"' "

Set rs = Conn.Execute(SQL)
conn.Close
Set Conn = Nothing
----------------slut på kode----------------------

dette er linje 15:
Set rs = Conn.Execute(SQL)

Jeg har andre steder på site hvor jeg skriver ned i databasen, så det er muligt...
Avatar billede fennec Nybegynder
22. november 2010 - 14:06 #5
Det er altid en god ide at udskrive din sql til skærmen hvis du oplever fejl.

Så sæt denne linje ind:

SQL = "update priser set '"& request.form("u_pris") &"' = '"& request.form("u_newpris") &"' "
response.write SQL &"<br>"
Set rs = Conn.Execute(SQL)

Evt med response.end lige efter write'en.

Men jeg gætter på du ikke har angivet kolonne navnet. Så din sql er nærmere noget ala:
SQL = "update priser set kolonne = '"& request.form("u_newpris") &"' where kolonne='"& request.form("u_pris") &"'"
Avatar billede fennec Nybegynder
22. november 2010 - 14:08 #6
Måske du heller skulle fortælle os helt præcis hvad du vil opdatere??

Hvad indeholder request.form("u_newpris") og request.form("u_pris") af værdi?
Avatar billede hnteknik Novice
22. november 2010 - 14:14 #7
Du skal update .... set [PRIS] =  request.form("u_newpris")

WHERE

[VAREID] = request.form("Vareid et eller andet")



glem den gamle pris.
Avatar billede maddog_em Nybegynder
22. november 2010 - 14:16 #8
hej igen - selvfølelig er det vigtig - beklager...

request.form("u_pris") = navn på kolonnerne A til og med E

request.form("u_newpris") = indholdet i rækkerne (tal)

databasen kan eks. indeholde dette
Id    A    B    C    D    E     
1    100    125  250  320  450

u_pris formen er en dropdown hvor der kan vælges ABCDE og u_newpris er et indtastningsfelt til at skrive i

det jeg gerne vil er så at kunne vælge evt. D i dropdown og skrive 360 i u_newpris hvorefter databasen skal opdateres til 360
Avatar billede maddog_em Nybegynder
22. november 2010 - 14:20 #9
hej hnteknik

det hjælper desværre heller ikke....

SQL = "update priser set '"& request.form("u_pris") &"'='"& request.form("u_newpris") &"' WHERE Id = 1 "

(one line)
Avatar billede maddog_em Nybegynder
22. november 2010 - 14:27 #10
stadig fejl:

-------fejl------------
UPDATE priser SET 'D'='360' WHERE Id = 1

Microsoft OLE DB Provider for ODBC Drivers fejl '80040e10'

[Microsoft][ODBC Microsoft Access-driver] Der er for få parametre. Der var ventet 1.

/Options/UpdatePris1.asp, linje 16
Avatar billede fennec Nybegynder
22. november 2010 - 14:42 #11
Hvis request.form("u_pris") skal du ikke have ' omkring. Men med fordel kan du smide [] i stedet.

Det skal bare være:
SQL = "update priser set ["& request.form("u_pris") &"]='"& request.form("u_newpris") &"'"

Denne sql bliver f.eks. til:

update priser set [E]='123'

hvilket opdatere ALLE e kolonner med værdien 123.
Avatar billede hnteknik Novice
22. november 2010 - 14:42 #12
Fejler denne her i Access ?

UPDATE priser SET 'D'='360' WHERE Id = 1

Hvor tabellen hedder [Priser]
og de variable hedder
[VareID] = 1
[Varepris] = 360

eller

360 skal vel være et tal go skal ikke i anføringstegn og det skal D heller ikke.
Jeg tror du blander tingene sammen. Kald dine variable noget du kan genkende så du ikke blander tingenen sammen.

Dette her skulle virke.

UPDATE PRISER set Varepris = " & request.form("Nyvarepris") & " WHERE VareID = " & request.form("valgtvareID")

Begge er tal, så de skal ikke i anførelsestegn.
Avatar billede fennec Nybegynder
22. november 2010 - 14:46 #13
Jeg vil dog KRAFTIGT fraråde at sende kolonne navne som form værdi, hvis det er noget alle og enhver har adgang til. Formdata kan manipuleres af brugerne som de ønsker og derfor kan de faktisk slette hele din database.

Send hellere 1, 2, 3, 4 ,5 og lav så et tjek for hvilken værdi og erstat med aktuel kolonne:

if request.form("u_pris") = "1" then
  kol="A"
elseif request.form("u_pris") = "2" then
  kol="B"
elseif request.form("u_pris") = "3" then
  kol="C"
...
else
  response.write "Error"
  response.end
end if
Avatar billede maddog_em Nybegynder
22. november 2010 - 14:48 #14
arrrr efter adskillige timer i weekenden også er løsningen så nem, at det er helt pinlig

hnteknik smid et svar, for nu virker det.............
Avatar billede maddog_em Nybegynder
22. november 2010 - 14:50 #15
kan jeg give fennec samme antal point, for det var jo denne linje response.write SQL &"<br>" der hjalp
Avatar billede fennec Nybegynder
22. november 2010 - 15:02 #16
.o) <-- One Eyed Jack
Avatar billede maddog_em Nybegynder
22. november 2010 - 15:06 #17
hey

kan det ikke lade sig gøre at både og hnteknik får 100 P hver?
Avatar billede hnteknik Novice
22. november 2010 - 15:23 #18
Det er altid godt at udskrive sin SQL sætninger, hvis det ikke makker ret. Klassisk ASP har en ringe debugging funktion. Husk nu at teste for hvad du får ind via request.form så du ikke bliver angrebet af SQL Injection fra nettet.

Når der er to svar kan du fordele. Tak anyway.,
Avatar billede fennec Nybegynder
22. november 2010 - 15:42 #19
Lige for at følge op på SQL injection som alle SKAL vide noget om.

Inden du skriver noget mere kode så tag lige et kik på hvad SQL injection er og hvordan man undgår det. Du kan lige så godt lære at undgå det fra starten så du ikke skal igennem 100 mill linjer kode bagefter.

http://www.4guysfromrolla.com/webtech/061902-1.shtml

I den forbindelse har jeg lavet nogle database funktioner, som jeg bruger til ALLE data, der skal i en SQL streng. De vigtige funktioner er DBText, DBNumber og DBDate, der dækker de 3 datatyper, som man kan smide i en databse. Du får lige hele min kode her:

function DBdate(funkDato)
    if MyIsDate(funkDato) then
        DBdate = ConstDateDele & ConvertDateToSQL(funkDato) & ConstDateDele
    else
        Response.write "'"& funkDato &"' is not valid date."
        response.end
    end if
end function

function DBNumber(funkNumber)
    if IsNum(funkNumber) then
        DBNumber = replace(funkNumber,",",".")
    else
        Response.write "'"& funkNumber &"' is not a number."
        response.end
    end if
end function

function DBText(funkText)
    DBText = replace(trim(funkText&"")&"","'","''")
end function

Function ConvertDateToSQL(dato)
    dim SQLYear,SQLMonth,SQLDay
    SQLYear = Year(dato)
    SQLMonth = right("0"&Month(dato),2)
    SQLDay = right("0"&Day(dato),2)
    if ConstDateFormat = 1 then
        ConvertDateToSQL = SQLMonth&"-"&SQLDay&"-"&SQLYear
    elseif ConstDateFormat = 2 then
        ConvertDateToSQL = SQLYear&SQLMonth&SQLDay
    else
        ConvertDateToSQL = SQLYear&SQLMonth&SQLDay
    end if
End Function

function IsNum(funkNumber)
    IsNum = isnumeric(funkNumber&"")
end function

function MyIsDate(dato)
dim returVal
returVal = false
if len(dato) = 10 then
  if isnumeric(left(dato,2)) then
  if cint(left(dato,2)) >= 1 and cint(left(dato,2)) <= 31 then
    if isnumeric(mid(dato,4,2)) then
    if cint(mid(dato,4,2)) >= 1 and cint(mid(dato,4,2)) <= 12 then
      if isnumeric(right(dato,4)) then
      if mid(dato,3,1) = "-" and mid(dato,6,1) = "-" then
        if isDate(dato) then
        returVal = true
        end if
      end if
      end if
    end if
    end if
  end if
  end if
end if
MyIsDate = returVal
end function
Avatar billede fennec Nybegynder
22. november 2010 - 15:47 #20
Alternativt kan man bruge sql parameter. Så klare systemet det selv, men jeg synes personlige det er lidt indviklet.

I mere advanceret sprog (som C#) bruger jeg dog kun sql parameter. Men oldschool ASP understøtter også sql parameter. Jeg har dog aldrig fundet en god tutorial af det til ASP.
Avatar billede fennec Nybegynder
22. november 2010 - 15:50 #21
...
Havde da lige glemt opsætningerne til datoformatet. Det er nemlig forskellige afhængig af hvilken database man bruger (Access, SqlServer...)

til Access skal der sætte disse:

ConstDateFormat = 1
ConstDateDele = "#"
Avatar billede maddog_em Nybegynder
23. november 2010 - 10:54 #22
Hold da op - der er lige lidt læsestof :)

men igen - tak for hjælpen
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
Kategori
Kurser inden for grundlæggende programmering

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