Avatar billede c9steen Nybegynder
21. februar 2003 - 08:39 Der er 12 kommentarer og
1 løsning

Opret Field IF NOT EXISTS

Hvordan kan jeg teste, om et felt allerede existerer i en Access DB og derefter oprette feltet, hvis det ikke er tilstede..?

Noget i retning af:

sQuery    = "ALTER TABLE datatable ADD NewField text WHERE NOT EXISTS NewField"


Thanks :-)
Avatar billede mortvader Nybegynder
21. februar 2003 - 08:46 #1
Jeg ved ikke om man kan tjekke om et felt eksisterer direkte i en SQL sætning, men det kan løses således:

dim cnt,i,feltfindes
cnt=table.fields.count-1
feltfindes=false
for i=0 to cnt
  if table.fields.item(i).name)="NewField" then feltfindes=true
next

if feltfindes then sQuery = "ALTER TABLE datatable ......
Avatar billede mortvader Nybegynder
21. februar 2003 - 08:47 #2
ups.. en parantes slut for meget..  det skal være:
if table.fields.item(i).name = "NewField" then feltfindes=true
Avatar billede somaliomar Praktikant
21. februar 2003 - 08:50 #3
Måske kan du bruge denne funktion. Den er godt nok skrevet til VB

Public Function FieldExists(DatabaseName As String, TableName _
As String, FieldName As String) As Boolean

'DataBaseName is the file/path name of the database
'with the field you want to test
'tablename is the table, fieldname is the field
'if database or table does not exist, an error is raised

Dim oDB As Database
Dim td As TableDef
Dim f As Field

On Error GoTo errorhandler

Set oDB = Workspaces(0).OpenDatabase(DatabaseName)
Set td = oDB.TableDefs(TableName)

On Error Resume Next
Set f = td.Fields(FieldName)
FieldExists = Err.Number = 0
oDB.Close

Exit Function

errorhandler:

If Not oDB Is Nothing Then oDB.Close
Err.Raise Err.Number
Exit Function

End Function
Avatar billede c9steen Nybegynder
21. februar 2003 - 08:59 #4
-> mortvader

Hvordan definerer jeg "table" i udtrykket: table.fields.count

/Steen
Avatar billede mortvader Nybegynder
21. februar 2003 - 09:01 #5
Åh, sorry:

det er mig der kalder et recordset for table.

conn=Server.CreateObject("ADODB.Connection")
conn.open DSN
table=Server.CreateObject("ADODB.Recordset")
table.activeconnection=conn
(det andet kode her)
Avatar billede c9steen Nybegynder
21. februar 2003 - 09:09 #6
-> mortvader:

Jeg har følgende kode:
======================

Set objConn = server.createobject("ADODB.connection")
objConn.Open "DBQ="&(Server.MapPath("../db/projekter.mdb")) &"; DefaultDir=DBQ="&(Server.MapPath(".")) &"\;Driver={Microsoft Access Driver (*.mdb)};"

Set objBrugerRec = server.createobject("ADODB.recordset")
objBrugerRec.activeconnection = objConn

dim cnt,i,feltfindes
cnt = objBrugerRec.fields.count-1            ' linie 22
feltfindes=false
for i=0 to cnt
  if objBrugerRec.fields.item(i).name="RefURL" then feltfindes=true
next

if feltfindes then
    sQuery    = "ALTER TABLE skemadata ADD RefURL text"
    Set objBrugerRec = objConn.Execute(sQuery)
End if


... og får følgende fejl:
=========================

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

Command text was not set for the command object.

/demo/MakeRefURL.asp, line 22
Avatar billede mortvader Nybegynder
21. februar 2003 - 09:12 #7
Set objConn = server.createobject("ADODB.connection")
objConn.Open "DBQ="&(Server.MapPath("../db/projekter.mdb")) &"; DefaultDir=DBQ="&(Server.MapPath(".")) &"\;Driver={Microsoft Access Driver (*.mdb)};"

Set objBrugerRec = server.createobject("ADODB.recordset")
objBrugerRec.activeconnection = objConn

objBrugerRec.open "select top 1 * from skemadata" ' prøv lige om ikke dette virker?

dim cnt,i,feltfindes
cnt = objBrugerRec.fields.count-1            ' linie 22
feltfindes=false
for i=0 to cnt
  if objBrugerRec.fields.item(i).name="RefURL" then feltfindes=true
next

if feltfindes then
    sQuery    = "ALTER TABLE skemadata ADD RefURL text"
    Set objBrugerRec = objConn.Execute(sQuery)
End if
Avatar billede c9steen Nybegynder
21. februar 2003 - 09:18 #8
Ny fejl:

[Microsoft][ODBC Microsoft Access-driver] Databasemotoren kan ikke låse tabellen "skemadata", fordi den allerede anvendes af en anden person eller proces.
Avatar billede mortvader Nybegynder
21. februar 2003 - 09:19 #9
luk access og prøv igen.
Avatar billede c9steen Nybegynder
21. februar 2003 - 09:20 #10
... mere:

if feltfindes then
    sQuery    = "ALTER TABLE skemadata ADD RefURL text"
    Set objBrugerRec = objConn.Execute(sQuery)    'linie 32
End if
Avatar billede mortvader Nybegynder
21. februar 2003 - 09:20 #11
og husk forresten at lukke recordsettet igen efter for-next løkken.
Avatar billede c9steen Nybegynder
21. februar 2003 - 09:29 #12
DONE - recordset skulle lukkes efter for-løkken.

Takker

/Steen :-)
Avatar billede mortvader Nybegynder
21. februar 2003 - 09:30 #13
Konge! ;)
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