Für Spezies: MS SQL7.0 Server und Delphi

Diskutiere Für Spezies: MS SQL7.0 Server und Delphi im Developer Network Forum im Bereich Hardware & Software Forum; Folgendes Problem: Habe eine LogFile-Liste (*.txt), in der teilweise gleiche Datensätze enthalten sind. Ich nehme also einen Datensatz nach dem...
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #1
R

rastelli

Bekanntes Mitglied
Dabei seit
05.09.1999
Beiträge
177
Reaktionspunkte
0
Folgendes Problem:

Habe eine LogFile-Liste (*.txt), in der teilweise gleiche Datensätze enthalten sind. Ich nehme also einen Datensatz nach dem anderen, sehe per SELECT nach, ob dieser Datensatz schon in der SQL-Datenbank enthalten ist und füge diesen Datensatz per INSERT INTO in die Datenbank ein, sofern er noch nicht vorhanden ist. Theoretisch müssten so aus ca. 300000 LogFile-Zeilen ca. 1000-1500 Datensätze auf dem SQL-Server runterfallen. Praktisch habe ich etwa 4000 DS, in denen einige sich bis zu 70 mal wiederholen.
Jetzt meine Frage: Habe ich ausser SELECT und INSERT noch etwas zu beachten? Ich habe noch sowas wie "COMMIT" und "ROLLBACK" im Schädel. Muss ich jeden INSERT mit einem COMMIT oder so bestätigen?
 
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #2
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Aha, das scheint also Deine Aufgabe zu sein, die ich im anderen Thread teilweise schon beantwortet habe...

Wie genau sieht denn der Inhalt der Log-Datei aus? Kannst Du mal ein Schnippsel hier posten?

Deine Vorgehensweise ist sicherlich lobenswert, nur würde ich es nie so machen. Ich würde mich auf die BDE verlassen, die mir das alles schön umsetzt.

Grundlagen:
- Tabelle im SQL erstellen, ist sicherlich schon passiert.
- Schlüsselfeld aussuchen und als Primary Key deklarieren.
- ODBC-Datenquelle (in der Systemsteuerung) anlegen, auf Deine Datenbank verweisen.
- Eventuell in der BDE-Administration (auch Systemsteuerung) Auto ODBC (konfiguration - Sytem - INIT) auf True, wenn der gleichlautende BDE-Alias nicht in der Liste auftaucht.
- Innerhalb von Delphi eine TDataSource und eine TTable anlegen, die auf dem neuen Alias beruhen.
- Jetzt kannst Du mit der Tabelle arbeiten als wenn es eine Paradox-Tabele wäre.

So, jetzt gehst Du Dein Log-File durch, findest eine Zeile, schaust mit Table.Locate nach, ob der Datensatz schon da ist. Wenn nicht, dann mit Table.AppendRecord anlegen. Fertig. Du kannst sicherlich mit StartTransaction und Commit arbeiten, nur benötigst Du dazu 1. noch eine TDatabase-Komponente und 2. ist das überflüssig. Denn ein solches Vorgehen macht man nur dann, wenn mehrere Buchungsvorgänge zusammenhängen, die ersten Teile erfolgt sind , und ein Fehler tritt auf. Jetzt mußt Du die ersten Teilbuchungen (bis zu StartTransaction) rückgängig machen, der Befehl lautet Rollback. Wie gesagt, das machst Du nicht. Bei AppendRecord landet schon alles in der Tabelle, und daß ohne Fehlermeldung, weil Du ja mit Locate nachgeschaut hast.

O Love

------------------
"I will not abide disobedience!"
 
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #3
T

TasseKaffee

Bekanntes Mitglied
Dabei seit
18.04.2000
Beiträge
286
Reaktionspunkte
0
hey,
ich bin da auch schwer am suchen nach Beispielen, hab mir gerade ein *.pdf File gezogen http://kickme.to/tiger/
jump5.xyz oder jump9.xyz in *.rar umbenennen.

Gruß Alex

------------------
da werden sie geholfen...." schade daß Sie das jetzt nicht sagt, un soo goldisch lacht "

[Dieser Beitrag wurde von TasseKaffee am 01. Mai 2000 editiert.]
 
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #4
T

TasseKaffee

Bekanntes Mitglied
Dabei seit
18.04.2000
Beiträge
286
Reaktionspunkte
0
unter " Books "

Alex

------------------
da werden sie geholfen...." schade daß Sie das jetzt nicht sagt, un soo goldisch lacht "
 
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #5
T

TasseKaffee

Bekanntes Mitglied
Dabei seit
18.04.2000
Beiträge
286
Reaktionspunkte
0
war gerade noch mal auf der Seite...
unter " Books "

Alex

------------------
da werden sie geholfen...." schade daß Sie das jetzt nicht sagt, un soo goldisch lacht "
 
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #6
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Sorry, habe heute Urlaub gehabt, konnte also nicht sofort antworten...

Die TQuery-Komponente nehme ich (nur noch), um echte SQL-Anfragen an fertige Tabellen zu stellen. Sinn der DataSource-Property ist übrigens eine schnelle Verbindung mit einer Tabelle, damit Du per Platzhalter direkt auf die aktuellen Daten zugreifen kannst, siehe auch die IDE-Hilfe dazu.

Ja, früher habe ich sogar mit TUpdateSQL gearbeitet, aber mit einer normalen Tabelle geht alles wie gehabt. Nur das Öffnen dauert, da der irgendwie schon die Daten cached. Naja, ich habe nicht die Enterprise, also keine direkten SQL-Treiber, nur mit dem Umweg über die BDE.

Schreib mal, ob es jetzt tut.

O Love

------------------
"I will not abide disobedience!"
 
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #7
R

rastelli

Bekanntes Mitglied
Dabei seit
05.09.1999
Beiträge
177
Reaktionspunkte
0
Hallo Bautzner!

Naja, mit Log-Datei siehts eher schlecht aus. Hatte bein Einrichten der ODBC-Quelle natürlich den Haken nicht gesetzt.
Aber mir geht so langsam ein Licht auf. Auf die Idee, nur mit Methoden der Table-Komponente die Datenbank zu bearbeiten, bin ich dummerweise nicht gekommen. Ich vermute mal, dass ich noch ein kleines Verständnisproblem habe. Meine Vorgehensweise war folgendermassen (wie du schon beschrieben hast):
1. Tabelle auf dem SQL-Server erstellt
2. Primary Key deklariert
3. ODBC-Quelle für SQL-Server eingerichtet
Soweit lief alles tutti. Dann der Delphi-Teil:
4. TDataSource und TTable ins Form gekippt und auf den ODBC-Namen gelegt. Die Kommunikation untereinander scheint soweit auch zu funktionieren. Jetzt mein Gedankengang: Wenn ich schon mit einem SQL-Server arbeite, dann muss ich auch SQL-Statements verwenden und die kann ich am besten mit einem TQuery ins Rennen schicken.
Und an dieser Stelle kommt mir eine Sache spanisch vor: Bei der Query-Komponente kann ich zwei Sachen einstellen: den DataBaseName (ODBC-Name) und die DataSource! Theoretisch sollte es doch reichen, wenn man hier nur eine Eigenschaft angibt. Ich habe nämlich die Vermutung, dass meine DB-Zugriffe über zwei verschiedene Wege behandelt werden.
Deiner Meinung nach sollte ich es mal direkt mit den Tabellen-Methoden probieren? Ich werde wohl mal die TQuery-Komponente weglassen und nur mit der Tabelle arbeiten.
Hab erstmal besten Dank!

2Alex: Auf der Seite finde ich nur jede Menge Links. Was sind'n das für Beispiele?

Cya Rastelli
 
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #8
R

rastelli

Bekanntes Mitglied
Dabei seit
05.09.1999
Beiträge
177
Reaktionspunkte
0
2TassKaff: Danke, ich habs gefunden. Superbuch!!

2O Love: Die Idee mit der TQuery war eigentlich gar nicht so dumm. Ich habe mal an einem Test mit Table.Locate geübt und musste feststellen, dass Locate immer nur einunddenselben Datensatz liefert. Ist das richtig? Ich habe aber teiweise mehrere DS, die dem entsprechenden Kriterium entsprechen. Also bin ich doch wieder beim SQL gelandet.
Ich habe aber beim SQL-Server das Trace entdeckt. Da habe ich die Datenbank mal leer gemacht, ein LogFile neu eingetütet und die Aktionen mal mitgeschnitten. Allerdings werde ich heute wohl keine Zeit mehr haben, die 16MB Trace durchzusehen :deadhead:
Bin schon gespannt, woran es liegt. Neuigkeiten demnächst in diesem Brett!

CU Rastelli
 
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #9
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
<BLOCKQUOTE><font size="1" face="Verdana, Arial">Zitat:</font><HR>
sehe per SELECT nach, ob dieser Datensatz schon in der SQL-Datenbank enthalten ist
[/quote]

Nun, wenn man nach dieser Angabe geht, dann ist Locate sicherlich richtig, aber bei mehreren Sätzen funktioniert das so nicht ganz. Wie willst Du Deine Datensätze denn auseinanderhalten? Du kannst nämlich sowohl auf SQL-Basis mehrere Spalten als Primary Key markieren, und auch per Locate auf mehreren Feldern suchen:

Locate ('FIELD1;FIELD2', VarArrayOf ([Value1, Value2]), []);

Wenn Du es sicherheitstechnisch verantworten kannst, dann poste doch mal Deinen Tabellenaufbau + einen Auszug aus dem Log.

O Love

------------------
"I will not abide disobedience!"
 
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #10
R

rastelli

Bekanntes Mitglied
Dabei seit
05.09.1999
Beiträge
177
Reaktionspunkte
0
Hi OLOVE!

Habe mal wieder Zeit, um auf mein SQL-Problem zurückzukommen. Habe also in meinen Client noch ein paar Zeilen zum mitloggen reingeschrieben und siehe da: da taucht beim Navigieren durch das Query-Ergebnis immer wieder der selbe Datensatz auf!
Kernproblem scheint die Eigenschaft RecNo zu sein, mit der man scheinbar doch nicht durch die Ergebnismenge navigieren kann, wie ich mir das so dachte. Die Hilfe sagt allerdings folgendes dazu:

"Die Eigenschaft RecNo gibt den aktuellen Datensatz der Datenmenge an.

property RecNo: Longint;

Beschreibung

Mit RecNo können Sie die Datensatznummer des aktuellen Datensatzes einer Datenmenge ermitteln. In Anwendungen kann mit dieser Eigenschaft und mit RecordCount über alle Datensätze einer Datenmenge iteriert werden, obwohl dies üblicherweise mit First, Last, MoveBy, Next und Prior durchgeführt wird.

Hinweis

Bei Paradox-Tabellen können Sie durch eine Zuweisung an RecNo den Cursor auf einem bestimmten Datensatz positionieren. "

AHA!! Ich hatte also folgendes versucht:
for i := 1 to anzahl do begin
Query1.RecNo := i;
if Query1.FieldValues['MACAddr']=mac then found := true;
end;

Scheinbar funktioniert die Wertzuweisung an RecNo bei SQL-Tabellen nicht. Muss ich also Next verwenden.

Besten Dank noch und schönes Wochenende!

Cya Rastelli
 
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #11
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
RecNo funktioniert nicht nur scheinbar nicht mit SQL, es funktioniert definitiv nicht! Du kannst mit TDataSet.IsSequenced abfragen, ob es sich um eine Datenmenge handelt, die über RecNo adressierbar ist.

Auszug aus der Hilfe:
Die Methode IsSequenced gibt an, ob die zugrundeliegende Datenbanktabelle über Datensatznummern die Reihenfolge von Datensätzen bestimmt.

function IsSequenced: Boolean; virtual;

Beschreibung

Mit IsSequenced stellen Sie fest, ob die zugrundeliegende Datenbanktabelle sequentielle Zahlen unterstützt oder ob diese von der Datenmengen-Komponente berechnet werden. Wenn IsSequenced auf True gesetzt ist, können Anwendungen über die Eigenschaft RecNo Datensätze in der Datenmenge problemlos ansteuern.

Entsprechend der Implementierung in TDataSet liefert IsSequenced immer True. Nachkommen von TDataSet reimplementieren diese Methode, um einen vom Typ der zugrundeliegenden Datenbanktabelle abhängigen Wert zurückzugeben.

Bemerkung: Du solltest zum Durchqueren einer Datenmenge IMMER Next verwenden, damit gehst Du allen Schwierigkeiten aus dem Weg. RecNo benutzt man nur dann, wenn man prozentuale Sachen mit einer Datenmenge machen will. Ein Beispiel hierfür ist, daß sequenzielle Datenmengen in einem Grid einen sich anpassenden Thumb in der vertikalen Scrollbar haben, SQL-Daten haben einen quadratischen Thumb, der immer die gleiche Größe hat.

O Love

------------------
"I will not abide disobedience!"
 
  • Für Spezies: MS SQL7.0 Server und Delphi Beitrag #12
R

rastelli

Bekanntes Mitglied
Dabei seit
05.09.1999
Beiträge
177
Reaktionspunkte
0
Hi OLOVE!

Siehste! Hätte ich das mit IsSequenced gewusst, dann hätte ich weniger Zeit in die Sache sozialisiert. Naja, solche Sachen üben aber halt ungemein das Debuggen.
Ach ja: danke für den Tip mit der ScrollBar!

Cya Rastelli
 
Thema:

Für Spezies: MS SQL7.0 Server und Delphi

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben