Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Ερώτηση για Retrieving Data με χρήση Business Object μοντέλου.

Îåêßíçóå áðü ôï ìÝëïò Chrysostomos Kolovos. Τελευταία δημοσίευση από το μέλος infoCENTER στις 10-03-2010, 18:39. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-03-2010, 19:15 57532

    Ερώτηση για Retrieving Data με χρήση Business Object μοντέλου.

    Το πρόβλημα μου είναι ότι χρησιμοποιώ ένα object για κάθε ένα πίνακα στη βάση και όταν κάνεις join σε ένα query και θες να πάρεις δεδομένα από πολλούς πίνακες κολλάς στο που θα τα βάλεις.
    Τι τεχνικές υπάρχουν για αυτό το πρόβλημα?
    Υπάρχει δυνατότητα να δημιουργείς objects ανάλογα με τα αποτελέσματα που σου δίνει ένα select query μιας stored procedure?




  •  08-03-2010, 20:00 57533 σε απάντηση της 57532

    Απ: Ερώτηση για Retrieving Data με χρήση Object μοντέλου.

    Σε τι τεχνολογίες αναφέρεσαι; Είναι πολύ γενική η ερώτησή σου. Τι είδους object έχεις για κάθε πίνακα; Τυπικά, πάνω σε object collections μπορείς να χρησιμοποιήσεις Linq ωστόσο θα πρέπει να εξηγήσεις λίγο παραπάνω το τι κάνεις και πως το κάνεις.

     


    Vir prudens non contra ventum mingit
  •  08-03-2010, 20:33 57534 σε απάντηση της 57533

    Απ: Ερώτηση για Retrieving Data με χρήση Object μοντέλου.

    Τεχνολογία asp.net. Δημιουργώ μια κλάση για κάθε ένα πίνακα εννούσα. Δηλαδή αν έχω ένα πίνακα "Πελάτες" με 10 πεδία κάνω μια αντίστοιχη κλάση με τα αντίστοιχα properties.

    Χρεισημοποιώ το codesmith και έχω φτιάξει templates και μου βγάζει κατευθείαν τρία πράγματα:
    • τις StoredProcedures τις κλασικές (για κάτι ποιο εξεζητημένο το γράφω)
    • Μια κλάση με properties τα πεδία του πίνακα.
    • Μια κλάση που έχω τις Functions που κάνουν τις δουλιές μου(Insert,Update,Delete,Count,Τα διάφορα select κ.α.
    Τέλος στα bindings σε λίστες που έιναι και το προβλημα μου τα κάνω με ObjectDataSource και τους δίνω μια ilist από το εκάστοτε object. Έχω υλοποιήσει μια function για να κάνει Select Paged και με Ordering.
    Όταν όμως θέλω να κάνω μια λίστα με αποτελέσματα πεδία από διάφορους πίνακες, δεν υπάρχει κάποια κλάση για να πετάξω μέσα το αποτέλεμα του query. Ψάχνω ένα καλό Practice για αυτό.

    Σχετικά με το object collections δεν το γνώριζα και φαίνεται κοντά σε αυτό που φαντάζομαι οτι ψάχνω. Άμα γεμίσω μια λίστα με collections Μετά λογικά θα μπορώ να την κάνω bind σε μια λίστα?


    Ευχαριστώ για την απάντηση.


  •  08-03-2010, 22:24 57537 σε απάντηση της 57534

    Απ: Ερώτηση για Retrieving Data με χρήση Object μοντέλου.

    Όπως το φαντάστικα υπάρχει θέμα το binding. Έχω γράψει 2 Κώδικες.
    Protected Function LoadFromReaderCollection(ByVal reader As SqlDataReader) As Collection
            Dim MyCollection As New Collection
            If Not IsNothing(reader) AndAlso Not reader.IsClosed Then
    
                Dim curstr As String = ""
                Dim TotalFields As Integer = reader.FieldCount - 1
    
                For i As Integer = 0 To TotalFields
                    If Not (reader.IsDBNull(i)) Then
                        curstr = reader.GetValue(i)
                    Else
                        curstr = ""
                    End If
                    MyCollection.Add(curstr, reader.GetName(i))
                Next
    
            End If
            Return MyCollection
        End Function
    
        Protected Function LoadFromReaderDictionary(ByVal reader As SqlDataReader) As IDictionary
            Dim dict As IDictionary = New Dictionary(Of String, String)()
            If Not IsNothing(reader) AndAlso Not reader.IsClosed Then
                Dim curstr As String = ""
                Dim TotalFields As Integer = reader.FieldCount - 1
    
                For i As Integer = 0 To TotalFields
                    If Not (reader.IsDBNull(i)) Then
                        curstr = reader.GetValue(i)
                    Else
                        curstr = ""
                    End If
                    dict.Add(reader.GetName(i), curstr)
                Next
    
            End If
            Return dict
    
        End Function
    Στη μια περίπτωση πέρνω Collection στην άλλη IDictionary με τα πεδία του Select Query και τα βάζω μετά σε μια Ilist και δοκιμάζω να τα βάλω σε ένα gridview.
    Αλλά είτε με Eval πας(<%# Eval("Id")%>) να πάρεις κάποια τιμή είτε με BoundField (<asp:BoundField DataField="Id" HeaderText="id" />) δεν βρίσκω κάποιο τρόπο.
    Πήγα να δω μπας και το κατάφερνα στο RowDataBound event αλλά δεν μπορούσα να βρώ κάπου το object που δίνει για να γίνει bound.

    Ισως έχω βγει εκτός δρόμου αλλά είχε ενδιαφέρον να το κοιτάξω αυτό.






  •  09-03-2010, 06:35 57541 σε απάντηση της 57532

    Απ: Ερώτηση για Retrieving Data με χρήση Object μοντέλου.

    Θέλεις στα δεδομένα αυτά που θα πάρεις να κάνεις και ενημερώσεις στην βάση ή είναι μόνο για εμφάνιση;

  •  09-03-2010, 13:49 57560 σε απάντηση της 57541

    Απ: Ερώτηση για Retrieving Data με χρήση Object μοντέλου.

    Εμφάνιση. 

  •  09-03-2010, 19:27 57583 σε απάντηση της 57560

    Απ: Ερώτηση για Retrieving Data με χρήση Object μοντέλου.

    Τότε τα πράγματα είναι πιο απλά. Κοίτα επειδή λίγο πολύ όλοι μας έχουμε ασχοληθεί με το θέμα εγώ χωρίς να έχω καταλήξει σε κάποια λύση ακολουθώ δύο προσεγγίσεις με σκοπό να δω στο μέλλον πως θα εξελιχθούν τα πράγματα και ποια τελικά είναι η καλύτερη.

    Η πρώτη είναι να φτιάξω ένα class με τα συγκεκριμένα πεδία και η δεύτερη είναι ένα Dataset με DataTables όπου το κάθε DataTable είναι μία συλλογή από πεδία που θέλω να πάρω από την βάση. Άν κάποιος άλλος έχει διαφορετικό τρόπο προσέγγισης θα ήθελα να τον ακούσω και εγώ για να πάρω και μία παραπάνω γνώμη.

  •  10-03-2010, 13:34 57599 σε απάντηση της 57583

    Απ: Ερώτηση για Retrieving Data με χρήση Object μοντέλου.

    Έχω βρει μια λύση που κάνω και bind οπότε σας την γράφω για σχολιασμό. Επίσης διάβασα κάτι ωραία άρθα πάνω στο binding με χρήση του Eval(),Bind(),Xpath() το πιο καλό ήταν αυτό.


       Protected Function LoadFromReaderDictionary(ByVal reader As SqlDataReader) As IDictionary
    Dim dict As IDictionary = New Dictionary(Of String, String)()
    If Not IsNothing(reader) AndAlso Not reader.IsClosed Then
    Dim curstr As String = ""
    Dim TotalFields As Integer = reader.FieldCount - 1

    For i As Integer = 0 To TotalFields
    If Not (reader.IsDBNull(i)) Then
    curstr = reader.GetValue(i)
    Else
    curstr = ""
    End If
    dict.Add(reader.GetName(i), curstr)
    Next

    End If
    Return dict

    End Function

    Public Function SelectWithPaddingDictionary(ByVal StartRow As Integer, ByVal PageSize As Integer, _
    ByVal sSearch As String, ByVal sortedBy As String) As Generic.List(Of IDictionary)

    Dim myGenericList As New Generic.List(Of IDictionary)


    Using curConKlisi As New SqlConnection(connectionString)

    Using curComKlisi As New SqlCommand("[dbo].[usp_StroP]", curConKlisi)

    curComKlisi.CommandType = CommandType.StoredProcedure
    curComKlisi.Parameters.Add("@PageSize", Data.SqlDbType.Int).Value = PageSize
    curComKlisi.Parameters.Add("@StartRow", Data.SqlDbType.Int).Value = StartRow
    curComKlisi.Parameters.Add("@sSearch", Data.SqlDbType.NVarChar).Value = sSearch
    curComKlisi.Parameters.Add("@sortedBy", Data.SqlDbType.NVarChar).Value = sortedBy

    Try
    curConKlisi.Open()

    Dim reader As SqlDataReader = curComKlisi.ExecuteReader()

    If reader.HasRows Then

    Do While (reader.Read())

    myGenericList.Add(Me.LoadFromReaderDictionary(reader))

    Loop

    Else

    reader.Close()

    If Not reader.IsClosed Then
    reader.Close()
    End If

    'Throw New ApplicationException("News does not exist.")
    Return Nothing

    End If

    Catch ex As Exception

    Throw New ProviderException(ex.Message)

    Finally

    curConKlisi.Close()

    End Try


    End Using

    End Using

    Return myGenericList

    End Function

    Public Function SelectWithPaddingCounter(ByVal sSearch As String) As Integer

    Dim myCounter As Integer

    Using curConKlisi As New SqlConnection(connectionString)

    Using curComKlisi As New SqlCommand("[dbo].[usp_StroPCounter]", curConKlisi)

    curComKlisi.CommandType = CommandType.StoredProcedure
    curComKlisi.Parameters.Add("@sSearch", Data.SqlDbType.NVarChar).Value = sSearch

    Try
    curConKlisi.Open()

    myCounter = CInt(curComKlisi.ExecuteScalar())

    Catch ex As Exception

    Throw New ProviderException(ex.Message)

    Finally

    curConKlisi.Close()

    End Try


    End Using

    End Using

    Return myCounter

    End Function
    Αυτές είναι οι συναρτίσεις για να πέρνω τα δεδομένα. Που χρειάζονται και στον ObjectDataSource.


    Τώρα το bind γίνετε έτσι. (Πολύ χρήσιμο άρθρο αυτό που έχω και στην αρχή  http://www.haiders.net/post/How-to-Avoid-the-Eval-Method-for-DataBinding.aspx )
    <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="" AllowPaging="True" AllowSorting="True" DataSourceID="ObjectDataSource1">
    <Columns>
    <asp:TemplateField HeaderText="Α/Α" SortExpression="Id" >
    <ItemTemplate>
    <%#CType(Container.DataItem, IDictionary).Item("Id").ToString()%>
    </ItemTemplate>
    </asp:TemplateField>
    </Columns>
    </asp:GridView>

    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="SelectWithPaddingDictionary" TypeName="myClass" EnablePaging="True"
    MaximumRowsParameterName="PageSize" SelectCountMethod="SelectWithPaddingCounter"
    StartRowIndexParameterName="StartRow" SortParameterName="sortedBy">
    <SelectParameters>
    <asp:Parameter Name="sSearch" Type="String" DefaultValue=" "/>
    </SelectParameters>
    </asp:ObjectDataSource>


    Θα ήθελα ένα σχολιασμό/προτάσεις. Πάντως την δουλειά μου προς το παρόν την κάνει.




  •  10-03-2010, 18:39 57609 σε απάντηση της 57599

    Απ: Ερώτηση για Retrieving Data με χρήση Object μοντέλου.

    Α!!! ωραία, βλέπω VB!!. Με τόση C# άρχισα να αναρωτιέμαι τι στο καλό, τόσο πίσω έμεινα...

    Δεν γνωρίζω, asp και τα καλούδια ή κακούδια της, όμως σε μεγάλο ποσοστό σε παρακολούθησα στον κώδικά σου.

    Λύσε μου όμως μία απορία, αυτό που έχεις κάνει πως φαίνεται στην φόρμα; Έχεις κάποιο screenshot να το δω; Με προβληματίζει λίγο το Dictionary και το τι περιορισμούς θα έχει στην εμφάνιση των δεδομένων αν θέλω π.χ να το βάλω σε ένα grid ή να το περάσω σαν παράμετρο σε ένα report εργαλείο.

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems