Entwickler-Ecke

Datenbanken - Cannot access field 'XXXX' as type boolean beim auslesen


NOS1971 - Di 08.04.14 14:24
Titel: Cannot access field 'XXXX' as type boolean beim auslesen
Hi ... wie aus dem nichts bekomme ich beim auslesen des ersten boolschen wertes aus das db folgende meldung: Cannot access field 'DETECTPAGERANK' as type boolean beim auslesen

anbei mal der code des auslesens ... ich habe nicht die geringste ahnung warum das passiert ... sind boolsche werte ein problem ?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
  SettingsItem := TSQLDataSet.Create(nil);
  SettingsItem.SQLConnection := MultiThreadedWebAnalyser.AnalyserResultDataBaseConnecton;
  SettingsItem.CommandText := 'SELECT * FROM AnalyseSettingsTable;';
  SettingsItem.Open;
  if not SettingsItem.IsEmpty then
  begin
   // item found
   SettingsItem.First;
   // now load data into mtws core
   AnalyseURL := TField(SettingsItem.FieldByName('ANALYSEURL')).AsString;
   AnalyserMode := TField(SettingsItem.FieldByName('ANALYSERMODE')).AsInteger;
   DetectGooglePR := TField(SettingsItem.FieldByName('DETECTPAGERANK')).AsBoolean;
   StripOffURLParameters := TField(SettingsItem.FieldByName('STRIPOFFURLPARAMS')).AsBoolean;
   DetectFeedLinks := TField(SettingsItem.FieldByName('DETECTFEEDURLS')).AsBoolean;
   DetectImages := TField(SettingsItem.FieldByName('DETECTIMAGESANDFILES')).AsBoolean;
   DetectCSSFiles := TField(SettingsItem.FieldByName('DETECTIMAGESINFILESCSS')).AsBoolean;
   DetectXMLFiles := TField(SettingsItem.FieldByName('DETECTIMAGESANDFILESXML')).AsBoolean;
   DetectHTags := TField(SettingsItem.FieldByName('DETECTH1TOH6TAGS')).AsBoolean;
   MaxAnalysisItems := TField(SettingsItem.FieldByName('MAXURLSTOANALYSE')).AsInteger;
   UseProxyServer := TField(SettingsItem.FieldByName('USEPROXYSERVER')).AsBoolean;
   ProxyServer := TField(SettingsItem.FieldByName('PROXYSERVER')).AsString;
   ProxyUsername := TField(SettingsItem.FieldByName('PROXYUSERNAME')).AsString;
   ProxyPassword := TField(SettingsItem.FieldByName('PROXYPASSWORD')).AsString;
   ProxyServerPort := TField(SettingsItem.FieldByName('PROXYSERVERPORT')).AsInteger;
   MaxThreadCount := TField(SettingsItem.FieldByName('MAXTHREADCOUNT')).AsInteger;
   DeepSiteAnalysis := TField(SettingsItem.FieldByName('DEEPSITEANALYSIS')).AsBoolean;
   ThreadPriority := TThreadPriority(TField(SettingsItem.FieldByName('THREADPRIORITY')).AsInteger);
   CreationDelay := TField(SettingsItem.FieldByName('CREATIONDELAY')).AsInteger;
   ReadTimeOut := TField(SettingsItem.FieldByName('HTTPCONNECTIONREADTIMEOUT')).AsInteger;
   ConnectionTimeOut := TField(SettingsItem.FieldByName('HTTPCONNECTIONTIMEOUT')).AsInteger;
   MaxHTTPRedirect := TField(SettingsItem.FieldByName('HTTPCONNECTIONREDIRECTIONS')).AsInteger;
   MaxRetryCount := TField(SettingsItem.FieldByName('HTTPCONNECTIONSRETRIES')).AsInteger;
   MaxSleepTime := TField(SettingsItem.FieldByName('HTTPCONNECTIONRETRYMAXSLEEPTIME')).AsInteger;
   SleepTimeIncrementor := TField(SettingsItem.FieldByName('HTTPCONNECTIONRETRYMAXSLEEPTIMEINCREMENTOR')).AsInteger;
   MaxAuthRetries := TField(SettingsItem.FieldByName('HTTPAUTHENTIFICATIONRETRIES')).AsInteger;
   ProgressData.AddedCount := TField(SettingsItem.FieldByName('ADDEDCOUNT')).AsInteger;
   ProgressData.AnalysedCount := TField(SettingsItem.FieldByName('ANALYSEDCOUNT')).AsInteger;
   ProgressData.ProcessedCount := TField(SettingsItem.FieldByName('PROCESSEDCOUNT')).AsInteger;
   GlobalHCount := TField(SettingsItem.FieldByName('GLOBALHCOUNT')).AsInteger;
   GlobalH1Count := TField(SettingsItem.FieldByName('GLOBALH1COUNT')).AsInteger;
   GlobalH2Count := TField(SettingsItem.FieldByName('GLOBALH2COUNT')).AsInteger;
   GlobalH3Count := TField(SettingsItem.FieldByName('GLOBALH3COUNT')).AsInteger;
   GlobalH4Count := TField(SettingsItem.FieldByName('GLOBALH4COUNT')).AsInteger;
   GlobalH5Count := TField(SettingsItem.FieldByName('GLOBALH5COUNT')).AsInteger;
   GlobalH6Count := TField(SettingsItem.FieldByName('GLOBALH6COUNT')).AsInteger;
   GlobalInternalLinks := TField(SettingsItem.FieldByName('GLOBALINTERNALLINKS')).AsInteger;
   GlobalExternalLinks := TField(SettingsItem.FieldByName('GLOBALEXTERNALLINKS')).AsInteger;
   GlobalImageLinks := TField(SettingsItem.FieldByName('GLOBALIMAGELINKS')).AsInteger;
  end;
  SettingsItem.Close;
  Settingsitem.SQLConnection := nil;
  SettingsItem.Free;


Xion - Di 08.04.14 14:44

user profile iconNOS1971 hat folgendes geschrieben Zum zitierten Posting springen:
sind boolsche werte ein problem ?

Tendenziell: ja. Es hängt sehr davon ab, wie du deinen Boolean in die Datenbank schreibst...und auch, wie er abgespeichert wird und du ihn am Ende dann wieder erhälst. Viele Datenbanken kennen an sich garkeinen Boolean-Datentyp.
http://www.sqlite.org/datatype3.html hat folgendes geschrieben:
SQLite does not have a separate Boolean storage class. Instead, Boolean values are stored as integers 0 (false) and 1 (true).


Wenn es Probleme gibt, deklariere das Feld gleich selbst als Integer. Definiere selbst Konstanten für true und false auf Basis dieser Integer. Beim Lesen kannst du dann leicht von Hand testen. Beispiel als Pseudocode:


Delphi-Quelltext
1:
2:
3:
const DB_FALSE=0; DB_TRUE=1;
db.SetFieldByName('myBoolField').AsInteger := DB_TRUE;
result := not( db.GetFieldByName('myBoolField').AsInteger = DB_FALSE);


Es mag auch direkt mit boolschen Datentypen gehen, aber ich bevorzuge den Umweg über Integer da er
- gleichen Speicherbedarf hat,
- leicht zu verstehen ist,
- auf Nummer sicher geht.
Nachteilig kann sein, dass man dann auch in SQL-Abfragen, welche diese boolschen Felder benutzen, diesen Umweg gehen muss (aus Sicht der Abstraktion unschön).

Solltest du damit nicht zufrieden sein, dann zeige mal den Code dazu, wie du die Bools in die Datenbank schreibst.


NOS1971 - Di 08.04.14 14:57

Ich denke ich werde dann auch den etwas umständlicheren Weg gehen und die boolschen Werte in Integer umwandeln ...

Vielen Dank für die Erklärung und einen schönen Tag.

Grüße,
Andreas