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

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 ProcedureCREATE 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)
RETURNA 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 DataGridViewDim 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!
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
-
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.
-
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
-
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!