Discussion:
Datensätze löschen in DBF-Dateien
(zu alt für eine Antwort)
ralf mueller
2005-07-08 08:52:55 UTC
Permalink
Hallo Miteinander,

ich benötige Hilfe bei einem für mich recht wichtigen Thema.
Inzwischen habe ich es hinbekommen DBF-Dateien über ODBCConnection... zu
öffnen, auszulesen, Neue Datensätze anzufügen,... .
Aber es will mir partou nicht gelingen aus einer DBF-Tabelle über diesen Weg
einen oder mehrere Datensätze zu löschen.
Kann mir mal jemand mit einem kleinem Beispiel helfen?
Vielen Dank!
--
Mit freundlichen Gruessen
Ralf Mueller
Ingenieurbuero Kirchner
Holger Vorberg
2005-07-08 13:24:58 UTC
Permalink
Hi,
Post by ralf mueller
Aber es will mir partou nicht gelingen aus einer DBF-Tabelle über diesen Weg
einen oder mehrere Datensätze zu löschen.
"es will dir nicht gelingen" heisst, du hast es versucht, aber die gelöschten Sätze tauchen immer
wieder auf?

Das hängt damit zusammen, dass in .DBF Dateien die Sätze eigentlich nicht wirklich gelöscht werden,
sondern zunächst mal nur ein Löschflag bekommen. Wenn du über ODBC drauf zureifst, dann musst du dem
ODBC Treiber mitteilen, dass die Sätze mit Löschflag zu ignorieren sind. In einem Connectionstring
wäre das mit der Option "deleted=yes" zu machen.

HTH

Tschüß,

Holger Vorberg
MS Visual FoxPro MVP
dFPUG Regionalleiter Bielefeld
ralf mueller
2005-07-11 07:13:05 UTC
Permalink
Hallo Holger,
vielen Dank für den Hinweis. Das mit dem Löschflag kenne ich von DBF-Seite
her,
aber den Schalter im .Net-Connectionstring kannte ich noch nicht. Aber
leider hilft mir das noch nicht viel weiter,
denn ich komme noch nicht einmal soweit, das in der DBF-Tabelle einige Sätze
als gelöscht markiert werden.
Entweder stürzt das Programm vorher mit Fehlern ab (je nachdem entweder
etwas mit Parallelitäts.... oder Parameter fehlt oder anderes) oder
meine Befehle bleiben völlig wirkungslos. Wie gesagt etwas Beispielcode
würde mir sehr helfen.
Kann ja auch sein ich bin auf dem völlig falschen oder viel zu komplizierten
Dampfer.
Deshalb hier etwas aus meinen Versuchen, von denen ich das meiste schon
wieder auskommentiert habe,
weil nichts klappt:
DataSet dsWS = new DataSet();

System.Data.Odbc.OdbcDataAdapter daWS = new
System.Data.Odbc.OdbcDataAdapter();

this.odbcSelectCommand1.CommandText = "SELECT * FROM WS_NAKA"; // WHERE
PRO_NR = '"+sPrj+"'";

this.odbcSelectCommand1.Connection = this.odbcConnection1;

daWS.SelectCommand = this.odbcSelectCommand1;

daWS.Fill(dsWS,"WS_NAKA");

DataTable dt_WS = dsWS.Tables[0];


/*

DataColumn[] myColArray = new DataColumn[1];

myColArray[0] = dt_WS.Columns["ID"];

dt_WS.PrimaryKey = myColArray;


//string delSql = "DELETE FROM WS_NAKA WHERE ID = '"+"1 "+"'";

string delSql = "DELETE FROM WS_NAKA WHERE [ID] = @p1";

System.Data.Odbc.OdbcCommand cmd = new
System.Data.Odbc.OdbcCommand(delSql,this.odbcSelectCommand1.Connection);

System.Data.Odbc.OdbcParameter p1
=cmd.Parameters.Add("@p1",System.Data.Odbc.OdbcType.NVarChar, 10, "ID");

//System.Data.Odbc.OdbcParameter p1 =cmd.Parameters.Add("@p1"," ");

p1.SourceVersion = DataRowVersion.Original;

daWS.DeleteCommand = cmd;

this.odbcSelectCommand1.Connection.Open();


foreach (DataRow oRow in dt_WS.Rows)

{

oRow.Delete();

}


try

{

daWS.Update(dt_WS);

}

catch (Exception ex)

{

System.Console.WriteLine(ex.Message);

}

this.odbcSelectCommand1.Connection.Close();

*/

Vielleicht fällt ja jemanden etwas dazu ein - es würde mich wirklich sehr
weiterbringen!
Vielen Dank im voraus!!!
Post by Holger Vorberg
Hi,
Post by ralf mueller
Aber es will mir partou nicht gelingen aus einer DBF-Tabelle über diesen Weg
einen oder mehrere Datensätze zu löschen.
"es will dir nicht gelingen" heisst, du hast es versucht, aber die
gelöschten Sätze tauchen immer
Post by Holger Vorberg
wieder auf?
Das hängt damit zusammen, dass in .DBF Dateien die Sätze eigentlich nicht
wirklich gelöscht werden,
Post by Holger Vorberg
sondern zunächst mal nur ein Löschflag bekommen. Wenn du über ODBC drauf
zureifst, dann musst du dem
Post by Holger Vorberg
ODBC Treiber mitteilen, dass die Sätze mit Löschflag zu ignorieren sind.
In einem Connectionstring
Post by Holger Vorberg
wäre das mit der Option "deleted=yes" zu machen.
HTH
Tschüß,
Holger Vorberg
MS Visual FoxPro MVP
dFPUG Regionalleiter Bielefeld
Holger Vorberg
2005-07-11 07:41:09 UTC
Permalink
Hi,
Post by ralf mueller
Entweder stürzt das Programm vorher mit Fehlern ab (je nachdem entweder
etwas mit Parallelitäts.... oder Parameter fehlt oder anderes) oder
meine Befehle bleiben völlig wirkungslos. Wie gesagt etwas Beispielcode
würde mir sehr helfen.
zu den Fehlern kann ich dir leider nicht viel sagen.
Beispiel Code kann ich dir auch nicht liefern, ich hab schon meine liebe Mühe, deinen Code zu
verstehen, was nicht direkt an deinem Code liegt, sondern eher daran, dass mir da die Erfahrung in
.NET fehlt. <g>

Aber mich würde mal interessieren, was für eine .DBF du da hast, also von welchem Datenbanksystem
sie stammt, denn .DBF ist nicht gleich .DBF! Abgesehen davon wäre auch der gewählte ODBC Treiber von
Interesse, denn der muss ja zu dem entsprechenden .DBF Typ passen.

Tschüß,

Holger Vorberg
MS Visual FoxPro MVP
dFPUG Regionalleiter Bielefeld
ralf mueller
2005-07-11 11:39:22 UTC
Permalink
Hallo Holger,
den Quellcode habe ich hauptsächlich aus dem Studium des Buches
"Datenbankprogrammierung mit C#" - aber ich habe eben auch noch nicht viel
praktische Erfahrung - vielleicht gibt es auch einen einfacheren Weg (den
ich eigentlich
in diesem Forum zu erfahren gehofft habe).
Die Dbase-Tabelle habe ich noch mit dem guten alten dbu von Clippers Zeiten
erstellt.
Ich komme eigentlich aus der Visual Objects-Schiene und will einige erste
kleinere
DB-Programme inC# schreiben um mich auf den Einstieg in die .Net-Welt
vorzubereiten.
Leider scheitere ich hier schon, wenn ich nur mal mit einer Dbase-Tabelle
etwas intensiver
arbeiten (konkret löschen) will. Wo kann man denn noch Hilfe herbekommen??
Ach so, den ODBC-Treiber habe ich mir auch aus dem Visual Studio
zusammengeklickt,
ich denke mal - daran kann es nicht liegen:

ConnectionString der odbcConnection (autom. generiert):
PageTimeout=5;MaxBufferSize=2048;DSN=dBASE-Dateien;DefaultDir=D:\VS_ENTW\WEB
SERVICES\WEBSERVICENAKA;DBQ=D:\VS_ENTW\WEBSERVICES\WEBSERVICENAKA;DriverId=5
33

ConnectString der odbcConnection (autom. generiert):
Provider=MSDASQL.1;Persist Security Info=False;Data
Source=dBASE-Dateien;Extended
Properties="DSN=dBASE-Dateien;DefaultDir=C:\Programme\Microsoft Visual
Studio .NET 2003\Common7\IDE;DriverId=533;MaxBufferSize=2048;PageTimeout=5;"
Post by Holger Vorberg
Hi,
Post by ralf mueller
Entweder stürzt das Programm vorher mit Fehlern ab (je nachdem entweder
etwas mit Parallelitäts.... oder Parameter fehlt oder anderes) oder
meine Befehle bleiben völlig wirkungslos. Wie gesagt etwas Beispielcode
würde mir sehr helfen.
zu den Fehlern kann ich dir leider nicht viel sagen.
Beispiel Code kann ich dir auch nicht liefern, ich hab schon meine liebe
Mühe, deinen Code zu
Post by Holger Vorberg
verstehen, was nicht direkt an deinem Code liegt, sondern eher daran, dass
mir da die Erfahrung in
Post by Holger Vorberg
.NET fehlt. <g>
Aber mich würde mal interessieren, was für eine .DBF du da hast, also von
welchem Datenbanksystem
Post by Holger Vorberg
sie stammt, denn .DBF ist nicht gleich .DBF! Abgesehen davon wäre auch der
gewählte ODBC Treiber von
Post by Holger Vorberg
Interesse, denn der muss ja zu dem entsprechenden .DBF Typ passen.
Tschüß,
Holger Vorberg
MS Visual FoxPro MVP
dFPUG Regionalleiter Bielefeld
Peter Fleischer
2005-07-11 12:22:51 UTC
Permalink
ralf mueller <ralf-***@kirchner-ingenieure.de> wrote:
...
Post by ralf mueller
arbeiten (konkret löschen) will. Wo kann man denn noch Hilfe
herbekommen?? Ach so, den ODBC-Treiber habe ich mir auch aus dem
Visual Studio zusammengeklickt,
...

Ralf,
ein Klicki-Bunti ersetzt nun mal kein Grundlagenwissen:-)

Auf meiner Homepage unter der folgenden direkten URL habe ich ein
funktionierendes Beispiel dargestellt.

http://ddm.xima-redaktion.de/itkb.aspx?ID=116

Wenn dieser Code nicht funktioniert, dann poste mal den genauen
Fehlerausdruck.

Peter
ralf mueller
2005-07-11 15:29:41 UTC
Permalink
Hallo Peter,
vielen Dank für Deine Hinweise.
Das ich ein Anfänger bin, hatte ich wohl erwähnt und das ich erst noch lerne
wo und wie ich welche notwendigen Informationen
und auch das Grundlagenwissen herbekomme - dafür schäme ich mich nicht. Ich
dachte eigentlich, das Buch hilft mir dabei,
aber eben nicht nur das Buch - am Praxisteil sitze ich jetzt.
Dein Beispiel ist sicher ok, aber es trifft leider immer noch nicht meinen
wunden Punkt - ein Beispiel dafür -
wie lösche ich denn nun einen oder mehrere Datensätze aus der DBF-Tabelle -
kannst Du mir dazu
auch noch etwas Code zeigen?
Vielen Dank im voraus!
Ralf
Post by Peter Fleischer
...
Post by ralf mueller
arbeiten (konkret löschen) will. Wo kann man denn noch Hilfe
herbekommen?? Ach so, den ODBC-Treiber habe ich mir auch aus dem
Visual Studio zusammengeklickt,
...
Ralf,
ein Klicki-Bunti ersetzt nun mal kein Grundlagenwissen:-)
Auf meiner Homepage unter der folgenden direkten URL habe ich ein
funktionierendes Beispiel dargestellt.
http://ddm.xima-redaktion.de/itkb.aspx?ID=116
Wenn dieser Code nicht funktioniert, dann poste mal den genauen
Fehlerausdruck.
Peter
Peter Fleischer
2005-07-11 18:08:51 UTC
Permalink
ralf mueller <ralf-***@kirchner-ingenieure.de> wrote:
...
Post by ralf mueller
Das ich ein Anfänger bin, hatte ich wohl erwähnt und das ich erst
noch lerne wo und wie ich welche notwendigen Informationen
und auch das Grundlagenwissen herbekomme - dafür schäme ich mich
nicht.
ralf,
du brauchst dich nicht zu schämen. Jeder hat mal angefangen.Man muss aber
auch Smileys erkennen und akzeptieren und darf Bemerkungen in diesen Fall
nicht persönlich nehmen, sonden nur als Hinweis werten.
Post by ralf mueller
Ich dachte eigentlich, das Buch hilft mir dabei,
aber eben nicht nur das Buch - am Praxisteil sitze ich jetzt.
Die meisten Anfänger-Programmierer machen den Fehler, dass sie ohne
Grundlagenwissen versuchen, schnell zu einem (zweifelhaften) Erfolg zu
kommen.
Post by ralf mueller
Dein Beispiel ist sicher ok, aber es trifft leider immer noch nicht
meinen wunden Punkt
Hast du es wenigstens verstanden? Funktioniert es? Lassen sich Datensätze
mit der Del-Taste löschen? Kannst du mit dem Update dann die Änderungen in
der Datenbank-Datei ablegen (incl. Löschkennzeichen)?
Post by ralf mueller
- ein Beispiel dafür -
wie lösche ich denn nun einen oder mehrere Datensätze aus der
DBF-Tabelle - kannst Du mir dazu
auch noch etwas Code zeigen?
Habe ich doch. Markiere mal eine Zeile und drücke die Del-Taste. Was
funktioniert da nicht.
Post by ralf mueller
Vielen Dank im voraus!
Ein paar Grundlagen musst du dir schon aneignen, damit du wenigstens die
Fargen etwas präziser stellen kannst.

Zum Löschen gehört zuerst die Auswahl des zu löschenden Datensatzes. Wie
hast du das gelöst? Und wenn du den Verweis auf diesen Datensatz hast, dann
brauchst du nur ein delete abzusetzen, entweder per SQL mit dem PK oder über
die DataTable per Delete-Methode. Wo ist da dein Problem? Inder Hilfe ist
das eigentlich gut erklärt.

Peter

Loading...