Datenbankabfrage klappt nicht

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
exit
Beiträge: 36
Registriert: 24.03.2008 12:17
Computerausstattung: - Windows 10
- PureBasic 5.62

Datenbankabfrage klappt nicht

Beitrag von exit »

Hallo,

in den paar Testzeilen unten möchte ich aus einer vorhanden Datenbank ein paar Daten aus der Zeile mit der Auftragsnummer xyz auslesen.

Die Datenbank kann ich aus der Vorgängerversion dieses Testcodes ansprechen. Sobald ich anfange SELECT weiter zu spezifizieren (filtern) bekomme ich Probleme.

Hier bekomme ich nun die Meldung:
[Microsoft][ODBC Microsoft Access Driver] 1 Parameter wurden erwartet, aber es wurden zu wenig Paramter übergeben.

Was ist falsch????

Code: Alles auswählen

If UseODBCDatabase() = 0
  MessageRequester("Error", "Can't initialize Database (ODBC v3 or better) environment", 0)
  End
EndIf

  result = OpenDatabase(0,"Auftraege_WV","admin","")   
 
 
  If result > 0  
      MessageRequester("Hinweis", "Testdatenbank ist offen",#PB_MessageRequester_Ok )  
    Else
      MessageRequester("Fehler", "Testdatenbank konnte nicht geöffnet werden!",#PB_MessageRequester_Ok ) 
  EndIf  
 

  SQL_Abfrage$="SELECT  Qualität, Korn, Breite, Laenge FROM querschneider WHERE Auftrag_Nr = 589504"


  OpenConsole()  
 

  If DatabaseQuery(0, SQL_Abfrage$)  
   
      Qualitaet$ = (GetDatabaseString(0, 4))
      Korn$ = (GetDatabaseString(0, 6))
      Breite$ = (GetDatabaseString(0, 8))
      Laenge$ = (GetDatabaseString(0, 9))
      
 
      PrintN (Qualitaet$ + " / " + Korn$ + " / " +Breite$ + " / " +Laenge$)
 
      CloseDatabase(0)  
  EndIf 

Fehler$ = DatabaseError()

MessageRequester("Fehler",Fehler$)  

Fehler$ = DatabaseError()

;CloseConsole() 
- Windows 10
- PureBasic 5.62
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Datenbankabfrage klappt nicht

Beitrag von Kiffi »

auf den ersten Blick fällt mir folgendes auf:

* Bei der Reihenfolge der Felder in Deiner Abfrage müssten die GetDatabaseString()-Anweisungen wie folgt aussehen:

Code: Alles auswählen

      Qualitaet$ = (GetDatabaseString(0, 0))
      Korn$ = (GetDatabaseString(0, 1))
      Breite$ = (GetDatabaseString(0, 2))
      Laenge$ = (GetDatabaseString(0, 3)) 
* Umlaute in Datenbank(-abfragen) sind generell eine schlechte Idee. Ich
weiß nicht, wie Deine Datenbank auf 'Qualität' reagiert und ob ein weiterer
Fehler u.U. hier zu suchen ist.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
exit
Beiträge: 36
Registriert: 24.03.2008 12:17
Computerausstattung: - Windows 10
- PureBasic 5.62

Beitrag von exit »

Ich habe Qualität mal herausgenommen. Siehe Code unten. Leider bleibt die Fehlermeldung.

Korn$, Breite$ und Laenge$ sind die Spalten 6,8 und 9. Das muss doch gehen oder?.

Wie gesagt, vereinfache ich die Abfrage kann ich auf alle Daten zugreifen. Ich brauche jedoch nur die Daten einer Zeile (Auftrags_Nr).

Code: Alles auswählen

 SQL_Abfrage$="SELECT   Korn, Breite, Laenge FROM querschneider WHERE Auftrag_Nr = 589504"

  OpenConsole()  
 

  If DatabaseQuery(0, SQL_Abfrage$)  
   
      ;Qualitaet$ = (GetDatabaseString(0, 4))
      Korn$ = (GetDatabaseString(0, 6))
      Breite$ = (GetDatabaseString(0, 8))
      Laenge$ = (GetDatabaseString(0, 9))
- Windows 10
- PureBasic 5.62
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

exit hat geschrieben:Korn$, Breite$ und Laenge$ sind die Spalten 6,8 und 9.
nein, sind sie nicht. Das sind die Spalten 0, 1 und 2.
Bitte mein Posting oben lesen!

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

so ist es....

Wenn du * benutzt, würde das an den stellen sein, die du meinst... also so :

Code: Alles auswählen

SELECT  * FROM querschneider WHERE Auftrag_Nr = 589504" 
dann würdest du die komplette Datenzeile einlesen. Dann wäre dein Qualität
auf Platz 4, dein Korn auf Platz 6 usw.

Aber da Du nach Select spezifizierst, was du als ergebnis haben möchtest, sortiert die
DB das gleich so hin wie es in der Select abfrage drinsteht. Also 0,1,2,3.

sollte das immer noch probleme bereiten, versuche mal das zeichen ` mit anzugeben
(hat bei mir schon öfters daran gehapert. Ähm Chr(96)

das es so aussieht :

Code: Alles auswählen

SELECT  `Qualität`,`Korn`,`Breite`,`Laenge` FROM `querschneider` WHERE `Auftrag_Nr` = 589504" 
Edit : Und wenn das immer noch nicht so will, dann solltest du das Qualit ä t in
der Datenbankstruktur ändern oder Du kannst nur die komplette Zeile mit * einlesen....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
exit
Beiträge: 36
Registriert: 24.03.2008 12:17
Computerausstattung: - Windows 10
- PureBasic 5.62

Beitrag von exit »

Es funktioniert nun. Ich habe den Code um den Befehl

Code: Alles auswählen

While NextDatabaseRow(0)

.....
erweitert. Nun läuft der Testaufbau und ich kann weitermachen. Ich werde mal anfragen ob man das "ä" von Qualität entfernen kann. Mir werden die Daten nur zur Verfügung gestellt.

Dank Euch beiden für die Hilfe :allright:

Code: Alles auswählen

If UseODBCDatabase() = 0
  MessageRequester("Error", "Can't initialize Database (ODBC v3 or better) environment", 0)
  End
EndIf

  result = OpenDatabase(0,"Auftraege_WV","admin","")   
 
;-------------------------------------------------------- 
  If result > 0  
      MessageRequester("Hinweis", "Testdatenbank ist offen",#PB_MessageRequester_Ok )  
  Else
      MessageRequester("Fehler", "Testdatenbank konnte nicht geöffnet werden!",#PB_MessageRequester_Ok ) 
  EndIf  
;--------------------------------------------------------

 SQL_Abfrage$= "SELECT  Qualität, Korn, Breite, Laenge FROM querschneider WHERE Auftrags_Nr = 589649"
 
;--------------------------------------------------------
  If DatabaseQuery(0, SQL_Abfrage$)  

      While NextDatabaseRow(0)
   
        Qualitaet$ = (GetDatabaseString(0, 0))
        Korn$ = (GetDatabaseString(0, 1))
        Breite$ = (GetDatabaseString(0, 2))
        Laenge$ = (GetDatabaseString(0, 3))
 
      Wend

      Debug Qualitaet$
      Debug Korn$
      Debug Breite$
      Debug Laenge$
 
      CloseDatabase(0)
        
   Else ;- - - - - - - - - - - - - - - - - - - - - - - - 

      Fehler$ = DatabaseError()
      MessageRequester("Meldung",Fehler$)  

  EndIf
;--------------------------------------------------------
- Windows 10
- PureBasic 5.62
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

exit hat geschrieben:Es funktioniert nun. Ich habe den Code um den Befehl

Code: Alles auswählen

While NextDatabaseRow(0)

.....
erweitert.
gnii, habe ich glatt übersehen :lol:

Kleine Anmerkung noch: Du solltest Deinen Code so abändern, dass auch
im Fehlerfall die Datenbank geschlossen wird.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Kiffi hat geschrieben:
exit hat geschrieben:Es funktioniert nun. Ich habe den Code um den Befehl

Code: Alles auswählen

While NextDatabaseRow(0)

.....
erweitert.
gnii, habe ich glatt übersehen :lol:
Uppsala... ich auch :D
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten