Laden...

DataAdapter, allgemeine Frage zur Funktionsweise und Problem

Erstellt von kanedaa vor 19 Jahren Letzter Beitrag vor 19 Jahren 1.708 Views
K
kanedaa Themenstarter:in
39 Beiträge seit 2005
vor 19 Jahren
DataAdapter, allgemeine Frage zur Funktionsweise und Problem

Hallo zusammen!

Ich habe das Problem, das bei meiner Datenbankanwendung zwar alle meine Änderungen im DataSet übernommen werden ( ich sehe sie wenn ich mir den Inhalt des DataSet angucke), aber sie kommen nicht in der Datenbank an.
Ich weiss das ich die Update() Methode des DataAdapters aufrufen muss ( und vorher die AcceptChanges() des DataSets). Desweiteren hat mein Adapter Insert und Update Commands ( selbstgemacht, nicht mit dem Commandbuilder).
Aber egal wie mein Insert Command aussieht, nix kommt in der DB an.

Deshalb, bevor ich den Code poste, die eher allgemeine Frage:
Gebe ich einem DataAdapter immer ein SQL-Command mit Parametern, die dann sofort auch spezifieziere ( also welche Typ, welche Tabelle etc...), aber niemals selber mit Werten belege? Der DataAdapter erkennt doch beim Aufruf der Update Methode doch von alleine, welche Einträge sich geändert haben, und nur die werden dann geändert.
Setzt er dann von sich aus die Werte in die Parameter-Platzhalter im SQL Command?
Eigentlich hab ich schon "alles" versucht. Den SQL String per Konkatenation mit den Variablen selbst "zusammenstecken", die Parameter da übergeben wo die entsprechenden Werte bekannt sind, oder halt keine Parameter übergeben. Nix funzt.

Vorab: Ich schreib in C# eine Anwendung mit einer Access DB.

hier die Initialisierung meines DataAdapters:

P.S.: Ja ich bin ein ziemlicher Anfänger und hab gleichzeitig recht viel Druck das mein Programm endlich läuft


projekteAdapter = new OdbcDataAdapter(); 

OdbcCommand insProjekte = new OdbcCommand(); 
insProjekte.Connection       = myConnection; 
insProjekte.CommandText  = "INSERT INTO Projekte ([BV_Name], [BV_Nr]) VALUES (?,?)"; 
          
insProjekte.Parameters.Add("[BV_Name]", OdbcType.Text, 50); 
         insProjekte.Parameters.Add("[BV_Nr]", OdbcType.Text, 50); 

OdbcCommand updProjekte = new OdbcCommand(); 
updProjekte.Connection       = myConnection; 
updProjekte.CommandText = "UPDATE Projekte SET [BV_Name] = ?, [BV_Nr] = ? "; 

insProjekte.Parameters.Add("[BV_Name]", OdbcType.Text, 50); 
insProjekte.Parameters.Add("[BV_Nr]", OdbcType.Text, 50);

und hier der Aufruf der Update-Methode:


myDataSet.AcceptChanges(); 
erGOPausen2.MainInstance._ProjekteAdapter.InsertCommand.Parameters["[BV_Name]"].Value = bv_Name; 
erGOPausen2.MainInstance._ProjekteAdapter.InsertCommand.Parameters["[BV_Nr]"].Value   = bv_Nr; 
erGOPausen2.MainInstance._ProjekteAdapter.Update(myDataSet, "Projekte");

wie gesagt, diese Belegung der Parameter ist eine von vielen Versuchen, die ich hinter mir habe.
Und ich bekomme keine Fehlermeldung...
Es kommt einfach nix in der DB an...

Bin für jede Hilfe SEHR dankbar!!

140 Beiträge seit 2004
vor 19 Jahren

Also was mir aufgefallen ist:

Also für Access geht schon mal das mit den Fragezeichen nicht. Das muss ein Kommando im Stil von @bezeichner sein. Fragezeichen klappt nur bei allen anderen DB-Typen. Frag MS warum. schulterzuck

Die letzte Zeile im ersten Block:


insProjekte.Parameters.Add("[BV_Name]", OdbcType.Text, 50);
insProjekte.Parameters.Add("[BV_Nr]", OdbcType.Text, 50);

müsste doch


updProjekte.Parameters.Add("[BV_Name]", OdbcType.Text, 50);
updProjekte.Parameters.Add("[BV_Nr]", OdbcType.Text, 50);

sein

Außerdem musst du doch den DataAdapter das Kommando zuweisen.


projekteAdapter.InsertCommand = insProjekte;

Hoffe das passt soweit was ich hier, normalerweise schlag ich ADO.net auch immer in meiner Referenz nach nur die hab ich momentan nicht da.

P.s Deine Bezeichnung für Objekte usw. ist echt grausam 😁

140 Beiträge seit 2004
vor 19 Jahren

Sry, was gefragt hast du ja auch noch. 😁 Werd mal versuchen da auch drauf einzugehen, auch wenn ich mir echt ein bisschen schwer tue zu verstehen was du willst.

>Gebe ich einem DataAdapter immer ein SQL-Command mit Parametern, die dann >sofort auch spezifieziere ( also welche Typ, welche Tabelle etc...), aber niemals selber >mit Werten belege?
Is mir nicht so ganz klar was du wissen willst. Also die Vorgehensweise ist immer gleich. ins SQL-kommando einen platzhalter reinschreiben und anschleißend den genauer definieren was da hin soll. Direkt reinschreiben geht dann erst mit ADO.net 2.0

>Der DataAdapter erkennt doch beim Aufruf der Update Methode doch von alleine, >welche Einträge sich geändert haben, und nur die werden dann geändert.
>Setzt er dann von sich aus die Werte in die Parameter-Platzhalter im SQL Command?
Wenn ichs richtig verstanden hab, ist die Antwort ja 🙂

B
189 Beiträge seit 2004
vor 19 Jahren

Original von kanedaa
Ich weiss das ich die Update() Methode des DataAdapters aufrufen muss ( und vorher die AcceptChanges() des DataSets)

Genau da liegt der Fehler: AcceptChanges() darfst du eben nicht aufrufen. Damit werden nämlich alle DataRows auf "unverändert" gesetzt, so dass der Adapter denkt, er hätte nichts zu tun.

K
kanedaa Themenstarter:in
39 Beiträge seit 2005
vor 19 Jahren

ich schlauberger hab nich gesehen das der Thread verschoben wurde.

Vorab: Danke für jegliche Hilfe.

Ich hab das/die Probleme mittlerweise gelöst.
Zum einen das mit AcceptChanges, und die Parameterzuweisung zu den falschen Commands.
Allerdings geht es in Acces sehrwohl mit den Fragezeichen.

Aber zu meinem Problem mit dem Parametern, und wann sie einen Wert bekommen. So ganz ist mir das noch nicht klar, und da meine letze Frage wohl etwas kryptisch war, versuche ich es nochmal.

Ich habe ein update command, für das ich 3 Parameter habe.


OdbcCommand updProjekte = new OdbcCommand();
updProjekte.Connection  = myConnection;
updProjekte.CommandText = "UPDATE Projekte SET BV_Name = ?, BV_Nr = ? " + 
"WHERE ID_Projekt = ? ";			
updProjekte.Parameters.Add("BV_Name", OdbcType.VarChar);
updProjekte.Parameters.Add("BV_Nr", OdbcType.VarChar);

// Parameter zur Identifizierung des Datensatzes in der Datenbank
p = new OdbcParameter("ID_Projekt", OdbcType.Int);
p.SourceVersion = DataRowVersion.Original; 
updProjekte.Parameters.Add(p);

Soweit so gut.

So, wie kommen nun meine geänderten Werte in die Parameter?
Mein DataSet wird mit den neuen Werten aktualisiert:


if (CheckValues( bv_Name, bv_Nr))
{
	this.bv_Name = bv_Name;
                this.bv_Nr	= bv_Nr;
	
	DataRow newRow;
	try
	{
	         newRow = myDataSet.Tables["Projekte"].NewRow();
	         newRow["BV_Name"] = bv_Name;
	         newRow["BV_Nr"]   = bv_Nr;
                         myDataSet.Tables["Projekte"].Rows.Add(newRow);	
	}
	catch(System.ArgumentException ex)
	{
		MessageBox.Show(ex.Message, "Fehler beim hinzufügen der neuen Zeilen...");
}

Wenn ich nun DataAdapter.Update(myDataSet) aufrufe, müsste dann der DataAdapter nicht erkennen, welche Werte im DataSet sich geändert haben, und dementsprechend in die 3 Platzhalter oben im Updatecommand die neuen Werte einsetzen?
ODer muss ich das nochmal explizit machen?

Momentan funktioniert das bei mir so (und es geht):



DataAdapter.InsertCommand.Parameters["BV_Name"].Value = this.bv_Name;
DataAdapter.InsertCommand.Parameters["BV_Nr"].Value   = this.bv_Nr;
DataAdapter.Update(myDataSet, "Projekte");
myDataSet.AcceptChanges();


aber könnte ich mir diese Zuweisung der Parameter Values (also deren Inhaltes) nicht sparen?