Daten im DataSet ändern

26/06/2008 - 09:00 von Manfred.Klag | Report spam
Hallo Community,
ich arbeite mit einer MS-SQL 2005 Datenbank und mit Excel 2003.
Die Aufgabe:
Zugriff auf die Excel Datei via PIA (erledigt-funktioniert)
Ein Dataset füllen aus der Datenbank via OLEDB (erledigt - funktioniert.

Nun habe ich einen Excel-Bereich mit 300 Zeilen
und
ein DataSet mit einer Tabel 'Completed' mit 300 Zeilen
Die Werte jeder Zeile des DataSet/Table müssen in Spalte 3 ('FINALVALUE')
mit dem entsprechenden Wert aus der Excel-Tabelle ersetzt werden.

Problem:
Ich gehe das Excel-Sheet Zeile für Zeile durch (Spalte 1 und Spalte 2
enthalten einen Key-> mit diesem Key müssen die Werte im DataSet gefiltert
werden.
Es bleibt dann nur ein D-Satzt der geàndert werden soll.

Hilfe, ich kriegs einfach nicht hin den Wert zu setzen?

Könnt ihr mir helfen?
Hier der Code (C# Visual Studio 2005):
oAdapter.Fill(ds_PJCSA, "Completed");
int i = ds_PJCSA.Tables["Completed"].Rows.Count;


for (int z = 1; z <= csLastRow; z++) // csLastRow repr. die Anzahl
der Rows im DataSet ds_PJCSA
{

if (sAnalyte != "" && sAnalyte != null && sScheme != "" && sScheme
!= null && csResult != "" && csResult != null)
{
// hier werden aus einem Worksheet die Daten geholt:
// Werte für deen Filter auf mein DataSet aus einer MS-SQL
Datenbank
try { csSchAnalyte = worksheetValues.get_Range(csKoSchAnalyte +
z.ToString(), csKoSchAnalyte + z.ToString()).Value2.ToString(); }
catch { csSchAnalyte = "-;"; }
sTmpArr = csSchAnalyte.Split(',');
try { sAnalyte = sTmpArr[1]; }catch { };
try { sScheme = sTmpArr[0]; }catch { };

// hier wird ein Wert aus dem Worksheet geholt; dieser Wert
soll ins gefilterte DataSet ds_PJCSA(.Tables["Completed"]) eingetragen werden:
try { csResult = worksheetValues.get_Range(csFinalvalue +
z.ToString(), csFinalvalue + z.ToString()).Value2.ToString(); }
catch { csResult = "-;"; }

// ToDo:
// 1. Filter auf DataSet ds_PJCSA

// 2. Ergebniswert csResult in Table 'Completed' in Column
'FINALVALUE' eintragen

// 3. Die Zeichen 'NVL' in Table 'Completed' in Column
'ANALYTESTATUS' eintragen

}
}

// Update auf Datenbank
Vielen Dank
Gruß
Manfred
 

Lesen sie die antworten

#1 Elmar Boye
26/06/2008 - 10:33 | Warnen spam
Hallo Manfred,

Manfred.Klag schrieb:

hier nun die Antwort zur Frage in der C# NG...

ich arbeite mit einer MS-SQL 2005 Datenbank und mit Excel 2003.
Die Aufgabe:
Zugriff auf die Excel Datei via PIA (erledigt-funktioniert)
Ein Dataset füllen aus der Datenbank via OLEDB (erledigt - funktioniert.

Nun habe ich einen Excel-Bereich mit 300 Zeilen
und ein DataSet mit einer Tabel 'Completed' mit 300 Zeilen
Die Werte jeder Zeile des DataSet/Table müssen in Spalte 3 ('FINALVALUE')
mit dem entsprechenden Wert aus der Excel-Tabelle ersetzt werden.



Du müsstet uns schon etwas detaillierter mitteilen, wie die DataTable
aufgebaut ist.
Insbesondere welcher Schlüssel die Zeile bestimmst - also vermutlich
die Werte aus dem Excel-Bereich, denn ohne die Information kann man
nicht die Zeile.

Ich habe unten mal etwas Beispielcode angehàngt...


Problem:
Ich gehe das Excel-Sheet Zeile für Zeile durch (Spalte 1 und Spalte 2
enthalten einen Key-> mit diesem Key müssen die Werte im DataSet gefiltert
werden.
Es bleibt dann nur ein D-Satzt der geàndert werden soll.

.Hilfe, ich kriegs einfach nicht hin den Wert zu setzen?

Könnt ihr mir helfen?
Hier der Code (C# Visual Studio 2005):

oAdapter.Fill(ds_PJCSA, "Completed");
int i = ds_PJCSA.Tables["Completed"].Rows.Count;


for (int z = 1; z <= csLastRow; z++) // csLastRow repr. die Anzahl
der Rows im DataSet ds_PJCSA
{




Du kannst nicht davon ausgehen, das die Reihenfolge der Zeilen
in der DataTable identisch mit denen in der Excel-Tabelle ist -
ein zuverlàssiger Zugriff ist nur via DataView oder die
DataTable.Select Methode gewàhrleistet.

Anstatt also über die Zeilen der DataTable (via "z") zu iterieren,
solltest mit dem Arbeitsbereich des Excel Blattes arbeiten.

if (sAnalyte != "" && sAnalyte != null && sScheme != "" && sScheme
!= null && csResult != "" && csResult != null)
{



Du fragst hier Variablen ab, die Du unten erst bestimmst.

Da Du zudem unten im catch keine Behandlung vorsiehst, arbeitet die Bedingung
u. U. mit den Daten aus der vorherigen Zeile - das dürfte zu fehlerhaften
Werten führen (wenn mal "sAnalyte", mal "sScheme" gültig ist, so kann es
richtig bunt werden ;-)

// hier werden aus einem Worksheet die Daten geholt:
// Werte für deen Filter auf mein DataSet aus einer MS-SQL
Datenbank
try { csSchAnalyte = worksheetValues.get_Range(csKoSchAnalyte +
z.ToString(), csKoSchAnalyte + z.ToString()).Value2.ToString(); }
catch { csSchAnalyte = "-;"; }
sTmpArr = csSchAnalyte.Split(',');
try { sAnalyte = sTmpArr[1]; }catch { };
try { sScheme = sTmpArr[0]; }catch { };



Vermeide das try ... catch Konstrukt.
Das Behandeln von Ausnahmen kostet immer relativ viel Zeit, was (je nach
Hàufigkeit) schon alleine der Grund für die langsame Verarbeitung sein kann.

Und bei Excel Tabellen, die ein Anwender ausfüllt, sollte man generell
nie von richtigen Werten/Datentypen ausgehen.

// hier wird ein Wert aus dem Worksheet geholt; dieser Wert
soll ins gefilterte DataSet ds_PJCSA(.Tables["Completed"]) eingetragen werden:
try { csResult = worksheetValues.get_Range(csFinalvalue +
z.ToString(), csFinalvalue + z.ToString()).Value2.ToString(); }



Vermeide wiederholtes konvertieren von Variablen, wie z.ToString().

catch { csResult = "-;"; }

// ToDo:
// 1. Filter auf DataSet ds_PJCSA

// 2. Ergebniswert csResult in Table 'Completed' in Column
'FINALVALUE' eintragen

// 3. Die Zeichen 'NVL' in Table 'Completed' in Column
'ANALYTESTATUS' eintragen



Unten nun der Beispielcode, der allerdings viele Annahmen enthàlt.
Dort wird einmal der Zugriff über die Select Methode
und einmal der Zugriff über eine DataView gezeigt
(letzteres ist theoretisch schneller, dürfte aber bei Deinen
300 Zeilen praktisch keinen Unterschied machen).
Und am Ende noch, wie man sich die Daten einer DataTable
anzeigen lassen kann.

Zum "Üben" solltest Du zunàchst den Code auf Deine
ds_PJCSA.Tables["Completed"] Tabelle umstellen.

Gruß Elmar


public void CompletedTable()
{
// Beispielhafter Aufbau
DataTable completed = new DataTable("Completed");
completed.Columns.Add("KEY1", typeof(int));
completed.Columns.Add("KEY2", typeof(int));
completed.Columns.Add("FINALVALUE", typeof(double));

// Eindeutiger Schlüssel
completed.PrimaryKey = new DataColumn[]
{
completed.Columns["KEY1"],
completed.Columns["KEY2"]
};

completed.Rows.Add(1, 1, 4711.00); // Zeile 1, Spalte 1
completed.Rows.Add(1, 2, 4712.00); // Zeile 1, Spalte 2
completed.Rows.Add(2, 1, 4713.00); // Zeile 2, Spalte 1
completed.AcceptChanges();

// Auswàhlen einer Zeile via Select (1, 1)
DataRow[] rows = completed.Select(String.Format(
"[KEY1] = {0} AND KEY2 = '{1}'", 1, 1));
// Leeres Array, wenn nicht gefunden,
// bei Duplikaten (wegen PrimaryKey nicht möglich) können es auch mehrere sein.
if (rows.Length == 1)
{
rows[0]["FINALVALUE"] = 4714.00;
}


// Verwenden einer DataView
DataView completedView = new DataView(
completed,
"",
// Aufsteigend nach KEY1, KEY2 sortieren
"KEY1, KEY2",
DataViewRowState.CurrentRows);

// Hier Zeile 2, 1 (Angabe entsprechend der Sortierung)
int index = completedView.Find(new object[] { 2, 1 });
if (index >= 0) // ist -1 wenn nicht gefunden.
{
completedView[index]["FINALVALUE"] = 4715.00;
}


// Anzeigen der Werte
foreach (DataRow row in completed.Rows)
{
Console.WriteLine("({0}, {1}) = {2} ({3})",
row["KEY1"], row["KEY2"],
row["FINALVALUE", DataRowVersion.Current], // Aktuell
row["FINALVALUE", DataRowVersion.Original]); // Original
}
}

Ähnliche fragen