Entwickler-Ecke

ASP.NET und Web - GridView -> Update über Combobox


mre_admin - Di 25.11.08 16:05
Titel: GridView -> Update über Combobox
Hallo,
ich habe ein GridView, das an eine SqlDataSource gebunden ist. Diese bekommt ihre Daten über ODBC von einer IBM/DB2-Datenbank (Also nicht über MS-SQL-Server!)

Nun möchte ich eine DropDownBox als EditItemTemplate einsetzen und den SelectedValue speichern.


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
<asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False" DataSourceID="SqlDataSource1">
    <Columns>
        <asp:CommandField EditText="[Edit]" UpdateText="[Speichern]" ShowEditButton="True" />
        <asp:TemplateField HeaderText="Erlaubt" SortExpression="SFT_ERLAUBT">
            <EditItemTemplate>
                <asp:DropDownList ID="ddErlaubt" runat="server" SelectedValue='<%# Eval("SFT_ERLAUBT").ToString()=="-1" ? -1 : 0 %>'>
                    <asp:ListItem Value="-1" >Ja</asp:ListItem>
                    <asp:ListItem Value="0" >Nein</asp:ListItem>
                </asp:DropDownList>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:CheckBox ID="CheckBox1" runat="server" Enabled="false" Checked='<%# (Eval("SFT_ERLAUBT").ToString()=="-1") ? true : false %>'/>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="ID">
            <EditItemTemplate>
                <asp:Label ID="lblID" runat="server" Text='<%# Bind("sft_id") %>'></asp:Label>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="lblID" runat="server" Text='<%# Bind("sft_id") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:connDB2IT %>" ProviderName="<%$ ConnectionStrings:connDB2IT.ProviderName %>" UpdateCommand="UPDATE RSITAA1.NISFT_SFT SET sft_erlaubt = ? WHERE sft_id = ?">
    <UpdateParameters>
        <asp:FormParameter FormField= "ddErlaubt" />
        <asp:FormParameter FormField="lblID" />
    </UpdateParameters>
</asp:SqlDataSource>

(Der SelectCommand wird bei mir im C# Code während Page_Load gesetzt)

Was passiert:
- Ich klicke auf Edit
- Wähle in meiner DropDownBox einen Wert aus
- Klicke speichern
- Die Seite Läd neu (PostBack)
- Der Wert hat sich nicht geändert

Wie geht das richtig?
Ich habe bis jetzt immer nur Lösungen gefunden die einen MSSQL-Server verwenden und deswegen mit der "[Feld] = @Wert"-Syntax arbeiten können. Ich bin aber leider auf die geschichte mit den Fragezeichen im Query angewisen [http://www.c-sharp-forum.de/viewtopic.php?t=85915] und da scheint das bis jetzt ja offensichtlich so nicht zu funktionieren


JüTho - Di 25.11.08 16:50

Hallo,

ODBC ist Schrott. Genauer: OleDb und Odbc sind Notlösungen, die nur dann verwendet werden sollten, wenn es nichts Besseres gibt. Für DB2 gibt es den DB2 DataProvider [http://www.connectionstrings.com/default.aspx?carrier=ibmdb2], der ist unbedingt vorzuziehen.

Die "Geschichte mit den Fragezeichen" ist so eine Sache, da jeder DbProvider die Platzhalter für Parameter nach eigener Vorstellung setzt. Oledb und Odbc benutzen '?'. Andere DbProvider benutzen Parameternamen mit '@' oder ':'; was DB2 macht, weiß ich nicht. Aber abgesehen von dieser Feinheit, den Bezeichnern der Klassen und speziellen Eigenheiten des SQL-Dialekts kannst Du alle Beispiele von MS-SQL direkt nach DB2-SQL übertragen.

Meine Hinweise sind aber offensichtlich nur von allgemeiner Bedeutung und helfen Dir überhaupt nicht. Aber konkret kann ich nichts sagen, da ich von der Arbeitsweise von ASP.NET keinerlei Ahnung habe.

Tut mir leid! Jürgen


mre_admin - Fr 28.11.08 13:09

Hmm...
also ich habe ein wenig gegoogelt und dieses Dokument gefunden [http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.dndp.doc/htm/frlrfIBMDataDB2.htm]
Zitat:
Mit DB2 .NET Data Provider können Ihre .NET-Anwendungen auf die folgenden Datenbankmanagementsysteme zugreifen:

* DB2 Universal Database Version 8 für Windows-, UNIX- und Linux-basierte Computer
* DB2 Universal Database Version 6 (oder höher) für OS/390 und z/OS (über DB2 Connect)
* DB2 Universal Database Version 5 Release 1 (oder höher) für AS/400 und iSeries (über DB2 Connect)
* DB2 Universal Database Version 7.3 (oder höher) für VSE & VM (über DB2 Connect)


Wir haben aber die Version 7.0 im Einsatz - also wird das wohl nichts mit dem Dataprovider, oder?

---

Aber mal davon abgesehen: Ich glaube ja irgendwie, dass einfach meine UpdateParamter falsch bestückt sind oder so. Bei Selectquerys in Zusammenhang mit "normalen" text- oder dropdownboxen (also welche, die nicht in einem gridview stecken) klappt das ja auch ganz gut mit den ?-Parametern


JüTho - Fr 28.11.08 13:43

Hmm, wenn es für Eure DB2-Version keinen NET Provider gibt, geht es wohl tatsächlich nicht anders.

user profile iconmre_admin hat folgendes geschrieben Zum zitierten Posting springen:
Aber mal davon abgesehen: Ich glaube ja irgendwie, dass einfach meine UpdateParamter falsch bestückt sind oder so. Bei Selectquerys in Zusammenhang mit "normalen" text- oder dropdownboxen (also welche, die nicht in einem gridview stecken) klappt das ja auch ganz gut mit den ?-Parametern

Ich sehe leider keinen Fehler (sonst hätte ich meinen Beitrag ergänzt). Die ? und die Parameter müssen in der Reihenfolge übereinstimmen; aber das tun sie ja offensichtlich.

Von ASP.NET habe ich keinerlei Ahnung. Unter ADO.NET hätte ich den Verdacht, dass der Datentyp im UpdateCommand und im FormParameter nicht übereinstimmen.

Jürgen