ODBC Spaltenzahl einer Tabelle ermitteln

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Eckhard
Beiträge: 10
Registriert: 29.08.2004 20:58
Wohnort: Löhne

ODBC Spaltenzahl einer Tabelle ermitteln

Beitrag 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!
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Eckhard
Beiträge: 10
Registriert: 29.08.2004 20:58
Wohnort: Löhne

Beitrag 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!
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Mit obigen beispiel krieg ich keine Tabellennamen angezeigt.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Eckhard
Beiträge: 10
Registriert: 29.08.2004 20:58
Wohnort: Löhne

Beitrag 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!
rollo
Beiträge: 32
Registriert: 11.10.2004 14:41

Beitrag 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)
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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 ..
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
rollo
Beiträge: 32
Registriert: 11.10.2004 14:41

Beitrag 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?
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Zuletzt geändert von Rings am 11.10.2004 17:01, insgesamt 1-mal geändert.
Rings hat geschrieben:ziert sich nich beim zitieren
rollo
Beiträge: 32
Registriert: 11.10.2004 14:41

Beitrag 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
Antworten