Avatar billede Slettet bruger
25. maj 2005 - 19:04 Der er 71 kommentarer og
1 løsning

Svær Sql hjælp

Hej.

Jeg er igang med at lave noget med at rette i tabeller i en Access database.

Jeg har simpelt hen ikke fundet noget kode hvor man kan Rette i et felt i en tabel.
Feks lave feltet: Navn
om til: Navnet

og så har jeg også problemmer med at lave autonummenering når jeg opretter mit id felt.

Håber der er en sql og asp ekspert som kan hjælpe.

Bjarke
Avatar billede Søren Bech Morsing Praktikant
25. maj 2005 - 19:07 #1
og du kan ikke bare åbne din database i Access? så er det nok det nemmeste i hele verden.
Er det internet (du skriver ASP) så download databasen, ret og upload
Avatar billede Slettet bruger
25. maj 2005 - 19:16 #2
Det er jo ikke halv så smart som at redigerer online, så kan du gøre det lige hvor du er, og hvilken forbindelse du sidder på, uden at lukket siden ned i den periode hvor der uploades, og så der ikke forsvinder noget som en bruger har tilføjet, fordi du uploader en der er hentet lige inden, og så går det ikke stærkt når du ligger med database på flere MB.

Bjarke
Avatar billede busschou Praktikant
25. maj 2005 - 19:40 #3
Når du vil lave noget om i en tabel skal du benytte "Alter table"
Avatar billede busschou Praktikant
25. maj 2005 - 19:42 #4
ALTER TABLE din_tabel RENAME COLUMN gammelt_navn to nyt_navn;
Avatar billede busschou Praktikant
25. maj 2005 - 19:44 #5
Det skulle omdøbe din kollonne
Hvis du ønsker lave et felt med auto forøgelse så noget ala
ALTER TABLE MODIFY id int not null auto_increment;
Avatar billede busschou Praktikant
25. maj 2005 - 19:45 #6
skulle selvfølgelig være
ALTER TABLE din_tabel MODIFY dit_felt int not null auto_increment;
Avatar billede busschou Praktikant
25. maj 2005 - 19:46 #7
Jeg vil næsten foreslå dig at google på "sql alter" og lign. Så dukker der en masse eksempler op :o)
Avatar billede arne_v Ekspert
25. maj 2005 - 22:43 #9
Vi snakker MS Access ikke ??

Det må da være:

ALTER TABLE tabelnavn ALTER COLUMN feltnavn COUNTER;
Avatar billede Slettet bruger
26. maj 2005 - 12:51 #10
Hej igen, arnes ALTER kode virkede, men jeg kan ikke få det til at virke det med rename.

[Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl i ALTER TABLE-sætningen.

sql = "ALTER TABLE `test` RENAME COLUMN `et` to `etto`;"
Conn.execute(Sql)

Men det er faktisk meningen at der skal ændres i alt, altså både Felttypen (VarChar osv.) længde (op til 255) og så navnet.
Men det er ihvertifald en start at kunne omdøbe dem.
Jeg har prøvet at bruge det fra MSDN, med deres eksempel:

Dim rs, i
Set rs = CreateObject("ADOCE.Recordset.3.1")
rs.Open "CREATE TABLE changeme (f1 varchar)"
rs.Open "ALTER TABLE changeme TO changed"
rs.Open "ALTER TABLE changed RENAME f1 TO firstfield"
rs.Open "ALTER TABLE changed ADD secondfield varchar"
rs.Open "ALTER TABLE changed ADD lastfield varchar"
rs.Open "ALTER TABLE changed MOVE lastfield BEFORE firstfield"
rs.Open "changed"
For i = 0 To rs.fields.Count - 1
  MsgBox rs.fields(i).Name
Next
rs.Close
rs.Open "DROP TABLE changed"
Set rs = Nothing

Kan jeg ikke fatte hovde og hat i, og den melder også noget med noget Active-X.

Håber i kan hjælpe.

Bjarke
Avatar billede arne_v Ekspert
26. maj 2005 - 13:24 #11
jeg mener ikke at du kan gøre det direkte i ren SQL

workaround:

ALTET TABLE t ADD COLUMN ny type
UPDATE t SET ny=gl
ALTER TABLE DROP COLUMN gl

ellers skal du igang med at kigge på ADO objekterne
Avatar billede Slettet bruger
26. maj 2005 - 14:04 #12
hvis man ikke kan køre det ren sql, hvordan gør man så :S?
Avatar billede arne_v Ekspert
26. maj 2005 - 14:07 #13
som skrevet workaround med 3 x SQL eller noget ADO
Avatar billede arne_v Ekspert
26. maj 2005 - 14:09 #14
der er et VB6 eksempel nederst på http://forums.devshed.com/t104848/s.html?highlight=Long+field

det bør kunne omskrives til ASP/VBS
Avatar billede arne_v Ekspert
26. maj 2005 - 14:11 #15
http://www.4guysfromrolla.com/webtech/013101-1.shtml

viser hvordan du bruger ADOX fra ASP/VBS

de 2 stykker kode bør kunne merges

skriv hvis det driller - så kan jeg godt prøve at bixe et komplet eksempel
Avatar billede Slettet bruger
26. maj 2005 - 14:12 #16
jeg er ikke den helt store programmør og slet ikke til sådan noget her, jeg aner intet om andet en asp og php :S
Avatar billede arne_v Ekspert
26. maj 2005 - 14:35 #17
jeg prøver lige at bixe noget
Avatar billede arne_v Ekspert
26. maj 2005 - 14:39 #18
det er faktisk ikke så svært:

<% Option Explicit %>
<%
Dim cat
Set cat = Server.CreateObject("ADOX.Catalog")
cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb"
Dim tbl
Set tbl = cat.Tables("tabelnavn")
tbl.Columns("gammeltnavn").Name = "nytnavn"
%>
Avatar billede Slettet bruger
26. maj 2005 - 14:39 #19
Det lyde kanon :)
Avatar billede Slettet bruger
26. maj 2005 - 14:40 #20
jeg prøver at kigge på det, lidt senere.
Denne kode, den gør kun navnet bliver lavet om ikke?
Avatar billede arne_v Ekspert
26. maj 2005 - 14:46 #21
jo

men du kan sikkert også lave typen om

(men det kan man altså også med traditionel SQL)
Avatar billede arne_v Ekspert
26. maj 2005 - 14:46 #22
og et svar fra mig
Avatar billede Slettet bruger
26. maj 2005 - 14:48 #23
lige en sidste ting så :)
hvordan ville du lave det med type?
Svar på det og du får dine points :D
Avatar billede arne_v Ekspert
26. maj 2005 - 15:01 #24
tb.Columns("feltnavn").Type = adXxxxxxx

adXxxxxxxx konstanterne er listet her:

http://www.w3schools.com/ado/prop_type.asp
Avatar billede Slettet bruger
26. maj 2005 - 21:24 #25
Hej
Det virker :D

Jeg kan bare ikke lige få det til at virke med typerne.

Dim tbl
Set tbl = cat.Tables("test")
tbl.Columns("etto").Type = adVarChar

giver bare dette: Variablen er ikke defineret: 'adVarChar'

Hvad skal der gøres ved den?

Bjarke, som virkelige påskynder din hjælp :)
Avatar billede arne_v Ekspert
26. maj 2005 - 21:28 #26
jeg tror at du selv skal

Dim adVarChar
adVarChar = 200
Avatar billede arne_v Ekspert
26. maj 2005 - 21:31 #27
og med VARCHAR er en:

tbl.Columns("etto").DefinedSize = 50

nok også nyttig
Avatar billede Slettet bruger
26. maj 2005 - 21:33 #28
ok det vil jeg prøve, tusinde tak for hjælpen :D
Avatar billede Slettet bruger
27. maj 2005 - 10:14 #29
Hej igen

Jeg kan stadig ikke få det til at virke med typerne.

Der kommer denne fejl:
Denne handling er ikke tilladt i denne sammenhæng.

Dim adVarChar
adVarChar = 200
tbl.Columns("etto").Type = adVarChar (Fejlen er til denne linie)
tbl.Columns("etto").DefinedSize = 50 (Vil tro samme fejl kommer her)

Bjarke
Avatar billede arne_v Ekspert
27. maj 2005 - 10:32 #30
jeg er først i nærheden af min IIS i aften
Avatar billede Slettet bruger
27. maj 2005 - 10:49 #31
ok, jeg skal på tur i dag så kommer først på imorgen aften ;)
Avatar billede arne_v Ekspert
27. maj 2005 - 19:02 #32
Jeg har læst lidt !

.Type er readonly efter table creation.

Så tilbage til SQL:

ALTER TABLE tabelnavn ALTER COLUMN feltnavn VARCHAR(50);
Avatar billede Slettet bruger
29. maj 2005 - 18:29 #33
Tusinde tak for hjælpen det virker :D
Ikke for at være besværligt, men ved ud hvordan man finder ud af om det er en primær, når man bruger:

For Each Felt In rs.Fields

functionen, dem jeg bruger nu hedder Felt.Type, Felt.DefinedSize, Felt.Precision, Felt.NumericScale
Ved du hvad den hedder den man finder primær med?

Bjarke
Avatar billede arne_v Ekspert
29. maj 2005 - 18:39 #34
jeg mener at det må være:

For Each idx In tbl.Indexes
  If idx.PrimaryKey
      ' idx.Columns er en collection med alle kolonner som indgår i primary ket
  End If
Next idx
Avatar billede Slettet bruger
29. maj 2005 - 18:44 #35
I mit tilfælde ville det blive:

For Each Felt In rs.Fields
  If Felt.PrimaryKey
      response.write "Dette er en primary key!"
  End If
Next Felt

ikke?
Avatar billede arne_v Ekspert
29. maj 2005 - 18:56 #36
tror jeg ikke - Indexes på ADOX tablen - jeg kan lave et eksempel senere
Avatar billede Slettet bruger
29. maj 2005 - 21:42 #37
forresten så bruger jeg adSchemaTables. Har ledt mange steder men kan ikke finde det navn man skal bruge for at finde primary
Avatar billede Slettet bruger
29. maj 2005 - 21:45 #38
jo forresten tror måske jeg ahr fundet den. PRIMARY_KEY
Avatar billede arne_v Ekspert
29. maj 2005 - 22:46 #39
jeg tror at vi snakke rom noget forskelligt

men har du fået løst dit problem er alt jo OK

skriv hvis alligevel ikke virker
Avatar billede Slettet bruger
30. maj 2005 - 10:09 #40
Hej igen.

Det er mig der er dum, jeg kludrer rundt i det. Det var noget helt forkert jeg fandt.
Avatar billede Slettet bruger
30. maj 2005 - 12:56 #41
den kode jeg har nu ser således ud. (CA)

Const adSchemaTables = 20

Set rs = Server.CreateObject("ADODB.Recordset")
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath (""& db &"")
Conn.Open DSN


Set rs = Conn.OpenSchema(adSchemaTables)

Set rs = Conn.Execute("Select * From "&tabel&"")
For Each Felt In rs.Fields

response.write ""& Felt.Type &"<br>"
response.write ""& Felt.DefinedSize &"<br>"
response.write ""& Felt.Precision &"<br>"
response.write ""& Felt.NumericScale &"<br>"

Next
Avatar billede Slettet bruger
30. maj 2005 - 19:40 #42
men du må godt lave det på din:

For Each idx In tbl.Indexes
  If idx.PrimaryKey then
      End If
Next

Der kan jeg bare ikke få den til at vise navnet på feltet, idx.name udskriver noget mystisk
Avatar billede arne_v Ekspert
30. maj 2005 - 19:48 #43
20 minutter
Avatar billede arne_v Ekspert
30. maj 2005 - 20:06 #44
prøv lige den her:

<% Option Explicit %>
<%
Response.ContentType = "text/plain"
Dim db
db = "C:\Databases\MSAccess\Test.mdb"
Dim cat
Set cat = Server.CreateObject("ADOX.Catalog")
cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & db
Dim tbl
For Each tbl In cat.Tables
    Response.Write "tabel " & tbl.Name & vbCrLf
    Dim col
    For Each col In tbl.Columns
        Response.Write "  kolonne " & col.Name & " " & col.Type & " " & col.DefinedSize & vbCrLf
    Next
    Dim idx
    For Each idx In tbl.Indexes
        Response.Write "  index " & idx.Name & " " & idx.PrimaryKey & vbCrLf
        Dim idxcol
        For Each idxcol In idx.Columns
            Response.Write "    index kolonne " & idxcol.Name & vbCrLf
        Next
    Next
Next
%>
Avatar billede arne_v Ekspert
30. maj 2005 - 20:07 #45
den burde vise alt
Avatar billede Slettet bruger
30. maj 2005 - 21:33 #46
Sådan :D det virker, du er for sej til det der programmering ;)
Jeg har lige et spørgsmål eller to mere..
Kan man via asp slette et primær felt?
Kan man via asp fjerne autonummering?
Kan man ændre felt størrelsen på et Integer felt?

Skal jeg ikke oprette et nyt indlæg, jeg synes jeg har kørt dig langt på de her 200 points?

Bjarke
Avatar billede arne_v Ekspert
30. maj 2005 - 21:36 #47
det giver nok problemer med 200 reglen hvis du giver flere point
Avatar billede Slettet bruger
30. maj 2005 - 21:37 #48
jammen det er jo nye spørgsmål hele tiden.. må man så ikke?
Avatar billede arne_v Ekspert
30. maj 2005 - 21:38 #49
re 1) måske - skal formentligt ske via ALTER TABLE Igen
re 2) du kan ændre felt typen fra COUNTER til INTEGER med en ALTER table
re 3) jeg vil tro at du med en ALTER TABLE Kan ændre fra VARCHAR(20) til VARCHAR(40)
Avatar billede arne_v Ekspert
30. maj 2005 - 21:39 #50
nej - så skal de oprettes som seperate spørgsmål fra start af
Avatar billede Slettet bruger
30. maj 2005 - 21:41 #51
1) Når jeg prøver at bruge den alter jeg normalt sletter med, så vil den ikke sltte primær
2) Det prøver jeg :)
3) Det virker fint når det er varchar, men den vil ikke når det er integer, og kan ikke finde ud af hvad man skal lave anderledes ved en integer :(
Avatar billede arne_v Ekspert
30. maj 2005 - 21:45 #52
re 1) det skal nok først være en ALTER som ændrer primary key constrainten

re 3) du kan ikke ændre størrelsen på en integer (kun vælge en anden integer type)
Avatar billede Slettet bruger
30. maj 2005 - 22:03 #53
ok :), ved du hvordan laver "en ALTER som ændrer primary key constrainten
"?
Avatar billede arne_v Ekspert
30. maj 2005 - 23:09 #54
alter table e drop constraint PrimaryKey;
alter table e add constraint PrimaryKey primary key(id);
Avatar billede Slettet bruger
31. maj 2005 - 20:20 #55
Hej igen, når jeg vil slette den med din kommer denne besked:

[Microsoft][ODBC Microsoft Access-driver] CHECK-begrænsning 'PrimaryKey' findes ikke.

Koden ser således ud:

sql = "ALTER TABLE `test` DROP constraint PrimaryKey"
Set rs = Conn.execute(Sql)
Avatar billede arne_v Ekspert
31. maj 2005 - 20:26 #56
check med 30/05-2005 20:06:49 hvad den constraint hedder
Avatar billede Slettet bruger
31. maj 2005 - 20:44 #57
??? check med 30/05-2005 20:06:49 :S
Avatar billede arne_v Ekspert
31. maj 2005 - 20:52 #58
den stump kode viser hvad PrimaryKey hedder i din database
Avatar billede arne_v Ekspert
31. maj 2005 - 20:55 #59
jeg får

tabel E
  kolonne id 3 0
  kolonne id2 3 0
  index PrimaryKey True <-------------------------
    index kolonne id
  index id False
    index kolonne id
  index id2 False
    index kolonne id2
Avatar billede Slettet bruger
31. maj 2005 - 20:55 #60
nåå hehe så constraint skal erstates med feks. Id eller hvad?
Avatar billede Slettet bruger
31. maj 2005 - 22:01 #61
nåå nu er jeg med.
Men den jeg normlat har siger bare at man ikke kan slette en primary, men den har ikke constraint ind i alter, jeg vil gå ned og prøve, håber det virker
Avatar billede Slettet bruger
01. juni 2005 - 10:19 #62
Jeg er lost, har prøvet alverdens kombinationer.

sql = "ALTER TABLE `test` DROP constraint(id)"
giver:
[Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl i ALTER TABLE-sætningen.

sql = "alter table test drop constraint PrimaryKey"
giver:
[Microsoft][ODBC Microsoft Access-driver] CHECK-begrænsning 'PrimaryKey' findes ikke.

sql = "alter table test drop constraint id"
giver:
[Microsoft][ODBC Microsoft Access-driver] CHECK-begrænsning 'id' findes ikke.
Avatar billede arne_v Ekspert
01. juni 2005 - 10:22 #63
Hvad hedder din primary key constraint ?

(svarende til mit output postet 31/05-2005 20:55:01)
Avatar billede Slettet bruger
01. juni 2005 - 13:23 #64
Altså den hedder id så burde koden hedder:
sql = "alter table test drop id PrimaryKey"

men det giver:
[Microsoft][ODBC Microsoft Access-driver] Et felt, der indgår i et indeks eller er krævet af systemet, kan ikke slettes.
Avatar billede arne_v Ekspert
01. juni 2005 - 13:34 #65
kan du ikke lige poste det output ?

id lyder som feltets bavn ikke som constraintens navn
Avatar billede Slettet bruger
01. juni 2005 - 13:40 #66
ahhh vi snakker 2 forskellige ting, jeg troede at du mente navn når du sagde constraintens. Hvad kan der feks stå istedet, tror jeg ved hvad du mener, skal bare lige se :)
Avatar billede Slettet bruger
01. juni 2005 - 15:36 #67
tabel test
  kolonne et 203 0
  kolonne fem 3 0
  kolonne fire 202 50
  kolonne id 3 0
  index id Falsk
    index kolonne id
Avatar billede arne_v Ekspert
01. juni 2005 - 15:40 #68


du har ikke en primary key lige nu

og så kan du ikke slette den
Avatar billede Slettet bruger
01. juni 2005 - 15:40 #69
det er den der hedder id der er primary key, jeg forstår bare ikke hvorfor den siger falsk, på de fleste andre siger den sand, men det er den der id, hvad skal der så stå i stedet for "constraintens"?
Avatar billede Slettet bruger
01. juni 2005 - 15:41 #70
jeg har lige tjekket den er sat til primær og til autonummering så det er den
Avatar billede Slettet bruger
01. juni 2005 - 15:55 #71
ok nu tager jeg så en af tabllerne hvor det virker:

tabel soeg
  kolonne beskrivelse 203 0
  kolonne id 3 0
  kolonne sogeord 203 0
  kolonne titel 202 25
  kolonne url 202 100
  index PrimaryKey Sand
    index kolonne id

hvad skal jeg så sætte ind?
Men jeg kan ikke forstå hvorfor den ikke vil vise sand på nogen af dem. Du kan hente database og output fra din kode her, hvis det er:
http://bjarkes.dk/Maerkeligt.zip
Avatar billede Slettet bruger
03. juni 2005 - 15:27 #72
nå ok, jammen så prøver jeg bare selv, tusinde tak for hjælpen :D Har givet dig 5 karma, har adlrig prøvet at få så god hjælp før :)

Bjarke
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