Hallo,

>
> Hallo!
>
> > > da1.Fill(ds1)
> > > da2.Fill(ds2)
> > > ds1.Merge(ds2, true, System.Data.MissingSchemaAction.Add)
> > > da1.Update(ds1)
> > > ds2.Merge(ds1, true, System.Data.MissingSchemaAction.Add)
> > > da2.Update(ds2)
> >
> > Naja soweit bin ich noch nicht.
> > Erst mal wollte ich es schaffen die ServerDB zu aktualisieren.
>
> Ein oder zwei DBs, das Prinzip ist immer das Gleiche:
> Der DataAdapter ist eine Schnittstelle zur Datenbank und stellt die
> SELECT-, INSERT-, DELETE- und UPDATE-Kommandos zur Verf�gung. Das
> DataSet wird �ber den DataAdapter gef�llt. Die Daten k�nnen dann z. B.
> mit dem DataGrid angezeigt und bearbeitet werden. Alle �nderungen werden
> dabei aber nur im DataSet vollzogen und gelangen erste mit
> "DataAdapter.Update(DataSet)" wieder in die Datenbank. Dazu muss der
> DataAdapter aber �ber korrekte INSERT-, UPDATE- DELETE-Befehle mit
> Parametern verf�gen. UPDATE- und DELETE-Kommando ben�tigen dar�ber
> hinaus auch eine Spalte, die die Tabellenzeile eindeutig definiert.
> IDENTITY-(AutoInkrement-)Spalten d�rfen im INSERT-Kommando nat�rlich
> nicht auftreten, da die Werte ja von der Datenbank generiert werden.

O.K. Ich habe zwei Methoden:
getData()
setData()

Mit getData() hole ich mir alle Records, die f�r den einen Client
verantwortlich sind (MachineID).
Das klappt auch wunderbar. Ich lasse mir in der Konsole das Dataset ausgeben
...
Im Select habe ich die ID-Spalte drinnen.

Bei setData() habe ich die Insert, Update und Delete Kommandos drinnen (In
dieser Reihenfolge).
Die ID kommt hier nur in der Klausel vor:
Insert Into tabelle (...spalten ohne ID) values( .... )
Update tabelle set spalte= @wert, ...... where ID=@oldID
Delete .... where ID=@oldID

Die @spaltenname f�lle ich mit Parameter.Add....

So jetzt habe ich noch den Client:
Hier hole ich mir mit getData() die Daten in ein DataSet (ds)
Dem ds f�ge ich eine neue Row hinzu und .... Hier der Knackpunkt ...
Gebe ich die ID mit an, dann beschwert er sich, da� die ID bereits vergeben
ist
Gebe ich keine ID an, dann akzeptiert er es, macht aber ein gew�hnliches
Insert des "sozusagen" gleichen Datensatzes nur eben mit ner neuen ID.

Kann es ein Problem sein, da� ich das DataRow ienfach per Text Adde:

    DataSet myDS = mySamp.getData(om_operator);
    DataTable myTable = myDS.Tables["VHS"];
    DataRow newRow = myTable.NewRow();
        newRow["FILM"] = "00000000";    '<-- Dies ist die eigentliche Idendity Spalte
der bestehenden DB.
                                        'Ich habe darauf keinen Einfluss. Sie war aber 
nie als Prim�rschl�ssel
definiert worden.
                                        ' Sie w�re zwar eindeutig, aber der darin 
enthaltene Varchar-String ist
frei zu vergeben
                                        ' und wird nur softwarem��ig �berwacht.
.... Noch ein paar Spalten ...
    newRow["om_operator"] = 1;          ' <!-- Die MaschinenID der jeweiligen
ClientDB
    newRow["om_NewFlag"] = false;       ' <!-- Das brauche ich f�r sp�ter ... Wenn
ein Insert stattfindet, sollte dies hier auf true sein, wenn Update dann
false
    newRow["om_timestamp"] = "23/07/2002";      '<-- Hier kommt der aktuelle
Timestamp (inkl. Uhrzeit) rein. Nur um Serverseitig zu wissen, wann die
letzte Aktualisierung war.
    newRow["om_unique_Ident"] = "5BD0ABB3-58B2-4B21-852F-9BC6C42C6C43"; '<--
Guid um den Datensatz eindeutig �ber mehrere DB's zu identifizieren...
    //newRow["om_int_Ident"] = 1319;    '<-- Diese ID besteht bereits in der DB
Es ist die Idendity / Autoincrement-Spalte


    myTable.Rows.Add(newRow);
    DataSet updDS = new DataSet();
    updDS = mySamp.setData(myDS.GetChanges());

    Console.WriteLine(myDS.GetXml());
    Console.WriteLine(updDS.GetXml());

    myDS.Merge(updDS, true, System.Data.MissingSchemaAction.Add);
    myDS.AcceptChanges();

Sorry wenn ich jetzt schon code rumschicke, aber das ist ja der Punkt, da�
egal ob ich die ID drinnen hab oder nicht ... er insertet, oder gibt Fehler
aus ....


>
> > Hier tritt aber nun das Problem auf:
> > -Habe ich keinen Prim�rschl�ssel, dann macht er jedesmal das
> > InsertCommand -Habe ich einen Prim�rschl�ssel, dann schimpft
> > er, da� ich eine Row hinzuf�gen will, in der der
> > Prim�rschl�ssel bereits vergeben ist.
> > Kann ich keine zwei Tabellen Mergen, die einen Prim�rschl�ssel haben?
>
> Wenn Dein Prim�rschl�ssel ein IDENTITY-(AutoInkrement-)Wert ist, darfst
> Du diese Spalte nat�rlich nicht im INSERT-Befehl verwenden. Baue das
> INSERT-Kommando ohne diese Spalte auf, und die Daten k�nnen eingef�gt
> werden.

Das habe ich auch so...
Insert into tabelle (spalte, spalte, spalte) values(@wert1, @wert2,....)
..InsertCommand.Parameters.Add [EMAIL PROTECTED]

>
> > Ich dachte (und darum gehts mir die ganze Zeit), da� ich eben
> > auch zwei gleiche Datens�tze Mergen kann. Also ich habe lokal:
> > ID  Name            Passwort
> > 1   Mansur  neuesPWD
> >
> > Ich hole mir das DataSet vom Server:
> > ID  Name            Passwort
> > 1   Mansur  altesPWD
> >
> > So jetzt will ich, weil ich eine �nderung auf dem Client
> > habe, da� er mir diese �nderung in das Dataset einf�gt und
> > dort Updated.
>
> Das UPDATE-Kommando hat folgenden Aufbau:
> UPDATE table SET Name = [p1], Passwort = [p2] WHERE id = [p0]
>

Genau so ... Ich arbeite mit Parameter.Add

> Die PrimaryKey-Spalte wird also auch nicht mit SET belegt, der
> PrimaryKey wird verwendet, um die Tabellenzeile eindeutig zu
> identifizieren (WHERE id = ...) und darf deshalb nicht ver�ndert werden.
> IDENTITY-(AutoInkrement-)Werte d�rfen im SQL Server auch gar nicht
> ver�ndert werden.

Jaaaaa... Soviel wei� ich auch ....

Ich mache das so:
custDA.UpdateCommand = New SqlCommand("UPDATE VHS Set " & _
"FILM = @FILM, " & _
"TITOLO = @TITOLO, " & _
......
"WHERE om_int_Ident = @Oldom_int_Ident", VIDEOConn)

custDA.UpdateCommand.Parameters.Add("@FILM", SqlDbType.NChar, 8, "FILM")
custDA.UpdateCommand.Parameters.Add("@TITOLO", SqlDbType.NChar, 50,
"TITOLO")
.......

Dim myParm As SqlParameter =
custDA.UpdateCommand.Parameters.Add("@Oldom_int_Ident", SqlDbType.int, 4,
"om_int_Ident")
myParm.SourceVersion = DataRowVersion.Original


>
> > > In VS.Net werden die DataAdapter ja fast automatisch erstellt.
> >
> > Leider habe ich kein VS.Net. Ich verwende f�r die ganze
> > Geschichte asp.Net WebMatrix von Microsoft ... h�ndisch ...
>
> Na ja, die Beta 2 oder 3 bzw. ein ReleaseCandidat tut's ja auch,
> zumindest zum Lernen w�rde ich das sehr empfehlen. Ganz wichtig ist mir
> dabei auch, dass die Datenbankentwicklung direkt in VS.NET erfolgt, so
> dass �nderungen auch in den Installer einflie�en. WebMatrix ist ein
> tolles Produkt, kommt aber nicht ann�hernd an Visual Studio heran. Und
> die MSDN brauchst Du ja auch, deshalb f�hrst Du mit der MSDN
> Subscription Professional doch relativ preiswert (1.050 � pro Jahr
> inklusive VS.NET, kompletter MSDN einschl. SDKs und 10 beliebige
> Betriebssysteme f�r Entwicklung und Test) und bekommst jeden Monat die
> aktuellsten Versionen.

O.K. mit der �bern�chsten Rechnung werde ich mir ein MSDN subscriben ....
Alle wissen aber, da� die letzten 12 Monate eine schwierige Zeit waren und
es jetzt so langsam aufw�rts geht. Da muss ich halt im Moment noch etwas auf
mein Geld achten ...
Vor allem weil ich halt genau seit dieser Zeit auch noch eine Familie
versorgen muss....
Vorher wars da einfacher als wir zwei Verdienste hatten ... :-)

...Das so aus der privaten Jukebox...


Gru� Mansur

>
> Freundliche Gr��e
> Joachim van de Bruck
>
>
>
> | [aspdedotnet] als [EMAIL PROTECTED] subscribed
> | http://www.dotnetgerman.com/archiv/aspdedotnet/ = Listenarchiv
> | Sie k�nnen sich unter folgender URL an- und abmelden:
> | http://www.dotnetgerman.com/listen/aspDEdotnet.asp
>


| [aspdedotnet] als [email protected] subscribed
| http://www.dotnetgerman.com/archiv/aspdedotnet/ = Listenarchiv
| Sie k�nnen sich unter folgender URL an- und abmelden:
| http://www.dotnetgerman.com/listen/aspDEdotnet.asp

Antwort per Email an