Autor Beitrag
Vegeto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Mi 05.09.12 13:14 
Hallo @ all

ich wollte euch fragen, wie es möglich ist eine SQL Datenbank tabelle mit einem Datatable-Objekt zu vergleichen?
Zweck ist es, die schon geladenen DataTable Datensätze abzuspeichern in .csv-Datei.
Jetzt soll er wenn ich auf Aktualisieren-Klicke, mir nur die Datensätze anzeigen lassen, die noch nicht gespeichrt/exportiert wurden. Das heißt da beide tabellen ein PK haben, soll er mittels der PK gucken welche Datensätze noch nicht exportiert/gespeichert wurden sind und welche schon gespeichert wurden ist und NUR die anzeigen die noch nicht gespeichert sind.

Mal sone Skizze:
Datenbank:
ID Name Adresse
01 AA BB
02 AB NULL
03 AC BA
04 AD BC
05 AE NULL

Das ist meine Datenbank, zunächst kopiert er NUR die Datensätze die vollständig sind:
DataTable:
ID Name Adresse
01 AA BB
03 AC BA
04 AD BC

So nun speicher ich diese Datensätze ab, jetzt soll die WinForm anwendung merken, welche ID abgespeichert wurden und auf eine sogenannte "Blacklist" im Datatable speichern. Die sollen in zukunft nicht mehr angezeigt werden

Im laufe der zeit wird auch die Datenbank aktualisiert und auch die NULL-Values ersetzt mit Werten und wenn ich dann auf Aktualisieren klicke soll mit das DataTable die Datensätze anzeigen.

Ich hoffe ihr versteht mein Problem :)

LG
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 05.09.12 13:31 
Von wieviel Datensätzen reden wir hier die du durchschnittlich vergleichen willst.

Das Wort speichern ist hier ganz unglücklich. Bei einer DataTable denke ich bei dem Wort speichern an ein speichern in eine Datenbank. Dein Ort wo du speicherst und die Datenabnk scheinen aber zwei unterschiedliche Dinge zu sein. Das macht es ohne vernünftige Erklärung und ein wenig Context (warum machst du das was du da machst) extrem schwierig zu verstehen was du willst.
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Mi 05.09.12 13:38 
Also ich will die Datensätze aus der Datatable (.csv-Datei) auf dem Destop speichern, also ich könnte es auch so machen, dass ich zunächst das Datatable an das datagridview anbide und danach speichere, dies ist ja wesentlich einfacher !

Also um das Speichern, mache ich mir nicht so große sorgen, eher um das schaffen des vergleiches.
Es handeltes sich um mehrere 100, wenn nicht sogar 1000 Datensätze.

LG
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 05.09.12 14:41 
Das hilft mir jetzt überhaupt nicht den Problem besser zu verstehen. Dein Hinweis auf das DataGridView ignorier ich mal. Das ist ein UI Element und macht nichts anderes als Daten anzeigen. Hilft also überhaupt nicht um irgendeine Logik zu implementieren.

Wenn du eine Liste von Daten im Speicher hast und eine Liste von Daten in einer Datenbank mit der du vergleichen willst wird, solange du nicht mehr Informationen lieferst, das performanteste sein die Daten zur Datenbank zu transportieren und einen Vergleich in SQL auszuführen. Also zum Beispiel wenn es dir darum geht Datensätze in der DB zu finden die du nicht im Speicher hast könntest du ein SQL Select ala
ausblenden SQL-Anweisung
1:
2:
select * from MeinTabelle 
 where ID not in (123 .. lange Liste meiner IDs ..)

absetzen. Das wird aber in fast allen Datenbanken nur bis zu einer bestimmten Menge von IDs funktionieren. Danach wirst du was intelligenteres (aufwendigeres) brauchen.
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Mi 05.09.12 15:16 
Zunächst Danke für deine Antwort, ich versuche mal mein Problem, besser zu erläutern (:

Also Ich habe ein DataTable, was die Daten aus der SQL Datenbank holt.

Das DataTable besitzt 11 Spalten(die wichtigsten aus der Datenbank selektiert), die erste Spalte ist eine ID Spalte, ihr habe ich den PK gesetzt, mit diesem Code:
ausblenden C#-Quelltext
1:
2:
3:
DataColumn[] primArray = new DataColumn[1];
primArray[0] = haupt_DT.Columns["ID"];            
haupt_DT.PrimaryKey = primArray;


Dieses DataTable ist aus drei verschiedenen Tabellen aus der SQL-Datenbank zusammen gebaut wurden, mittels Join-anweisung in SQLDataAdapter und LINQ to Dataset, doch dieser part spielt denke ich keine große rolle.

Das DataTable wird mit einem der drei Tabellen verglichen und auch gleichzeitig gefüllt(gefüllt mit allen drei tabellen), dass heißt wenn ich dataGridView1.DataSource = haupt_DT; eingebe zeigt er auch die gewünschten Datensätze an.

ich hoffe bis hierhin ist alles verständlichh (:

Jetzt habe ich in meinem dataGridView eine checkboxcolumn, somit kann ich selektieren, welche Zeile exportiert/gespeichert werden soll.
Nun soll sich das DataTable merken(hier weiß ich halt nicht was ich benutzen soll) welche Zeile im dataGridView gespeichert wurde und diese ID merken und bei erneuten Aktualisierungs-klick soll diese ID nicht mehr in das DataTable aufgenommen werden, denn somit wird sie auch nicht im dataGridView angezeigt. Und nur die Datensätze angezeigt die bislang noch nicht gespeichert wurden.

Ich hoffe du verstehst nun mein Anliegen.
Er Soll sich also die ID (PK) merken die schon gespeichert wurde.

LG

ps.: Fallst du noch etwas brauchst stehe ich gerne zur verfügung (: Danke hier schonmal für das durchlesen (: