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

 

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

DataSet DataRelation και RowFilter

Îåêßíçóå áðü ôï ìÝëïò gspiros. Τελευταία δημοσίευση από το μέλος gspiros στις 30-04-2009, 11:31. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  29-04-2009, 15:10 50346

    DataSet DataRelation και RowFilter

    Έχω τον κώδικα:
            string query = "SELECT * FROM Suppliers";
            SqlConnection con = new SqlConnection(connectionString);
            SqlCommand com = new SqlCommand(query, con);

            SqlDataAdapter adapter = new SqlDataAdapter(com);
            DataSet ds = new DataSet("Northwind");
            try
            {
                con.Open();
                adapter.Fill(ds, "Suppliers");

                com.CommandText = "SELECT * FROM Products";
                adapter.Fill(ds, "Products");
            }
            catch (Exception err)
            {
                Console.WriteLine(err.ToString());
            }
            finally
            {
                con.Close();
            }
       
            DataColumn parentCol = ds.Tables["Suppliers"].Columns["SupplierID"];
            DataColumn childCol = ds.Tables["Products"].Columns["SupplierID"];
            DataRelation relation = new DataRelation("Suppliers_Products", parentCol, childCol);
            ds.Relations.Add(relation);
           
    o οποίος γεμίζει ένα DataSet με 2 πίνακες και ένα DataRelation!

    Θέλω τώρα να δημιουργήσω ένα άλλο DataSet, το οποίο θα προέρχεται από το αρχικό DataSet, αλλά θα έχει κάποιο Filter του τύπου "SupplierID=1".

    Προσπάθησα να κάνω το εξής:
            DataView view = new DataView(ds.Tables["Suppliers"]);

            DataSet ds2 = ds.Clone();
            DataTable table = new DataTable();
            ds2.Tables.Add(table);

            view.RowFilter = "supplierid=1";
            foreach (DataRowView row in view)
            {
                table.ImportRow(row.Row);
            }

    αλλά παρόλο που εισάγει μια γραμμή, δεν εισάγει τα data (κολώνες).
    Γιατί?

    Επίσης αν μέσα στο loop, γράψω table.Rows.Add(row.Row) αντί table.ImportRow(row.Row);
    παίρνω ArgumentException: This row already belongs to another table
    Γιατί αυτό?


    Η λογική που σκεφτόμουν να ακολουθήσω είναι η ίδια και για τον άλλο πίνακα ("Products"), να κάνω δηλαδή ένα loop με view.RowFilter = "supplierid=1"
    Υπάρχει καλύτερος τρόπος ή πιο γρήγορος?
  •  29-04-2009, 16:32 50353 σε απάντηση της 50346

    Απ: DataSet DataRelation και RowFilter

    Καλύτερος τρόπος ή γρηγορότερος να κάνεις τι ακριβώς; 'Η για να το πω αλλιώς, τι θα κάνεις αυτό το δεύτερο DataSet; Ο κώδικάς σου έχει διάφορα προβλήματα και υποπτεύομαι ότι είσαι σε λάθος δρόμο.


    Vir prudens non contra ventum mingit
  •  29-04-2009, 16:44 50356 σε απάντηση της 50346

    Απ: DataSet DataRelation και RowFilter

    Δοκίμασε αυτό:

    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DataSet ds2 = new DataSet();
    DataTable table = ds.Tables["Suppliers"].Clone();
    
    foreach (DataRowView row in ds.Tables["Suppliers"].Select("supplierid=1"))
    {
        table.ImportRow(row.Row);
    }
     
    ds2.Tables.Add(table);

    Γιατί όμως να φτιάξεις ένα καινούργιo Dataset? Δεν μπορείς να επιτύχεις το ίδιο (φιλτράρισμα) με ένα DataView;

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  29-04-2009, 22:51 50362 σε απάντηση της 50356

    Απ: DataSet DataRelation και RowFilter

    Τι προβήματα έχει ο κώδικας?

    Βασικά δεν μπορώ να το καταφέρω το φιλτράρισμα... Κάπου έχω μπερδευτεί...
    Εννοώ ότι όταν κάνω dataViewManager.DataSet, μου επιστρέφει το αρχικό DataSet, όπου dataViewManager είναι ένα DataViewManager του αρχικού DataSet, μετά από κάποιο φιλτράρισμα χρησιμοποιώντας το DataViewSettings["tablename"].RowFilter(......).

    Πως μπορώ να επιστρέψω ένα φιλτραρισμένο DataSet??????
  •  30-04-2009, 00:21 50368 σε απάντηση της 50362

    Απ: DataSet DataRelation και RowFilter

    Μάλλον δεν έχεις καταλάβει τη φιλοσοφία του DataSet και του DataViewManager. Γενικά, όταν θέλουμε να φιλτράρουμε τα data από τα DataTables δεν τα κάνουμε copy σε νέα DataSets γιατί τέτοιες διαδικασίες κοστίζουν. Φαντάσου να έχεις DataTables με πολλές εγγραφές. Δουλεύουμε με αυτό το DataSet που έχουμε, αλλάζοντας τα φίλτρα κατά το δοκούν. Αρχικά, μπορούμε να δουλέψουμε χωρίς καν το DataViewManager. Σε κάθε DataTable μπορείς να ορίσεις το Filter property και να κρύψεις τα DataRows που δεν σε ενδιαφέρουν. Το DataTable θα συνεχίσει να περιέχει όλα τα DataRows αλλά τα controls που θα είναι binded πάνω του, θα δείχνουν μόνο όσα τους επιτρέπει το φίλτρο. Από εκεί και πέρα, αν θες να μαζέψεις τα φίλτρα σε ομάδες και να τα διαχειριστεις καλύτερα, μπορείς να χρησιμοποιήσεις ένα ή παραπάνω DataViewManager. Και πάλι το DataSet δεν θα αλλάξει περιεχόμενα αλλά πλέον θα κάνεις bind όλα τα controls πάνω στο εκάστοτε DataViewManager και τότε θα βλέπεις φιλτραρισμένα τα data.

    Για παράδειγμα:

                DataViewManager nwindDVM = new DataViewManager(nwindDS);
                foreach (DataViewSetting myDVS in nwindDVM.DataViewSettings)
                {
                    myDVS.ApplyDefaultSort = true;
                }
    
                nwindDVM.DataViewSettings["Customers"].Sort = "CompanyName DESC";
                nwindDVM.DataViewSettings["Orders"].RowFilter = "OrderDate >= '01.03.1998' AND OrderDate <= '31.03.1998'";
                nwindDVM.DataViewSettings["OrderDetails"].RowFilter = "ProductID = 35";
    
                someDataGrid.SetDataBinding(nwindDVM, "Customers");

    Παρατήρησε ότι το someDataGrid κάνει bind στο DataTable Customers αλλά μέσα από το nwindDVM.

     


    Vir prudens non contra ventum mingit
  •  30-04-2009, 01:44 50372 σε απάντηση της 50368

    Απ: DataSet DataRelation και RowFilter

    Το πρόβλημά μου είναι ότι μέσα σε method θέλω να φιλτράρω ένα DataSet και να το περάσω σαν παράμετρο σε μια άλλη, αλλά έτσι δεν κρατά το φιλτράρισμα...
    Γιαυτό σκέφτηκα να φτιάξω ένα δεύτερο DataSet (φιλτραρισμένο) και να περάσω εκείνο.
    Πως θα μπορούσα να υλοποιήσω το παραπάνω?

    Το να περάσω το φιλτράρισμα σαν δεύτερη παράμετρο το έχω σκεφτεί, απλά θέλω να μάθω αν υπάρχει άλλος τρόπος.

    H method δεν θα κάνει bind το DataSet σε κάποιο control, αλλά διαβάζει κάποια αποτελέσματα από τους πίνακες και τα χειρίζεται αναλόγως.
  •  30-04-2009, 09:39 50375 σε απάντηση της 50372

    Απ: DataSet DataRelation και RowFilter

    Μπορείς να έχεις το method να γυρίζει ένα DataViewManager... Εξαρτάται τι προσπαθείς να κάνεις, τι είναι αυτό που εννοείς λέγοντας "χειρίζεται αναλόγως".


    Vir prudens non contra ventum mingit
  •  30-04-2009, 11:31 50380 σε απάντηση της 50375

    Απ: DataSet DataRelation και RowFilter

    Βασικά είναι constructor και του περνάω ένα DataSet, διαβάζει όλες τις γραμμές από τον πρώτο πίνακα και αρχικοποιεί τα properties.
    Ύστερα φιλτράρει το DataSet (δηλαδή κάποιον δεύτερο πίνακα) βάσει κάποιον κριτιρίων και τον περνά σε άλλον constructor.
    Γιαυτό θέλω να φιλτράρω το DataSet, ώστε να περνάω στον δεύτερο constructor έτοιμο το DataSet (να μην χρειάζεται να φιλτράρεται εκεί).
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems