none
Como vincular o resultado de uma procedure com Select Dinâmico à um DataGridView utilizando LINQ? RRS feed

  • Pergunta

  •  

    Pessoal,

     

    Bom Dia!

     

    Estou com uma dúvida/probleminha:

     

    Eu tenho uma procedure no SQL Server que executa um Select dinâmico, já que dependendo da coluna selecionada na interface, eu quero mostrar os resultados ordenados ou filtrados de acordo com a necessidade do usuário:

     

    Segue o código da procedure:

     

    Exemplo da Procedure

    CREATE PROCEDURE [dbo].[SP_S_SELECTGERAL]
    (
    @pTABELA VARCHAR(30) = '',
    @pCOLUNA VARCHAR(30) = 1,
    @pFILTRO VARCHAR(30) = ''
    )
    AS
    DECLARE @COMANDOSQL VARCHAR(2000), @FILTROSQL VARCHAR(100)

    IF LEN(RTRIM(LTRIM(@pTABELA))) = 0
    BEGIN
     RAISERROR('É obrigatório informar a tabela ou view para obter os dados',15,1)
    END
    IF LEN(RTRIM(LTRIM(@pCOLUNA))) = 0
    BEGIN
     SET @pCOLUNA = 1
    END
    IF LEN(RTRIM(LTRIM(@pFILTRO))) = 0
        BEGIN
           SET @FILTROSQL = ''
        END
    ELSE
        BEGIN
           SET @FILTROSQL = ' WHERE '+ @pCOLUNA + ' LIKE ' + CHAR(39) + '%' + @pFILTRO + '%' + CHAR(39)
        END
    SET @COMANDOSQL = ' SELECT *  FROM ' + @pTABELA + @FILTROSQL + ' ORDER BY ' + @pCOLUNA
    EXEC(@COMANDOSQL)
    RETURN

     

     

    A procedure está funcionando perfeitamente no SQL Server.

     

    Agora, na minha interface (eu estou usando o Visual Studio 2008), eu inseri uma série de objetos, sendo que um deles é um DataGridView.

     

    Vinculando a procedure ao DataGridView

    Dim bd As New LojaDataContext -- Estou utilizando o LINQ to Classes

    DataGridView.DataSource = bd.SP_S_SELECTGERAL("produtos","descricao","teste")

     

     

    Quando eu entro no programa a DataGridView vem vazia.

     

    Agora se eu criar uma procedure com SELECT não dinâmico, funciona direitinho.

     

    Alguém tem alguma idéia de como fazer isso?

    Ou mesmo uma solução utilizando o próprio LINQ? Eu também não consegui montar SELECT´s dinâmicos no LINQ.

     

    Valeu!

     

     

     

    sábado, 20 de setembro de 2008 13:58

Todas as Respostas

  • Ricardo,

     

    Não sei qual o problema, teria que investigar melhor.

     

    A minha dúvida é a seguinte: qual a vantagem de criar essa procedure com esse SELECT genérico? Não acredito que exista ganho de performance algum, além de deixar a base de dados menos segura. Você poderia colocar essa lógica na sua própria aplicação e enviar a query ad-hoc mesmo.

     

    Só uma sugestão.

     

    Att.

     

    Ari C. Raimundo

     

    sábado, 20 de setembro de 2008 19:16
  • Ari,

    Primeiramente grato pelo apoio!

    Rapaz, eu desenvolvi a Stored Procedure porque é um pré-requisito do meu cliente que todo o sistema seja duas camadas "two-tier" e por isso não posso ter a query ad-hoc.

    Se você conseguir ver algo a respeito do problema, dê um alô!

    Grato.


    segunda-feira, 22 de setembro de 2008 11:14
  • Oi Ricardo,

     

    A aplicação ser duas camadas não necessita necessariamente criar a stored procedure. Você pode usar a interface com o usuário (Windows Forms) como uma camada e criar uma outra camada de acesso a dados (DataAccessComponent). Nesta última você pode colocar a query ad-hoc genérica.

     

    Att.

     

    Ari C. Raimundo

    segunda-feira, 22 de setembro de 2008 14:18
  • Ari,

    Grato pela sugestão.

    Sim, até seria possível criar a camada de acesso a dados, até porque seria uma "boa prática" no desenvolvimento .Net.

    Ocorre que esse cliente tinha o aplicativo todo em Oracle Forms com o SGBD Oracle, aí por uma decisão da matriz Australiana resolveram migrar para o SQL Server, porém eles querem na camada Windows Forms apenas interface mesmo. (A filial brasileira ainda "não aceitou" muito bem a decisão e por isso qualquer coisa que eu diga que não dá para fazer via procedure vai ser motivo de comparação com a outra IDE.) 

    Eu estou desenvolvendo assim, tendo toda a regra de negócio no banco e estava indo numa boa. Apenas o que pegou até o momento foi esse lance do DataGridView com o LINQ. Se eu vincular a procedure a um DataSource ele atualiza legal o DataGridView, mas ai o pessoal da filial já comentou: 
    Tá vendo só? Você tem que desenvolver parte via LINQ e parte via DataSource? 

    Eu não queria dar esse gostinho para o pessoal, sabe?

    Por isso eu queria realmente saber se isso é um "bug" do LINQ ou se seria possível na pior das situações adicionar a query via LINQ mesmo...

    Eu tentei fazer algo do tipo, mas não funcionou:

    Tentativa de utilizar SQL dinâmico no LINQ

    Dim bd As New LojaDataContext bd.ExecuteQuery("Select * from" & ptabela & " where " & pcoluna &"=" & pvalor)


    Se tiver alguma dica, agradeço!
    segunda-feira, 22 de setembro de 2008 14:46