ADO.NET- Aktualaisiertes DataSet zurück in Datanbank schreiben.
-
Hallöchen!
Ich komme bei einem Problem nicht wirklich weiter. Ich aktualisiere mein DataSet (im Speziellen: Ich füge einige DataRows an) und will nun innerhalb des DataSet veränderte Tabelle zurück in die Datenbank schreiben. Dass dies mit der "Update" Methode des zurgörigen DataAdapter funktioniert, weiss ich auch. Nur wie verwende ich diese Methode innerhalb von meinem Programmkontext?
Hier ist ein Beispiel:
public bool GetListIntoDB(List<WebCustomer> thelist) { _CMDataSet ds = new _CMDataSet(); // Process all the Elements in the List // Do not process first set of data, therefore it's just descriptive data ds.EnforceConstraints = false; for (int i = 1; i < thelist.Count; i++) { _CMDataSet.tbl_OwnersRow newOwner = ds.tbl_Owners.Newtbl_OwnersRow(); customer = thelist[i]; newOwner.fname = customer.firstname; newOwner.lname = customer.name; newOwner.phone_home = customer.phone; if (customer.firstname == null) { customer.firstname = " "; newOwner.fname = customer.firstname; } if (customer.name == null) { // if no name is given, customer will not be processed! break; } ds.tbl_Owners.Rows.Add(newOwner); ds.EnforceConstraints = true; ds.AcceptChanges(); // Wie krieg ich die Sachen jetzt in die Datenbank? } return true;
Ich bin echt dankbar für alle Tipps!
-
Wenn ich Deinen Code richtig lese und verstehe wird der neue Konsument
nur übernommen wenn sein "Familienname" existiert!Du wirst ja denke ich ein Connectionobjekt haben Das DataSet ist im Prinzip besser wenn alles in einem Rutsch rüberzuschieben.
Da Du aber eine FOR-Schleife nutzen tust wäre es in diesem Fall besser
ein SqlCommand.Objekt zu nutzen und jeden Neuen Konsumenten explizit einzeln
über die Connection zur DB zu schicken.Moment ich nehme mal Deine Code und mache an entsprechender Stelle Kommentare
und mit Pseudocode meinen Lösungsvorschlag deutlicher.
-
[cs]
public bool GetListIntoDB(List<WebCustomer> thelist)
{_CMDataSet ds = new _CMDataSet();
// Process all the Elements in the List
// Do not process first set of data, therefore it's just descriptive data
ds.EnforceConstraints = false;
for (int i = 1; i < thelist.Count; i++)
{
_CMDataSet.tbl_OwnersRow newOwner = ds.tbl_Owners.Newtbl_OwnersRow();
customer = thelist[i];
newOwner.fname = customer.firstname;
newOwner.lname = customer.name;
newOwner.phone_home = customer.phone;if (customer.firstname == null)
{
customer.firstname = " ";
newOwner.fname = customer.firstname;
}// Konsument nur in DB tun wenn mind. sein Famillienname existiert
if (customer.name != null)
{
try
{
// SqlCommand-Instanz aufbauen gemäss der Konsumentendaten die in eine bestimmte Tabelle deiner DB sollen INSERT nutzen
string cmd = "INSERT INTO " + TabellenNameVomDataSetHolen + " VALUES (" + costumer.firstname + ", .....)"; // Werte und Reihenflge entsprechend Datensatzaufbau der Tabelle der Konsumenten beachtenSqlCommand dasSqlCommand = new SqlCommand(cmd,dasConnectionObjekt);
dasConnectionObjekt.Open();
// das SQL quasi den INSERT-Befehl ausführen
dasSqlCommand.ExecuteNonQuery();
dasConnectionObjekt.Close();}
catch(System.Exception ex)
{
// irgendwie den Fehler behandeln...}
}}
return true;
}
[/cs]
-
Werde ich mal versuchen, Vielen Dank.
-
warum die Codeeinrückungen jetzt nicht funzen hmmm...
-
Solange Du diese Konsument nur in eine Tabelle einfügst sollte es so gehen!
Dann kannst Du oben das EnforceConstraints raushauen.
Also mit den CodeTags ich weiss nicht habe doch cs-Anfangs und Endtag drin.
Ich hoffe Du kannst es trotzdem lesen.
Bei der Lösung brauch man dann das DataSet im Prinzip auch nichtmehr die Konsumenten stecken ja in der List-Instanz.Wie ich sehe nutzt Du .NET 2.0, dein DataSet dort scheint sich auch von dem im 1.1er zu unterscheiden?
_CMDataSet.tbl_OwnersRow newOwner = ds.tbl_Owners.Newtbl_OwnersRow();
Im 1.1er-DataSet spricht man Tabellen über den Indexoperator der DataSet-Property "Tables" an.
Muss mal sehen das ich mir vor Ende dieses Jahr auch noch ne Standardversion
von VS 2005 ergattere.
-
grundsätzlich ist Handling zwischen SqlCommand und OleDbCommand gleich
Unterscheidung nur im Connectionstring;try { int result = 0; OleDbConnection Conn = new OleDbConnection(); Conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\EnglischDeutsch.mdb;"; OleDbCommand Comm = new OleDbCommand(@"INSERT INTO Vokabeln VALUES ('Geschäft','Konsument','Costumer',0)", Conn); Conn.Open(); result = Comm.ExecuteNonQuery(); Conn.Close(); Console.WriteLine(result); Console.ReadLine(); } catch(System.Exception ex) { Console.WriteLine(ex.Message); Console.Read(); }
Tut seinen Dienst ich habs gleich getestet und die DB mal in ACCESS geöffnet Datensatz ist eingetragen.
P.S.: Für die Connectionstrings der einzelne unterschiedlichen Datenbanken kursierte hier mal ein Link im Forum
http://www.google.de/search?hl=de&q=Connectionstring+%2B+ACCESS&btnG=Suche&meta=
http://www.connectionstrings.com/
-
sclearscreen schrieb:
Solange Du diese Konsument nur in eine Tabelle einfügst sollte es so gehen!
Erstmal vielen Dank, dass Du Dir so viel Mühe gibst!
Es können durchaus Inhalte eingefügt werden, die zu anderen Tabellen gehören, welche in Relation zu "Owner" stehen. ich meine mich aber zu erinnern, dass sowas mit dem richtigen SQL Befehl auch möglich ist.
-
saruman@work schrieb:
sclearscreen schrieb:
Solange Du diese Konsument nur in eine Tabelle einfügst sollte es so gehen!
Erstmal vielen Dank, dass Du Dir so viel Mühe gibst!
Es können durchaus Inhalte eingefügt werden, die zu anderen Tabellen gehören, welche in Relation zu "Owner" stehen. ich meine mich aber zu erinnern, dass sowas mit dem richtigen SQL Befehl auch möglich ist.
ja eben man kann aber auch den Insertbefehl entspechend aufbauen.
Oder eben mehrer INSERT in entsprechender Reihenfolge machen um die Datenintegrität der DB zu schützen. Ist aber eben Stark von der Struktur der DB abhängig.Aber hat man eine entsprechende professionelles DBMS ala SQL-Server oder Oracle
kann dieses DBMS entsprechend konfiguriert werden. Dann passen diese DBMS selbst auf die Intergität der dort laufenden Datenbanken auf. kann man ja beim aufsetzen einer DB alles bei jeder Tabelle einstellen. Das entlastet wiederum den Quellcode beliebiger Frontends in Gott weiss was fuer Sprachen gemacht.Deshalb über gebrauchte SQL-Statments fuer die DB Gedanken machen, und auch mal schauen wie entsprechend DB konfiguriert ist.
Und deshalb grundsätzlich vorher immer alles auf einer Shell des DBMS oder ähnlichen Testen. Aber das gilt in unserer Branche ja überall, sollte also ein alter Hut sein.Gruss
-
Dahinter steht ein MS SQL Server 2000, die Relationen sind im Server Designed. Kann der dann wirklich die Relationen mitverwalten, wenn ich die Kommandos in der richtigen Reihenfolge absetze oder überwacht der nur, ob alles seine Richtigkeit hat um dann iM Zweifelsfall einen Fehler zu geben?
-
saruman@work schrieb:
Dahinter steht ein MS SQL Server 2000, die Relationen sind im Server Designed. Kann der dann wirklich die Relationen mitverwalten, wenn ich die Kommandos in der richtigen Reihenfolge absetze oder überwacht der nur, ob alles seine Richtigkeit hat um dann iM Zweifelsfall einen Fehler zu geben?
Ich gebe zu ich bin kein DB-Admin aber letzten Sommer 2005 war ich auf einer Firmenschulung fürs .NET
Dort habe ich 2mal eine SQL-Server aufgesetzt und Testfrontends in C# gecodet.
Sind dann die Tabellen mit entsprechenden Restriktionen aufgesetzt werden die auch ans Frontend durchgereicht über die DB-Konnektivität.
Man kann ja beim erstellen auf die Tabellen CONSTRAINTS setzen. Man kann Einschränkungsprüfungen auf Schlüsselspalten aktiviren/deaktivieren etc. Der Datenbankserver loggt ja alles im Transaktionsprotokoll mit das steht ja soweit ich weiss in der master-DB des Server diese kann man auch mit SQL abfragen man muss dann aber in der entsprechenden Datenbankrolle eingeloggt sein -> Serveradmin!Ist entsprechendes in der DB konfiguriert und kommen ominöse Dinge vom Frontend sollten dann eine entsprechende SqlException/OleDbException in der Art kommen.
Leider ging die Firmenschulung nur 3 Monate keine Zeit zum ausgibigen Testen.
Zumal ich dort für den DB-Experten ein paar .NET-Sachen gemacht habe was in Verbindung mit DB nicht seine Stärke war.Also Bei INSERT/Select-Kommandos kommen dann Meldungen das man z.b. Parameter zuviel, zuwenig oder einen falschen Parameter angegegben hat.
Also die entsprechend konfigurierte DB die auf dem Server läuft verwaltet diese Restriktionen. Jede DB kann entsprechend wie Sie konfiguriert ist dann entsprechend laufen. Und dann werden entsprechend gesetzte Restriktionen auf Tabellen überwacht und verhindert.
Grundsätzlich wurden Wir auf der Schulung so erzogen das alles was die DB sicherstellen kann im Bezug auf Integrität und Sicherheit auch eingestellt wird.
Man weiss ja nie wenn man morgen gefeuert wird oder in Rente geht, wer dann die Frontends in die Finger bekommt. Entsprechend weniger Ärger hat dann der DB-Admin aus Datensicherheitsgründen.
-
Ja jetzt ist mein Abendbrot dabei kalt geworden....
-
Ja und im Zweifel kann man im Frontend Restriktionen auch einkodieren dann hat man nochmehr Sicherheit.
Man sieht es bleibt unter entsprechenden Umständen ein Drahtseilakt.
Der Akt ist umso weniger schwierig je besser Dinge die dieses anbelangen
dokumentiert werden und wenn die Kommunikation in der Firma funktioniert.So mehr kann ich dazu auch nichtmehr sagen Latein am Ende das ist so meine Erfahrung was ich auf dem Gebiet ADO.NET dank der Schulung sammeln konnte.
Das war echt interessant.
-
Nochmals unendlichen Dank.
Solche Schulungen gibt es hier nicht, oftmals muss da die MSDN herhalten, mit Glück mal ein Buch. Insbesondere in der MSDN ist das alles oft sehr dürftig dargestellt (man will ja Schulungen verkaufen...).Vielen Dank und nen Schönen Abend noch.
-
[quote="sclearscreen"]
Du wirst ja denke ich ein Connectionobjekt haben Das DataSet ist im Prinzip besser wenn alles in einem Rutsch rüberzuschieben.
quote]
Vermutlich habe ich auch eins, das Data Set wurde eben automatisch generiert (Aus "Datenquellen hinzufügen" in Visual Studio). Ich weiss nur nicht, wie ich mir da eíne Instanz von hole.
-
würde sagen geh mal in die Quelltextansicht, einaml an den Anfang des Qellcodes mit Maus klicken. Dann in Deiner IDE STRG + F drücken.
Jetzt Suchmal nach der Zeichenkette ConnectionString oder Connection
Jedes Objekt ob OleDbConnection, OdbcConnection, SqlConnection, OracleConnection und und und... verfügt über einen Member ConnectionString
Beharrliches Weitersuchen müsste Dich wenn so ein Ding automatisch generiert wurde über folgendes ähnliches Konstrukt bringen. Wenn es generiert wurde müsste es in der Methode InitializeComponent zu finden sein die vom Codegenerator gfrickelt wurde zu finden sein. Die Definition findest Du in
der Region#region Vom Windows Form-Designer generierter Code
die kannst Du ja mit der Maus aufklappen/zuklappen.
Und eben bei der Suche müsstest Du auf so eine Zuweisung stossen...
[cs]
NameConnectionInstanz.ConnectionString = "....; Data Source=...;..."
[/cs]Wenn Du es findest kennst Du dann auch automatisch den Namen dieser Variablen/Instanz.
Solltest Du sowas nicht finden wurde es auch nicht generriert. Daraufhin
würde ich vorschlagen bau Die in einem Testkonsolenprojekt zu Fuss ein
Connectionobjekt zusammen womit Du Dich mit Deine DB verbinden kannst ist Dir das gelungen, erzeuge in Deinem ernsten Projekt ein Connectionobjekt von Hand
und kopier Dir die Connectionzeichenkette per Hand STRG + C STRG + V
in entsprechende Zuweisung.P.S.: um für die verschieden DBMS zwecks Verbindungsaufbau eine ConnectionString zusammenklopfen zu können verweise ich nochmal auf den URL
http://www.connectionstrings.com/
Als Beispiel hast Du ja auch noch meinen Beispielcode einer OleDbConnection-Instanz etwas weiter oben.
-
Danke, gefunden.