RECALL ALL Command mittels OLEDB
-
2012年1月18日 上午 10:55
Hat das schon jemand hinbekommen?
Ich finde hierzu auch keine Infos im Internet. Nur Leute die dasselbe Problem haben, dass der RECALL ALL Command nicht funktioniert.
Ich hab schon folgendes versucht:
OleDbConnection con = new OleDbConnection(@"Provider=VFPOLEDB.1;Data Source=C:\Temp");
con.Open();
OleDbCommand cmd = new OleDbCommand("USE TESTDBF;RECALL ALL", con);
cmd.ExecuteNonQuery(); // Hier kommt der Fehler "Der Befehl enthielt mindestens einen Fehler
// nächster Versuch
cmd = new OleDbCommand("RECALL ALL", con); // gleicher fehler
cmd = new OleDbCommand("RECALL ALL IN TESTDBF", con); // gleicher fehler
Keine Ahnung was ich jetzt noch versuchen kann. Der Command "SET DELETED OFF" funktioniert, aber die Datensäte sind dann nach wie vor als gelöscht markiert. Daher ist der RECALL Befehl eigentlich genau das was ich benötige.
Vielen Dank
Jochen Stümpfig
所有回覆
-
2012年1月18日 下午 06:21
Ich kann Dir leider nicht so richtig helfen da ich mich mit dem OleDB nicht so gut auskenne,
Aber : wo gibst Du denn überhaupt an welche Datei gemeint ist. Ich seh bloss ein Verzeichnis.
Und zu deleted off: in Fox werden Sätze zum Löschen markiert und mit dem Befehl "Pack" wird die Datei
komprimiert unter Auslassung der als gelöscht markierten Sätze. "set deleted on/off" ist dann nur ein
Schalter der dazu dient diese als gelöscht markierten zu berücktsichtigen (bei der Anzeige oder dem Durchblättern) oder nicht.
Wenn Du die Löschung in diesem Stadium rückgängig machen willst ist recall (all) schon der richtige Befehl.
Teste dann vielleicht mal ob andere Befehle auf diese Art funktionieren.
hth
Horst
-
2012年1月18日 下午 09:18
Vielen Dank für die Antwort.
Der Befehl Pack funktioniert "Pack [DBF Dateiname]". Diesen Befehl kann ich ausführen und alle als gelöscht gekennzeichneten sind weg. Nur der Recall geht nicht. Ich kapier es nicht.
-
2012年1月19日 上午 06:57
Dein Versuch mit "RECALL ALL in..." müsste klappen aber TESTDBF dann auch in Hochkomma oder
[ ], also "RECALL ALL in [TESTDBF]". ( evtl. auch ' anstelle [ )
Beachte vielleicht noch das nach dem "in" der Tabellenalias gemeint ist , nicht unbedingt der Tabellenname.
Ich weiß ja nicht wie die Tabelle geöffnet wurde. Wenn z.B mit "use Lager alias Depot" musst Du hier
[in Depot] nehmen.
VG
Horst
-
2012年1月19日 上午 07:00
Hi Jochen,
irgendwie habe ich kein gutes Gefühl dabei, wenn Du gelöschte Datensätze wieder herstellen musst. Klar, soetwas kann sicherlich mal passieren, aber notwendig sollte das eigentlich nicht sein.
Wenn Deine Anwender dazu neigen, zu leichtfertig ihre Daten zu löschen, dann ist es evtl. sinnvoller, die Datensätze erst gar nicht zu löschen, sondern in eine Backuptabelle zu verschieben.
Alternativ wäre auch ein eigenes Feld hilfreich, das den Satzzustand reflektiert. Dadurch stehen Dir dann noch weitere Möglichkeiten zur Verfügung, um den 'Zustand' Deiner Daten zu definieren.
Gruss / Best regards -Tom 010101100100011001010000011110000101001001101111011000110110101101110011 -
2012年1月19日 上午 07:46
PACK some.dbf geht, weil es die dbf Datei im Zweifelsfall öffnet. RECALL kann sich dagegen wie viele Kommandos nur auf bereits geöffnete Tabellen beziehen. Und leider reicht es nicht vorab USE some.dbf abzusetzen, weil zwei einzelne ExecuteNonQuery() selbst der gleichen Connection Foxproseitig nicht in einer Datensitzung arbeiten. Was Du absetzen mußt ist also ein EXECSCRIPT(), was in seinem Skript dann 1. die Tabelle öffnet und 2. RECALL ALL ausführt.
Du hast das ja fast schon probiert, nur ist ; in Foxpro kein Befehlstrenner, Befehle werden immer mit Zeilenumbruch getrennt:
OleDbCommand cmd = new OleDbCommand("ExecScript('USE TEST.DBF'+Chr(13)+'RECALL ALL')", con);
Beachte: Chr(13) führt VFP aus, es ist teil des OleDbCommands. Daneben würde Dir auf jeden Fall SET DELETED OFF alle Daten rausreichen. Weswegen ist es wichtig, die Sätze im DBF ohne Löschflag zu haben? Dir ist bewußt, daß Du damit eigentlich Müll wieder aus dem Mülleimer holst? Wenn Du das bewußt so nutzen willst, wäre ein anderes Flag, ein echtes logisches/boolsches Feld statt das Deleted Flag sinnvoller, wie Tom ja auch schon sagte.
Tschüß, Olaf.
- 已編輯 Olaf DoschkeMicrosoft Community Contributor 2012年1月19日 上午 07:47
- 已編輯 Olaf DoschkeMicrosoft Community Contributor 2012年1月19日 上午 08:44
- 已提議為解答 Tom Borgmann 2012年1月19日 上午 10:30
-
2012年1月19日 上午 09:14
Vielen Dank für die Antworten.
Funktioniert einwandfrei.
Zum Hintergrund: warum ich gelöschte Sätze wieder herstellen will ist der, dass wir ein RPG-Programm von 1976 im Einsatz haben, welches die Daten erstellt. In diesem Programm eine neue Spalte hinzuzufügen ist im Prinzip ausgeschlossen, (also ich kann es nicht). Meine Aufgabe ist es eben jetzt mit C# eine Anwendung zu schreiben, welche Sätze verarbeitet und dafür sorgt, dass im Fehlerfall, bereits gelöschte Sätze wiederhergestellt werden.
Daher der Ansatz.
Jochen
-
2012年1月20日 上午 08:59
Verstanden. Nur wenn Du schreibst "dass im Fehlerfall, bereits gelöschte Sätze wiederhergestellt werden" dann willst Du eigentlich nur u.U. Datensätze wiederherstellen und doch dann auch nur einzelne, oder nicht?
Die Connection mit Deleted=Off zu bilden und alle inkl gelöschte Daten abzufragen würde Dir dann doch genauso helfen, um dann letztlich die Sätze zu finden, die "entlöscht" werden sollen und sie dann gezielt einzeln zu RECALLen, statt RECALL ALL.
PS: Es wäre natürlich sehr wohl möglich auch ALTER TABLE abzusetzen, um FElder zu ergänzen, allerdings ändert das ja nicht den Code der alten Anwendung. Im einfachsten Fall macht die Anwendung SELECT * und zeigt das neue Feld sogar an, im Normallfall wohl eher nicht. Klar, daß man dann von außen ran muß.
Tschüß, Olaf.

