DevTrain Startseite Visual Studio 1 Magazin  
  
  
SUCHEN:  
ARTIKEL ONLINE: 525   

Kategorien
.NET
Datenbanken
Web
XML

Allgemein
Camp
Foren
Events
Persönliche Einstellungen
Registrieren
Prämien Shop
Kontakt
Impressum
Über DevTrain

Autoren


   Autor: Hannes Preishuber Artikel Drucken
        
Schnell zum Webform?

Das Ziel ist es schnell eine Eingabemaske für Daten im Browser zu erzeugen. Was mit DTC's (Design Time Controls) in ASP in 60 Sekunden erledigt war, gerät mit ASP .NET und seinen Webcontrols zum Spießrutenlauf.
Um schnell etwas zu erledigen bedient man sich üblicherweise der vorhanden Assistenten. Bereits hier kommen erste Zweifel auf, da der Dataform Wizard nur ein Datagrid verwendet.
Intuitiv wird man wohl die Tabelle samt Felder aus dem Server Explorer auf das Webformular ziehen. Dies erzeugt aber nur eine Connection und einen Dataadapter auf dem ASPX Formular. Dazu wird schon eine Menge Code erzeugt in der Region  Web Form Designer Generated Code.
Hier tritt auch schon das erste Problem zu Tage, da der SQLConnection String in den Code eingebetet ist und sich immer wieder verändert. Deshalb kann man nicht auf einen zentralen  Connection String in z.B. der Web.Config verweisen. Dies ist besonders lästig, wenn ein Passwort auf der Datenbank gesetzt ist, da dies nicht im Dataadapter abgelegt wird.
Es werden umfangreiche SQL Kommandos für Update, Select usw erzeugt. Mit einem Rechtsclick auf den Dataadapter lässt sich der Wizard zum konfigurieren desselben starten. Hier kann man dann z.B. statt SQL Kommandos Stored Procedures verwenden, die auch gleich automatisch angelegt werden.
Bild1
Als nächstes benötigt man noch ein Dataset zum halten der Daten. Dies erreicht man ebenfalls über Rechtsclick auf den Dataadapter. Hier wird dann in einer seperaten Datei umfangreicher Code erzeugt.
Als nächstes designen Sie Ihr Formular mit Web Form Controls. Diese haben alle im Eigenschaftsfenster einen Bereich Databindings der den Binding Assistenten startet.
Bild2
Hier kann jedes Feld an ein Proberty des Controls gebunden werden. Sinnvoll ist bei einer Textbox die Eigenschaft Text und bei einer Checkbox checked. Für die Anzeige stehen Format Möglichkeiten bereit.
Um die Daten dann noch anzuzeigen muss in Page Load das Dataset gefüllt werden und die Controls gebunden werden. Sie können jedes Control einzeln binden oder alle auf einmal in der Page.
SqlDataAdapter1.Fill(DataSet11)
Page.DataBind()
 
Obwohl der Aufwand bis hierher größer ist als mit DTCs, kann man damit noch leben.
 
Speichern der Daten
Richtig hart wird es erst beim Speichern. Das Problem leigt darin begründet, das bei jedem Page Reload alle Variablen die nicht in Session oder Viewstate gespiechert sind, verloren gehen.
Man kann hier natürlich jetzt ein schönes Update Kommando basteln und absenden, es ist aber ne Menge Code vorhanden, der genutzt werden will. Zunächst benötigen wir einen Button.
Als eleganteste Möglichkeit, hat sich bisher das verwenden der Updatecommands herausgestellt.
Hier wird einfach jedem Parameter der entsprechende Wert des Webcontrols zugewiesen. Da es hier um kurzen Code geht ist die Fehlerbehandlung sehr unelegant über ein Try Catch gelöst. Die Message werden in einem Label ausgegeben, das auf keinen Fall Viewstate haben darf, da sonst die Fehlermeldung nicht mehr verschwindet.
Try
   SqlDataAdapter1.UpdateCommand.Parameters("@param1").Value = Session("anid")
   SqlDataAdapter1.UpdateCommand.Parameters("@anreise").Value = CType(txtAnreise.Text, Date)
   SqlDataAdapter1.UpdateCommand.Parameters("@Hotel").Value = chkHotel.Checked
   SqlDataAdapter1.UpdateCommand.Parameters("@EZDZ").Value = rdEZDZ.SelectedItem.Value
   SqlDataAdapter1.UpdateCommand.Parameters("@Hotelname").Value = txtHotel.Text              SqlDataAdapter1.UpdateCommand.Parameters("@Shuttle").Value = chkShuttle.Checked
   SqlDataAdapter1.UpdateCommand.Parameters("@ankunft").Value = CType(txtAnkunft.Text, DateTime)
...  
   SqlConnection1.Open()
   SqlDataAdapter1.UpdateCommand.ExecuteNonQuery()
        Catch ex As DataException
            lblError.Text = ex.Message
        Catch ex As Exception
            lblError.Text = ex.Message
End Try
Leider stellt sich bei dieser Methode heraus, das der Dataadapter Wizard es ganz genau nimmt und noch auf die vorherigen Werte vergleicht. Das SQL Commando oder Stored Proceudre ist ensprechend Umfangreich und muss gekürzt werden. Zum besseren Verständnis ein Teil des Codes den der Assistent erzeugt:
  Me.SqlUpdateCommand1.CommandText = "UPDATE konf_setting SET ansprech_id = @ansprech_id, anreise = @anreise, abreise =" & _
        " @abreise, Hotel = @Hotel, EZDZ = @EZDZ, HotelName = @HotelName, Shuttle = @Shut" & _
        "tle, Ankunft = @Ankunft, Abflug = @Abflug, Flugnummern = @Flugnummern, MCPTest =" & _
        " @MCPTest, PreKonf = @PreKonf, wisches = @wisches WHERE (Setting_id = @Original_" & _
        "Setting_id) AND (Abflug = @Original_Abflug OR @Original_Abflug IS NULL AND Abflu" & _
        "g IS NULL) AND (Ankunft = @Original_Ankunft OR @Original_Ankunft IS NULL AND Ank" & _
        "unft IS NULL) AND (EZDZ = @Original_EZDZ OR @Original_EZDZ IS NULL AND EZDZ IS N" & _
        "ULL) AND (Flugnummern = @Original_Flugnummern OR @Original_Flugnummern IS NULL A" & _
        "ND Flugnummern IS NULL) AND (Hotel = @Original_Hotel OR @Original_Hotel IS NULL " & _
        "AND Hotel IS NULL) AND (HotelName = @Original_HotelName OR @Original_HotelName I" & _
        "S NULL AND HotelName IS NULL) AND (MCPTest = @Original_MCPTest OR @Original_MCPT" & _
        "est IS NULL AND MCPTest IS NULL) AND (PreKonf = @Original_PreKonf OR @Original_P" & _
        "reKonf IS NULL AND PreKonf IS NULL) AND (Shuttle = @Original_Shuttle OR @Origina" & _
        "l_Shuttle IS NULL AND Shuttle IS NULL) AND (abreise = @Original_abreise OR @Orig" & _
        "inal_abreise IS NULL AND abreise IS NULL) AND (anreise = @Original_anreise OR @O" & _
        "riginal_anreise IS NULL AND anreise IS NULL) AND (ansprech_id = @Original_anspre" & _
        "ch_id OR @Original_ansprech_id IS NULL AND ansprech_id IS NULL) AND (wisches = @" & _
        "Original_wisches OR @Original_wisches IS NULL AND wisches IS NULL); SELECT Setti" & _
        "ng_id, ansprech_id, anreise, abreise, Hotel, EZDZ, HotelName, Shuttle, Ankunft, " & _
        "Abflug, Flugnummern, MCPTest, PreKonf, wisches FROM konf_setting WHERE (Setting_" & _
        "id = @Setting_id)"

Am einfachsten ist das Kürzen, wenn Sie mit einer Stored Procedure arbeiten.

Ausserdem muss dann noch jede Zeile gelöscht werden, die einen Parameter erzeugt mit den Orginal Daten. Hier eien Musterzeile aus der Codebehind Seite.
Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Setting_id", System.Data.SqlDbType.Int, 4, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Setting_id", System.Data.DataRowVersion.Original, Nothing))
 
Kommentar des Autors: Bisher habe ich ASP .NET uneingeschränkt geliebt. Das Speichern der Daten hat mir aber einen Stich ins Herz versetzt. Die Doku von MS gibt im wesentlichen folgendes wieder: 90 % der Jobs sind das anzeigen der Daten.... was für eine gequirlte Scheisse.
Vielleicht haben Sie ja einen besseren Lösungsweg!
 

 

DevTrain Camp - Schneller zum .NET 3.5 Developer
 
Verwandte Artikel      Verlinkte Dokumente
    Keine Links vorhanden

  Erfasst am: 07.05.2002
  Gültig bis: 06.06.2002
4 Ratings
Bewertung: 70,0%
schlecht    sehr gut  

 
© Copyright 2007 ppedv AG