OrderedDictionary ist schreibgeschützt

07/05/2008 - 10:25 von Björn Dehmel | Report spam
Hallo zusammen,

ich bin dabei ein kleines Web-Projekt zu erstellen. Darin verwende ich ein
ObjectDataSource, da meine Datenbankverbindung zu einer iSeries aufgebaut
werden muss.

Der Designer hat mir dafür folgenden Code in der ASPX Seite eingebuden:

<asp:ObjectDataSource ID="ObjectDataSourcePerson" runat="server"
SelectMethod="GetPerson"
TypeName="DehArbUe.DAL.PersonenDAL"
DataObjectTypeName="DehArbUe.DAL.Person"
UpdateMethod="UpdatePerson"
onupdating="ObjectDataSourcePerson_Updating">
<UpdateParameters>
<asp:Parameter Name="p" Type="Object" />
</UpdateParameters>
<SelectParameters>
<asp:SessionParameter Name="personid" SessionField="PersonID"
Type="Int64" />
</SelectParameters>
</asp:ObjectDataSource>


Die Klasse PersonenDAL enthàlt dazu folgende öffentliche statische Methode:

/// <summary>
/// Aendert die Person in der Personen-Datei
/// </summary>
/// <param name="p">Person Daten</param>
public static void UpdatePerson (Person p)
{
using (iDB2Connection connection = new iDB2Connection
(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["as400Connection1"].ConnectionString))
{
iDB2Command comm = new iDB2Command ("UPDATE au_pers SET
aupers06=@Beginn, aupers07=@Ende, aupers08=@Nachname, " +
:
: Der SQL Befehl geht noch ein paar Zeilen weiter

connection.Open ();

comm.DeriveParameters ();

#region Werte den Parametern zuweisen
comm.Parameters["@Beginn"].Value = p.Beginn;
comm.Parameters["@Ende"].Value = p.Ende;
:
: Noch viel mehr Parameter-Zuweisungen

#endregion

comm.ExecuteNonQuery ();

comm.Dispose ();
connection.Close ();
}
}


In meinem Code-Behind reagiere ich auf das Drücken eines Buttons, wo ich das
Updaten auslösen möchte:

protected void ButtonAendern_Click (object sender, EventArgs e)
{
// Pruefen, ob die Seite gueltig ist (Validation durchfuehren)
if (Page.IsValid == true)
{
// Datensatz in der Datenbank aendern
this.ObjectDataSourcePerson.Update ();

Response.Redirect ("Ergebnis.aspx");
}
}

In dem folgenden Updating-Event wird das Objekt für die Updatefunktion mit
erzeugt und mit Daten geüllt:

protected void ObjectDataSourcePerson_Updating (object sender,
ObjectDataSourceMethodEventArgs e)
{
Person p = this.Session["SelectedPerson"] as Person;

#region Bevor die Update-Anweisung ausgefuehrt wird, die Daten aus den
Controls einem Person Objekt zuweisen
p.Beginn = this.VertragsFormular1.fm_Beginn;
p.Ende = this.VertragsFormular1.fm_Ende;
:
: Viele weitere Felder

// Die geaenderten Personen-Daten wieder dem Session-Objekt zuweisen
this.Session["SelectedPerson"] = p;

// Der Parameterliste die Person zuweisen
// e.InputParameters[0] = p; <-- SCHREIBGESCHÜTZT
e.InputParameters.Add ("p", p); <-- SCHREIBGESCHÜTZT
}

Warum sind die InputParamters schreibgeschützt? Wie weise ich denn das
Person-Objekt zu?

Ich habe auch schon versucht die Session Variable wieder zu benutzen:
<asp:SessionParameter Name="p" SessionField="SelectedPerson" Type="Object" />
aber dann sind alle Felder in meinem Person-Objekt leer, wenn UpdatePerson
ausgeführt wird.

Also, könnte bitte jemand den Schlauch auf dem ich stehe, unter meinen Füßen
wegziehen.

Gruß Björn
 

Lesen sie die antworten

#1 Björn Dehmel
07/05/2008 - 14:28 | Warnen spam
Nach Stunden des Suchens habe ich es nun doch gefunden:

bei dem ObjectDataSource war die Eigenschaft DataObjectTypeName angegeben.
Wenn dieses einen Wert hat, sind die Daten im OrderedDictionary readonly.

Mir scheint, dass dieses durch VS 2008 eingetragen wurde. Zuvor hatte ich
das Projekt nàmlich unter VS 2005 angefangen und da hatte ich das Problem
nicht.

Frage: Was muss an dem Code denn geàndert werden, wenn man den
DataObjectTypeName benutzen möchte? Ich schàtze mal, dass die
Parameterauflistung beim ObjectDataSource nicht mehr von nöten ist, aber wie
beeinfluße ich die Daten in den InputParameters?

Gruß Björn

Ähnliche fragen