2010-04-14 3 views
0

Je souhaite utiliser un gridview avec tri et pagination pour afficher les données d'un serveur SQL, la requête utilise 3 jointures et la recherche de texte intégral containstable. La partie de la requête utilise les 3 tables de la jointure.Source de données SQL pour gridview

Quelle est la meilleure façon de faire cela? Je peux penser à une procédure stockée, SQL directement dans le SQLDataSource et créer une vue dans la base de données. Je veux de bonnes performances et je voudrais tirer le meilleur parti possible des fonctions de tri automatique et de pagination de la grille. A propos de la taille, je soupçonne très peu d'enregistrements, au total environ 1000 et une requête entraînerait généralement pas plus de 100 enregistrements et la plupart du temps beaucoup moins.

Répondre

1

Ma suggestion serait d'utiliser une procédure stockée. Vous pouvez configurer l'entrée de paramètre de procédure stockée à partir de la SQLDataSource attachée à Gridview. Je déconseillerais l'utilisation de l'instruction de sélection SQL directe dans votre source de données, car IMHO appelant une procédure stockée avec la spécification de paramètre est plus sécurisé.

Hope this helps, Sid

+0

Merci pour votre réponse. Je voudrais savoir un peu pourquoi une vue n'est pas une bonne option, si vous avez le temps :-) – Karsten

+0

Vous pouvez vérifier MSDN pour voir si SQLDataSource prend en charge l'utilisation d'une vue. Je semble me rappeler soit le code SQL direct ou la procédure stockée, mais ne me retenez pas à cela :) Sinon, c'est vraiment à vous de décider comment maintenir votre structure de base de données. Si vous pouviez utiliser une vue dans sqldatasource, cette vue devrait être rafraîchie côté serveur pour vous assurer que les données les plus récentes sont transmises à la grille de l'application Web. Lorsque vous appelez une procédure stockée à partir de l'application Web, vous obtenez l'ensemble de données le plus récent répondant à vos paramètres. – SidC

1

Tout dépend du volume de données dont vous parlez. S'il a des millions d'enregistrements, je ne suggérerais pas le tri automatique et la pagination. Il est préférable d'utiliser la procédure stockée et d'utiliser la fonction Row_Number() (si vous utilisez SQL 2005).

HTH

+0

Avez-vous eu l'occasion de connaître un bon exemple avec la procédure Gridview, Datasouce et Stored? Je sais que je peux le faire moi-même, mais les meilleurs résultats ne sont pas toujours faciles à trouver. – Karsten

+0

http://forums.asp.net/t/1539169.aspx Ceci est un lien vers un billet que j'ai fait sur un autre site qui montre cela dans le code. – SidC

0

Je voudrais créer une procédure de recherche avec des paramètres pour toutes vos entrées, et d'attacher ces champs d'entrée à votre source de données Sql. De cette façon, lorsque les utilisateurs entrent des critères de filtrage, tout ce que vous avez à faire est d'appeler grid.DataBind() pour appliquer le filtre.

1

Voici ce que je fini par faire

.aspx 
<asp:GridView ID="gridAnnoncer" runat="server" AutoGenerateColumns="false" DataSourceID="dsAnnonceSearch" DataKeyNames="Id" AllowPaging="true" AllowSorting="true" PageSize="1"> 
    <Columns> 
     .. 
    </Columns> 
</asp:GridView> 

<asp:LinqDataSource ID="dsAnnonceSearch" runat="server" AutoPage="false" OnSelecting="AnnonceSearchOnSelecting"> 
</asp:LinqDataSource> 


.aspx.cs 
protected void AnnonceSearchOnSelecting(object sender, LinqDataSourceSelectEventArgs e) 
{ 
    using (TheContext context = new TheContext()) 
    { 
     int? totalRows; 
     string orderby = e.Arguments.SortExpression.ToLower().Replace(" desc", "").Replace(" asc", "").Trim(); 
     string sortDirection = e.Arguments.SortExpression.ToLower().Contains("desc") ? "desc" : "asc"; 
     e.Result = context.AnnonceSearch("test", orderby, sortDirection, e.Arguments.StartRowIndex, e.Arguments.MaximumRows, out totalRows); 
     e.Arguments.TotalRowCount = (int) totalRows; 
    } 
} 


Stored procedure 
ALTER PROCEDURE [dbo].[AnnonceSearch] 
    @keywords nvarchar(4000), 
    @orderby varchar(100), 
    @orderDirection varchar(100), 
    @startRowIndex int, 
    @maximumRows int, 
    @totalRows int output 
AS 
BEGIN 
    SET NOCOUNT ON; 

    if @keywords is null or @keywords = '' set @keywords = '""' 
    if @startRowIndex < 0 RAISERROR('startRowIndex parameter is invalid', 0, 1) 
    if @maximumRows < 1 RAISERROR('getRows parameter is invalid', 0, 1) 

    select TOP (@maximumRows) Id, Productname, description, Zipcode from 
     (select row_number() over (order by 
      case when lower(@orderDirection) = 'desc' then 
        case lower(@orderby) 
         when 'description' then Annoncer.description 
         when 'Productname' then Annoncer.Productname 
        end 
      end desc, 
      case when lower(@orderDirection) = 'asc' then 
        case lower(@orderby) 
         when 'description' then Annoncer.description 
         when 'Productname' then Annoncer.Productname 
        end 
      end 
      ) as RowNumber, 
     Annoncer.Id, Annoncer.Productname, Annoncer.description from Annoncer 

     where @keywords = '""' or (contains(Annoncer.Productname, @keywords) or 
            contains(Annoncer.description, @keywords))) searchResult 
    where RowNumber > @startRowIndex 

    SELECT @totalRows = COUNT(*) FROM Annoncer 
END 
Questions connexes