Autor Beitrag
bergrath
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mi 31.10.07 15:07 
Hallo Leute.

Ich habe ein DataTable mit 80 Spalten und vielen Reihen und möchte nun die darin stehenden Werte überprüfen. So in der Art: Spalte1 mit den erlaubten Werten A,B,C. Wenn nun statt A,B oder C ein D drin steht möchte ich eine Fehlermeldung erhalten, was ich auch mit der MessageBox realisieren kann. Aber ich komme nicht darauf wie ich die Spalte von oben nach unten durchlaufen kann.


Ich zerbreche mir jetzt schon lange darüber den Kopf, aber komme nicht voran. Könnte mir vielleicht jemand einen Ansatz dafür liefern. Alles was ich bisher probiert habe, ist gescheitert. Wäre euch echt sehr dankbar dafür.

MfG


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mo 05.11.2007 um 18:54
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 01.11.07 16:10 
Das DataRow Object hat eine ItemArray Property mit der du über die Werte einer Row iterieren kannst.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
DataTable dt = new DataTable();
dt.Columns.Add("Spalte1");
dt.Columns.Add("Spalte2");
dt.Columns.Add("Spalte3");
dt.Rows.Add(new object[] { "a""b""c" });
dt.Rows.Add(new object[] { "b""c""d" });
dt.Rows.Add(new object[] { "c""b""a" });

foreach (DataRow row in dt.Rows)
{
    foreach (object cell in row.ItemArray)
    {
        MessageBox.Show(cell.ToString());
    }
}
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mo 05.11.07 12:31 
Hi. Danke für die Antwort, aber leider komme ich immer noch nicht weiter.
So wie ich das jetzt verstehe gilt die Angabe von new object für die Zeile, aber leider ist ja so nichts für die Spalte festgelegt, also welche Werte erlaubt sind. Aus dem Befehl dt.Rows.Add(new object[] {"a","b","c"} ist ja nicht ersichtlich für welche Spalte das gilt.
Ich müsste ja normalerweise für die Column die erlaubten Werte angeben. Oder habe ich da etwas falsch verstanden?

Vielen Dank für Tipps und Hinweise im Voraus.

MfG
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 05.11.07 15:00 
Bei dieser Methode müsstest du die Daten selbst in der foreach-Schleife validieren. Dir ist aber höchstwahrscheinlich eine automatische Validierung lieber, dazu müsstest du hier nachschauen.
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mo 05.11.07 15:42 
Hi. Erstmal vielen Dank für die Antwort.

Leider kann ich mit dem Vorschlag zur automatischen Validierung nicht sehr viel anfangen, da z.B. das ColumnChangedEvent bei mir nicht vorkommt, da die Daten schon in der Datatable stehen und nachträglich auf Richtigkeit überprüft werden sollen.

Wie kann ich diesen Validator z.B. auf eine Spalte anwenden, die sich "VIN" nennt und als Werte nur A oder B zugelassen sind?

Ich wäre sehr dankbar für einen kleinen Codeschnipsel, da ich momentan auf dem Schlauch stehe und einfach nicht weiter komme.

Vielen Dank für die Tipps im Voraus.

MfG
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 05.11.07 19:31 
Na wenn es nur um statische Daten geht, ist Ralfs Weg doch wirklich der schnellste, du musst nur noch die Validierungslogik in die Schleife schreiben. Hast du z.B. ein string[][]-Array "valids", also ein Array, das für jede Spalte ein string[]-Array mit den eintragbaren strings enthält, könnte das in etwas so aussehen:
ausblenden C#-Quelltext
1:
2:
3:
4:
foreach (DataRow row in dt.Rows)
  for (int i = 0; i < dt.Columns.Count; i++)
    if (!((IList)valids).Contains(row[i])) // welcher Schnarchzapfen ist auf die Idee gekommen, Contains explizit zu implementieren?
      throw new ....;


[add]
Raus mit der Sprache, wer benutzt hier Leerzeichen zum Einrücken :P ?
[/add]
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mi 07.11.07 09:12 
Hi Leute.

Ich habe verzweifelt versucht mit der IList-Schnittstelle mein DataTable auf Werte zu prüfen, die darin stehen. Leider ohne Erfolg.

Meine erste Spalte hat den Namen "21/22"" und darf nur die Kombination "GC" enthalten. Ich habe sehr viele Zeilen. Wie kann ich nun mit der IList meine Spalte überprüfen.


ausblenden C#-Quelltext
1:
2:
3:
4:
foreach (DataRow row in dt.Rows)
for (int i = 0; i < dt.Columns.Count; i++)  
    if (!((IList)valids).Contains(row[i]))  
throw new exception


Dieser Code müsste eigentlich funktionieren, aber wie??? Ich komme einfach nicht weiter. Kann mir bitte jemand helfen...bin echt am verzweifeln.....was muss ich tun damit diese IList mit den Werte GC prüft????

Danke für Hinweise im Voraus.

MfG

Moderiert von user profile iconjasocul: C#-Tags hinzugefügt
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 07.11.07 19:26 
Ich sehe gerade, dass da wohl eher "valids[i]" stehen müsste... aber war ja nur ein Beispiel, dürfte bei deinen Anforderungen eher nicht sinnvoll sein.
Die verstehe ich allerdings auch nicht ganz :mrgreen: . Es gibt nur einen einzigen gültigen Wert für die Spalte :gruebel: ? Wie auch immer, könnte so aussehen:
ausblenden C#-Quelltext
1:
2:
3:
foreach(DataRow row in table.Rows)
  if (row["21/22"] != "GC")
    throw new...;

Sofern das doch nicht alle Bedingungen sind, könntest du diese einmal alle vorstellen, damit man sich einen etwas flexibleren Ansatz ausdenken kann.
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Do 08.11.07 15:10 
Hi. Danke für deinen Tipp Kahbarakh.Jetzt kann ich die Spalten auf die Werte prüfen. Die Werte auf die geprüft wird kann ich aus einer Liste abtippen.

Nun kommt aber erschwerend hinzu, dass aus diesen Werten, die mir vorliegen noch andere Werte gecheckt werden müssen. Diese anderen Werte müssen aus einer Textdatei eingelesen werden, wobei diese Textdatei jedoch ein ziemliches Wirrwarr darstellt. Hier mal ein kleiner Ausschnitt aus der Textdatei:

MSDV 000380 30 01 23D=SWAA$
MSDV 000390 CC 01 * * *
MSDV 000400 CC 01 *** *** ***
MSDV 000410 CC 01 * * *
MSDV 000420 CC 01 * SPORT UTILITY VEHICLE *** +SWAA BS 05/SA
MSDV 000430 30 01 24R=SWAB$
MSDV 000440 CC 01 * * *
MSDV 000450 CC 01 *** *** ***
MSDV 000460 CC 01 * * *
MSDV 000470 CC 01 * SERIES 10 *** +SWAC VS 07/DB
MSDV 000480 30 01 23 =SWAC$
MSDV 000490 CC 01 * SERIES 45 *** +SWAD VS 07/DI
MSDV 000500 30 01 34I=SWAD$
MSDV 000510 CC 01 * SERIES 55 *** +SWAE VS 07/DK
MSDV 000520 30 01 34K=SWAE$
MSDV 000530 CC 01 * * *
MSDV 000540 CC 01 *** *** ***

Die unterstrichenen Passagen zeigen die Bedingungen, die zusätzlich überprüft werden müssen. Das bedeutet bspw. bei meiner Spalte 23 in der immer ein D steht, dass SWAA$ gleichbedeutend ist mit dem D, das in meiner Spalte steht. Dieses SWAA$ benötige ich später für einen Vergleich mit einer anderen Datenbank. Jedoch muss ich das vorher ja erst einmal einlesen.

Wie lässt sich dieses einlesen wohl am besten realisieren. Ich habe mir gedacht vielleicht über regular expressions oder liege ich da falsch. Und wie soll ich diese Ausdrücke speichern? In einem Array?
Oder sollte ich lieber eine Klasse schreiben, die diese Werte beinhaltet bzw. einliest. Macht es da einen Unterschied bezüglich der Performance? Das zu wissen wäre nicht unwichtig, denn es handelt sich um relativ große Datenmengen die geprüft werden sollen bzw. später verglichen mit einer anderen Datenbank, die diese Kombinationen wie SWAA$ enthält.

Hört sich bestimmt alles ziemlich konfus an für euch? (für mich leider auch im Moment :roll: )

Für Tipps wäre ich sehr dankbar.

MfG