Seite 1 von 2

ODBC Spaltenzahl einer Tabelle ermitteln

Verfasst: 19.09.2004 16:03
von Eckhard
Hallo,

ich versuche schon seit gestern mit folgendem Prog die Anzahl der Spalten einer Tabelle zu ermitteln, das will irgendwie nicht gelingen. Wenn jemand von Euch da weiterhelfen könnte, würde ich mich sehr darüber freuen. Das kleine Programmbeisoiel hänge ich mal an.

Code: Alles auswählen

 #SQL_CURSOR_STATIC = 3
 #SQL_ATTR_CURSOR_TYPE = 6
 #SQL_ATTR_CONCURRENCY = 7
 #SQL_DBMS_VER = 18
 #SQL_DRIVER_NOPROMPT = 0
     #SQL_HANDLE_STMT = 3
     #sqlNoDataFound  = 100



Global hEnv.l, Alloc.l, hDbc.l, hStmt.l,Ret.b,intCols.l
Ergebnis.l = OpenLibrary(0,"ODBC32.dll") 
MessageRequester("DLL",Str(Ergebnis))
;' internal use
InitDatabase()
Dim sqlfield$(30) ; storage For fields in tables

If OpenWindow(0, 100, 100, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window")
  cbConnStr=0;
  strDataSource.s = "DBQ=c:\Gruppe.mdb;DRIVER={Microsoft Access Driver (*.mdb)}";***********************
  retcode= CallFunction(0,"SQLAllocEnv",@hEnv);
  retcode=CallFunction(0,"SQLAllocConnect",hEnv,@hDbc);
  retcode=CallFunction(0,"SQLSetConnectOption",hDbc,110,#SQL_CURSOR_STATIC)
  retcode=CallFunction(0,"SQLDriverConnect",hDbc,#NULL,strDataSource,Len(strDataSource),szConnStr,1024,@cbConnStr,#SQL_DRIVER_NOPROMPT)
  retcode=CallFunction(0,"SQLAllocHandle",#SQL_HANDLE_STMT,hDbc,@hStmt)
  retcode=CallFunction(0,"SQLSetStmtOptio",hStmt,#SQL_ATTR_CURSOR_TYPE,intResultSetType)
  retcode=CallFunction(0,"SQLSetStmtOption",hStmt,#SQL_ATTR_CONCURRENCY,intLockType)
  retcode=CallFunction(0,"SQLGetInfo",hDbc,#SQL_DBMS_VER,DriverVersion,slen,@cbInfoValue)
  retcode=CallFunction(0,"SQLAllocStmt",hDbc,@hStmt)
  retcode=CallFunction(0,"SQLTables",hStmt,0,-3,0,-3,0,-3,"TABLE",Len("TABLE"));
   Ret = CallFunction(0,"SQLFetch",hStmt)
    While Ret <> #sqlNoDataFound
           Owner.s = Space(254)
           Name.s = Space(254)
           Ret = SQLGetData_(hStmt, 4, 1, Owner, 254, 0)
           Ret = SQLGetData_(hStmt, 3, 1, Name, 254, 0)
           If Owner = "TABLE"
             Liste.s = Liste+Name+";"
           EndIf
      Ret = CallFunction(0,"SQLFetch",hStmt)
       Wend
MessageRequester("Liste",Liste)
SQL.s = "SELECT * FROM TABELLE";*********************************************

retcode= CallFunction(0,"ExecDirect",SQL);
Debug retcode
retcode=CallFunction(0,"SQLNumResultCols",hStmt,@intCols);

        
FieldCount = intCols
Debug FieldCount
  Repeat
  

    EventID.l = WaitWindowEvent()

    If EventID = #PB_EventCloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf

  Until Quit = 1
  
EndIf

End   
Vielen Dank schon mal

Eckhard!

Verfasst: 20.09.2004 12:43
von bobobo
Datenbankbefehle sind doch in PB eingebaut ..Da brauchst du das nicht selber machen.. Du musst dazu allerdings die DB's im ODBC anmelden was aber auch dynamisch geht.


Die Anzahl der Spalten ergibt dann databasecolumns() nach einer Selektion für alle Stellen (select top 1 * from tabelle ..z.B.)

Guck mal in die Hilfe bei Database

Verfasst: 20.09.2004 15:39
von Eckhard
Hi bobobo,

vielen Dank, das Du Dir die Zeit genommen hast mir zu antworten!

Da hast du sicher recht, das das auch mit den DB-Befehlen von PB geht. Da war nur das Problem, das es in PB keinen Befehl gibt um die Tabellen-Namen einer DB zu ermitteln, damit dann die SQL-Aufrufe einfacher zu generieren sind.

Das geht ja mit dem Beispiel oben schon mal.

Und dann habe ich in einem Beispiel-Code in C gesehen, das man wie oben versucht auch die Spaltenzahl einer Tabelle ermitteln kann - nur funktioniert das in PB nicht, da wird immer der Wert 5 zurückgegeben, ganz gleich ob die Tabelle 11 oder 7 oder x Spalten hat.

Ja, und jetzt bin ich einfach neugierig, was da wohl falsch ist in dem Beispiel, denn normalerweise sollte das doch gehen?

Nochmals vielen Dank und

Gruss
Eckhard!

Verfasst: 20.09.2004 15:48
von Rings
Mit obigen beispiel krieg ich keine Tabellennamen angezeigt.

Verfasst: 20.09.2004 15:58
von Eckhard
Hi Rings,

Das tut mir leid, das Du keine Tabellen-Namen angezeigt bekommst. Bis dahin funktioniert das hier aber, ich habe es gerade nochmal mit einer anderen DB getestet.

Dabei ist mir aufgefallen, das es evtl. an dem Aufruf

Code: Alles auswählen

retcode= CallFunction(0,"ExecDirect",SQL);
liegen könnte, denn den Tabellen-Namen im SQL-String hatte ich nicht verändert und für die Spaltenzahl kam wieder die 5 raus.

Gruss
Eckhard!

Verfasst: 11.10.2004 15:33
von rollo
Hallo!
Ich habe eine Rückfrage zur Antwort von Bobobo:
Er schrieb:
...Du musst dazu allerdings die DB's im ODBC anmelden was aber auch dynamisch geht.

Wie? Ein kleines Beispiel wäre schön.

...Guck mal in die Hilfe bei Database

Wo finde ich die denn?

Wer kann mir weiterhelfen. (Gehört nicht wirklich richtig zum Thema; aber betrifft auch ODBC)

Verfasst: 11.10.2004 15:51
von bobobo
@rollo
Ich hoffe Du meinst Windows ..

Das Anmelden von DB's im ODBC passierrt im ODBC-Manager.
Start - Ausführen - Systemeinstellungen -(Verwaltung) - ODBC-Datenquellen(ODBC)

dort erzeugst Du ne neue System-DSN .. Treiber auswählen .. Name
vergeben .. Datenbank angeben (Benutzer,Passwort je nach Bedarf)
fertig.. ( im Grunde sind das nur ein paar Einträge in der Registry die
man zur Not auch zu Fuss eingeben kann wenn man genau weiß was man
da tut !! VORSICHT BEI EDITIERUNGEN IN DER REGISTRY . DAS
SOLLTEN NUR SPEZIS TUN UND KEINE DAUS)

Rings hatte im Codearchiv (www.purearea.net) ein Demo (leider nur)
für ne dynamische DSNvergabe für MSSQL-Datenbanken zur Verfügung
gestellt.


ansonsten meinte ich mit der Hilfe zu Database die PB-Hilfe und dort die
Abteilung Database. Das sollte nicht allzuschwer zu finden sein .. PB-Editor
auf .. F1 drücken und so weiter ..

Verfasst: 11.10.2004 16:44
von rollo
@bobobo
Danke für die Antwort.
- Ich dachte du hättest eine über die Database hinausgehende Hilfe gewußt...

- Der manuelle Eintrag ist ja auch kein Problem.
Mir ging es um folgendes:
Wie kann ich unter Windows diesen ODBC-Eintrag per Programm automatisch realisieren, ohne dass ein Benutzereingriff nötig ist?
Es muss doch auch ohne Dialog gehen?
Wer hat Tips?

Verfasst: 11.10.2004 16:58
von Rings

Verfasst: 11.10.2004 16:58
von rollo
Hab vielleicht was gefunden...
Weiß aber noch nicht richtig wie ich dies in einem Programm anwenden soll?

http://msdn.microsoft.com/library/deu/d ... source.asp