Welcome to Sign in | Help
in Search

sql mobile records

Last post 12-20-2007, 11:44 AM by rsocol. 8 replies.
Sort Posts: Previous Next
  •  12-13-2007, 12:38 PM 3594

    sql mobile records

    folosesc sqlmobile cu C#

    si as vrea sa populez 1 grid cu primele 8 inreg,apoi sa apas pe un buton si sa-mi populeze gridul cu urmatoarele 8 si tot asa

    ceva sugestie ?

     

    asa imi arata popularea gridului:

     SqlCeCommand sel = Biblio.pCon.CreateCommand();
                sel.CommandText = "select a.id,a.cod_despuiere,a.diametru,a.categorie,b.nume_specie,a.cod_ua,a.nr_placuta from despuiere a left join specie b on a.cod_specie=b.id where id_partida=" + valoare + "";
                SqlCeDataAdapter dataAdapter = new SqlCeDataAdapter(sel);
                DataSet dset = new DataSet();
                dataAdapter.Fill(dset, "Taiere");
                //dataAdapter.Fill(dset, "Prod");
                dataGrid1.DataSource = dset.Tables[0];

  •  12-19-2007, 5:14 PM 3629 in reply to 3594

    Re: sql mobile records

    Ca idee ,daca ai sql 2005 ai putea folosi functiile de rank din sql 2005 ca sa poti selecta numai  randuri.

    in C# de ex initializezi o variabila care e limita superioara a intervalului cu 8

    de ex

    int limitasup=8;

    sqlconnection con =new sqlconnection(connectionstring);

    string select cmd="select ..using rank function"--uita-te la rank functions cu care poti selecta un anumit interval de randuri in functie de ordinea lor fizica in tabela

    sqlcommand cmd=new sqlcommand(con,selectcmd);

    SqlAdapter da=new SqlAdapter(cmd);

    da.fill(dataset,"tabela");

    dataGrid1.DataSource=da;

    Iar in onclick la buton nu faci decat sa cmd.SelectComand modifici comanda select cu functia rank actualizata mai aduagi 8 la limita superioara,faci refill la da si rebinduitadata source la datagrid

     


    Secolul XXI ori va fi religios ori nu va fi deloc
  •  12-19-2007, 8:32 PM 3636 in reply to 3629

    Re: sql mobile records

    Poti de asemenea sa folosesti o procedura SQL care sa realizeze "paginare" - sa "intoarca" un numar de inregistrari in functie de numarul si dimensiunea "paginii". In procedura poti folosi fie CTE fie de exemplu un tabel temporar / variabila tabel. Mai jos ai un exemplu cu CTE:

    DECLARE @PageNumber int, @PageSize int

    SET @pageNumber = 1

    SET @PageSize = 5;

    WITH c(ProductID, [Name], RowNum)

    AS( SELECT p.ProductID,

    p.[Name],

    Row_Number() OVER(ORDER BY p.[Name])

    FROM dbo.Product AS p WITH (NOLOCK)

    )

    SELECT c.ProductID, c.[Name], c.RowNum FROM c

    WHERE RowNum BETWEEN (@PageNumber - 1 )*@PageSize + 1

    AND @PageNumber*@PageSize

    Ramane sa "convingi" sursa gridului (SqlDataSource, ObjectDataSource...) sa foloseasca parametrii @PageNumber si @PageSize. Spre rusinea mea nu sunt foarte "dexter" in aceasta arie...

     

  •  12-20-2007, 9:27 AM 3640 in reply to 3594

    Re: sql mobile records

    În SQL Server CE 2005 nu există nici ranking functions (adică ROW_NUMBER), nici CTE-uri şi chiar nici TOP-ul. În SQL Server CE 3.5 (adică cel lansat împreună cu Visual Studio 2008), există clauza TOP, drept urmare cred că putem să facem ceva de genul următor (pentru a obţine a treia pagină de câte 8 înregistrări):

    SELECT * FROM (
      SELECT TOP 8 * FROM (
        SELECT TOP 24 coloanele_dorite FROM tabelele_tale WHERE condiţia_ta ORDER BY id
      ) x ORDER BY id DESC
    ) y ORDER BY id

    Totuşi, nu am încercat acest query, aşa că spune-ne dacă merge sau nu.

    Răzvan

  •  12-20-2007, 10:22 AM 3642 in reply to 3640

    Re: sql mobile records

    Nu am lucrat cu aşa ceva dar eu cred că ar trebui să foloseşti două proprietăţi ale gridului: AllowPaging=TRUE şi PageSize=8. Mai departe ar fi doar de configurat aspectul legăturilor de navigare (dacă pt. a derula următoarele înregistrări sunt afişate ">>" sau "urmatoarele" etc.). După părerea mea, paginarea trebuie efectuată de aplicaţia care afişează datele fiind vorba de afişare, nu cred că ar trebui implementată la nivel de SQL Server.

     


    Cătălin D.
  •  12-20-2007, 11:13 AM 3643 in reply to 3642

    Re: sql mobile records

    Katalyn, este adevarat ca poti folosi "AllowPaging" si "PageSize" si sa lasi paginarea pe seama gridului. Dar daca query-ul / procedura SQL returneaza un numar (mai) mare de inregistrari (eventual "grasutze"), este mai bina sa le "aduci" din SQL  cate 8, de exemplu, iar nu pe toate odata.

    Razvan, multumesc ca ai atras atentia asupra limitarilor din SQL CE. Pacat ca BOL nu subliniaza suficient de clar aceste limitari - cred ca ar trebui sa fie enumerate pe "prima pagina"...

     

  •  12-20-2007, 11:17 AM 3645 in reply to 3640

    Re: sql mobile records

    rsocol:

    În SQL Server CE 2005 nu există nici ranking functions (adică ROW_NUMBER), nici CTE-uri şi chiar nici TOP-ul. În SQL Server CE 3.5 (adică cel lansat împreună cu Visual Studio 2008), există clauza TOP, drept urmare cred că putem să facem ceva de genul următor (pentru a obţine a treia pagină de câte 8 înregistrări):

    SELECT * FROM (
      SELECT TOP 8 * FROM (
        SELECT TOP 24 coloanele_dorite FROM tabelele_tale WHERE condiţia_ta ORDER BY id
      ) x ORDER BY id DESC
    ) y ORDER BY id

    Totuşi, nu am încercat acest query, aşa că spune-ne dacă merge sau nu.

    Răzvan

    Daca ai in tabela 25 de inregistrari interogarea SQL ar trebui sa returneze 25-24(cel mai mare multiplu de 8 mai mic decat 25) = 1 (o) inregistrare.

    In cazul acest va returna "ultimele" 8 inregistrari.

  •  12-20-2007, 11:43 AM 3646 in reply to 3645

    Re: sql mobile records

    O posibila solutie (daca se doreste filtrarea/paginarea inregistrarilor de catre SQL Server) presupune un "self-inner-join" (joncţiune reflexivă ?) daca setul de înregistrări are o cheie primară sau o cheie cu valori unice şi nenule (nonnule) ca în exemplul următor în care tabela Produs are cheia primară IDProdus:

     

    CREATE TABLE Produs

    (

    IDProdus UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY,

    Denumire VARCHAR(25) NOT NULL,

    StocMin  MONEY NULL

    )

    GO

     

    INSERT INTO Produs(Denumire,StocMin) VALUES ('A',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('B',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('C',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('D',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('E',10)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('F',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('G',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('H',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('AA',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('BB',5)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('CC',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('DD',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('EE',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('FF',3)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('GG',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('HH',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('AAA',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('BBB',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('CCC',11)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('DDD',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('EEE',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('FFF',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('GGG',100)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('HHH',NULL)

    INSERT INTO Produs(Denumire,StocMin) VALUES ('AAAA',NULL)

    GO

    --SELECT COUNT(*) FROM Produs

     

    --pagina 2: 17 -> 24

    SELECT Q3.NrCrt, Produs.*

    FROM

    (

    SELECT COUNT(*) AS NrCrt, Q1.IDProdus

    FROM

          (SELECT IDProdus FROM Produs) AS Q1

          INNER JOIN (SELECT IDProdus FROM Produs) AS Q2

          ON Q1.IDProdus >= Q2.IDProdus

    GROUP BY Q1.IDProdus

    HAVING COUNT(*) BETWEEN (16+1) AND 24

    ) AS Q3 INNER JOIN Produs ON Q3.IDProdus = Produs.IDProdus

    ORDER BY Q3.NrCrt

     

    --pagina 3: 25 -> 32

    SELECT Q3.NrCrt, Produs.*

    FROM

    (

    SELECT COUNT(*) AS NrCrt, Q1.IDProdus

    FROM

          (SELECT IDProdus FROM Produs) AS Q1

          INNER JOIN (SELECT IDProdus FROM Produs) AS Q2

          ON Q1.IDProdus >= Q2.IDProdus

    GROUP BY Q1.IDProdus

    HAVING COUNT(*) BETWEEN (24+1) AND 32

    ) AS Q3 INNER JOIN Produs ON Q3.IDProdus = Produs.IDProdus

    ORDER BY Q3.NrCrt

     

  •  12-20-2007, 11:44 AM 3647 in reply to 3645

    Re: sql mobile records

    Bogdan,

    Ai dreptate, query-ul meu era greşit.

    Nu am la îndemână o bază de date din Compact Edition acum, dar să luăm următorul exemplu în AdventureWorks:

    SELECT ContactID, FirstName, LastName
    FROM Person.Contact WHERE LastName='Weber' ORDER BY FirstName

    Query-ul de mai sus returnează 19 înregistrări. Query-ul meu:

    SELECT * FROM (
      SELECT TOP 8 * FROM (
        SELECT TOP 24 ContactID, FirstName, LastName
        FROM Person.Contact WHERE LastName='Weber' ORDER BY FirstName
      ) x ORDER BY FirstName DESC
    ) y ORDER BY FirstName

    ar fi returnat ultimele 8 înregistrări (de la 12 la 19), în loc să returneze cele 3 înregistrări (de la 17 la 19) care ar fi trebuit să fie pe ultima pagină.

    Un query corect ar putea fi:

    SELECT TOP 8 ContactID, FirstName, LastName
    FROM Person.Contact WHERE LastName='Weber'
    AND ContactID NOT IN (
      SELECT TOP 16 ContactID
      FROM Person.Contact WHERE LastName='Weber' ORDER BY FirstName
    ) ORDER BY FirstName

    Răzvan

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems