Autor |
Beitrag |
NOS1971
Beiträge: 193
Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
|
Verfasst: Sa 12.07.14 16:43
Hallo zusammen,
irgendwie bekomme ich es nicht hin in dem ersten gefundenen Datensatz in einem SQLDataSet 2 Werte zu ändern und zu Posten.
Was mache ich falsch? .. ich bekomme immer den Fehler das der Datensatz nicht im richtigen Mode geöffnet sei. CurrentAddDataItem ist ein TSQLDataSet udn ich nutze SQLite3.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| CurrentAddItem.CommandText := 'SELECT * FROM ResultURLTable WHERE URL = "' + tempurlstring + '";'; CurrentAddItem.Open; if not CurrentAddItem.IsEmpty then begin CurrentAddItem.First;
TempParentSitesString := TField(CurrentAddItem.FieldByName('PARENTSITESLIST')).AsString + CurrentURL + sLinkSeperator; TempCurrentReferingLinks := TField(CurrentAddItem.FieldByName('REFERINGLINKS')).AsInteger + 1; CurrentAddItem.Edit;
TField(CurrentAddItem.FieldByName('REFERINGLINKS')).AsInteger := TempCurrentReferingLinks; TField(CurrentAddItem.FieldByName('PARENTSITESLIST')).AsString := TempParentSitesString; CurrentAddItem.Post;
CurrentAddItem.Close; |
Ich hoffe ihr könnt mir helfen.
Grüße,
Andreas
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 12.07.14 17:53
Könnte ja eventuell daran liegen daß TSQLDataSet eine unidirektionale Datenmenge ist und du daher nur mit SQL-Befehlen arbeiten kannst statt wie in deinem Beispiel mit Edit und Post:
Im Gegensatz zu herkömmlichen Datenmengen puffern unidirektionale Datenmengen keine Datensätze. Aus diesem Grund stehen für die Navigation nur die Methoden First und Next zur Verfügung. Es gibt keine integrierte Datenbearbeitung: Sie können die Daten einer SQL-Datenmenge nur bearbeiten, indem Sie explizit eine SQL-UPDATE-Anweisung verwenden oder die Datenmenge über einen Provider mit einer Client-Datenmenge verbinden. Funktionen, bei denen mehrere Datensätze in einem Puffer abgelegt werden müssen (z.B. Filter oder Lookup-Felder), werden nicht unterstützt.
|
|
NOS1971
Beiträge: 193
Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
|
Verfasst: Sa 12.07.14 18:01
Shit ... das wusste ich nicht und habe ich auch bei der suche nach antworten überlesen ... gibt es denn eine variante einer compo mit der ich zunächst einen datensatz suche und diesen auch direkt ändern kann denn die variante ist doch wesentlich langsamer wie ich finde.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| CurrentAddItem.CommandText := 'SELECT * FROM ResultURLTable WHERE URL = "' + tempurlstring + '";'; CurrentAddItem.Open; if not CurrentAddItem.IsEmpty then begin CurrentAddItem.First; TempParentSitesString := TField(CurrentAddItem.FieldByName('PARENTSITESLIST')).AsString + CurrentURL + sLinkSeperator; TempCurrentReferingLinks := TField(CurrentAddItem.FieldByName('REFERINGLINKS')).AsInteger + 1; CurrentAddItem.Close; CurrentAddItem.CommandText := ''; SQLQuery.Params.Clear; SQLQuery.Sql.Text := 'UPDATE ResultURLTable SET REFERINGLINKS = :REFERINGLINKS, PARENTSITESLIST = :PARENTSITESLIST WHERE URL = :URL;'; SQLQuery.ParamByName('URL').AsString := tempurlstring; SQLQuery.ParamByName('REFERINGLINKS').AsInteger := TempCurrentReferingLinks; SQLQuery.ParamByName('PARENTSITESLIST').AsString := TempParentSitesString; SQLQuery.ExecSql; TempLinkList.Add(tempurlstring + sLinkSeperator);} end |
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 12.07.14 22:32
Du hast doch die Professional Edition. Ist da nicht bei FireDAC der lokale Zugriff auf DBs auf dem gleichen PC dabei? Da sollte dann auch SQLite gehen. Und FireDAC ist deutlich besser als die meisten anderen Zugriffsbibliotheken.
Für diesen Beitrag haben gedankt: NOS1971
|
|
NOS1971
Beiträge: 193
Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
|
Verfasst: Sa 12.07.14 22:41
Ok ... werde ich mich alsbald ranmachen und entsprechend meldung machen
Danke sehr und einen schönen abend
|
|
NOS1971
Beiträge: 193
Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
|
Verfasst: Mo 14.07.14 13:26
Also die Umstellung auf FireDAC habe ich fast geschafft ... da ich aber nun kein TSQLDataBase Objekt mehr habe welches ich für das Syncen des Multithreadings nutze läuft mir das ganze bei mehr als einen thread vor die pumpe ... wenn ich das richtig gelesen habe sollte doch die connection die ich nutze das automatisch handeln ... oder muss ich nun die Connection in der art hier wrappen ?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| TMonitor.Enter(MultiThreadedWebAnalyser.AnalyserResultDataBase); try . Codeblock mit DB Zugriff . finally TMonitor.Exit(MultiThreadedWebAnalyser.AnalyserResultDataBase); end; |
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 14.07.14 13:38
|
|
NOS1971
Beiträge: 193
Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
|
Verfasst: Mo 14.07.14 13:52
Das wär ja dann Connection Pooling ... aber SQLite kann doch nur eine Connection ... oder verstehe ich das grad falsch ?
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 14.07.14 15:34
Das weiß ich nicht was SQLite in der Hinsicht kann, das habe ich nie mit mehreren Threads genutzt, aber dann bleibt ja noch die erste Möglichkeit.
(FDManager auf Active setzen und die Nutzung der Verbindung serialisieren, z.B. wie du geschrieben hast mit TMonitor.)
|
|
NOS1971
Beiträge: 193
Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
|
Verfasst: Mo 14.07.14 22:59
Hmmmm,
also ich finde nichts über nur eine connection ... also versuche ich mal mein glück und mache meldung wenn fertig
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 15.07.14 06:25
|
|
NOS1971
Beiträge: 193
Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
|
Verfasst: Di 15.07.14 11:50
Moin Moin ....
ich bezog das eher darauf ob man mit SQLite nur eine Connection nutzen kann
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 15.07.14 14:03
Ach so, aber auch das findest du in der Doku wie mir Google grad als erstes Ergebnis ausspuckt:
FIREDAC SQLITE THREADS
docwiki.embarcadero....nd_Cursors_in_SQLite
Für diesen Beitrag haben gedankt: NOS1971
|
|
NOS1971
Beiträge: 193
Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
|
Verfasst: Mi 16.07.14 10:13
Ich habe das alles so eingebaut aber ich bekomme es nicht hin sodass es nicht einen fehler nach dem anderen gibt sobald ich mehr als einen thread nutze .... snieff
FDManager erzeuge ich wie folgt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| DataBaseFileName := CombinePaths(CurrentTempFolder,'ResultDataBase.db'); ThreadManager := TFDManager.Create(nil); ConDefStringList := TStringList.Create; ConDefStringList.Add('Database=' + DataBaseFileName); ConDefStringList.Add('SharedCache=false'); ConDefStringList.Add('LockingMode=normal'); ConDefStringList.Add('Synchronous=normal'); ConDefStringList.Add('LockingMode=normal'); ConDefStringList.Add('CacheSize=60000'); ConDefStringList.Add('BusyTimeOut=30000'); ConDefStringList.Add('Pooled=true'); ThreadManager.AddConnectionDef('SQLite-Connection','SQLite',ConDefStringList); ConDefStringList.Free; |
Erzeugung der Connection und der Queries in jedem Thread:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| ResultDataBaseConnecton := TFDConnection.Create(nil); ResultDataBaseConnecton.LoginPrompt := false; ResultDataBaseConnecton.TxOptions.Isolation := xiSerializible; ResultDataBaseConnecton.UpdateOptions.LockWait := true; ResultDataBaseConnecton.ConnectionDefName := 'SQLite-Connection'; try ResultDataBaseConnecton.Connected := true; CurrentAnalyseItem := TFDQuery.Create(nil); CurrentAnalyseItem.Connection := ResultDataBaseConnecton; CurrentAddItem := TFDQuery.Create(nil); CurrentAddItem.Connection := ResultDataBaseConnecton; |
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 16.07.14 15:25
Ich habe noch nirgends gesehen, dass man den TFDManager selbst erzeugen muss, auch in der Doku steht das nicht. Wie kommst du darauf? Wir haben den einfach laut Doku auf Active gesetzt.
Wenn du an der globalen Instanz vorbei selbst einen erzeugst, glaube ich nicht, dass das etwas bewirkt.
Für diesen Beitrag haben gedankt: NOS1971
|
|
NOS1971
Beiträge: 193
Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
|
Verfasst: Mi 16.07.14 15:54
Ja ... das war wohl zunächst der Hauptfehler ... tausend dank ... mir war nicht wirklich klar das ich den TFDManager nicht auch erzeugen muss ... es rennt nun zumindest nicht mehr wie wild vor die pumpe sondern die threads laufen soweit ..... nun differieren scheinbar die anzahl der items in der db mit denen die analysiert werden ... ich tippe mal der status ob das item analysiert ist oder nicht wird nicht richtig geupdated ... da werde ich nun mal nach schauen ...
|
|