Inquiridor
Linq to Sql

Pergunta
-
Todas as Respostas
-
-
-
-
Manigoldo, não domino muito do assunto mais de uma procura por "optional parameters stored procedure linq to sql", você vai achar alguns links de como usar uma stored procedure onde algum parâmetros são opcionais, se encaixa no seu caso acima:
http://www.hookedonlinq.com/CallingStoredProcedureUsingOptionalParameter.ashx
Vitor Mendes | Seu feedback é muito importante para todos!
Visite o meu site: http://www.vitormendes.com.br/ -
Olá Manigoldo,
Tudo beleza?Para vc criar parâmetros opcionais vc precisa, na sua procedure, marcar os parâmetros com "= NULL", desta forma os parâmetros, quando não passados os valores, serão ignorados. Como no exemplo abaixo.
CREATE PROC spTeste @Name VARCHAR(100) = NULL AS BEGIN SELECT * FROM TabelaA WHERE aNome = ISNULL(@Name, aNome) END GO
Veja que o parâmetro @Name esta com "= NULL" indicando que ele é opcional.
Mas, mesmo quando vc mapear a procedure para o seu modelo não serão criadas diversas assinaturas para esta chamada a sua procedure. No caso, eu indicaria que vc modificasse o código de seu modelo de dados, adicionando um método que encapsule a chamada a sua procedure com os parâmetros opicionais.
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique- Sugerido como Resposta EduardoPiresMVP terça-feira, 19 de junho de 2012 12:29
-
-
Galera fiz dessa forma mas nao sei se é correto? tive que excluir os parametros nao nessarios da "DataClasses.Designer.cs" deixando os que realmente eram necessario.
Mas essa é a forma correta de se fazer ?
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.SP_CD_FUNCIONARIO")]
public ISingleResult<SP_CD_FUNCIONARIOResult> SP_CD_FUNCIONARIO(
[global::System.Data.Linq.Mapping.ParameterAttribute(Name="EXEC", DbType="VarChar(3)")] string eXEC,
[global::System.Data.Linq.Mapping.ParameterAttribute(Name="PROCEDIMENTO", DbType="Decimal(18,0)")] System.Nullable<decimal> pROCEDIMENTO,
[global::System.Data.Linq.Mapping.ParameterAttribute(Name = "CD_EMPRESA", DbType = "Decimal(18,0)")] System.Nullable<decimal> cD_EMPRESA,
[global::System.Data.Linq.Mapping.ParameterAttribute(Name="CD_FUNCIONAL", DbType="Decimal(10,0)")] System.Nullable<decimal> cD_FUNCIONAL)
{IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), eXEC, pROCEDIMENTO,cD_EMPRESA,cD_FUNCIONAL);return ((ISingleResult<SP_CD_FUNCIONARIOResult>)(result.ReturnValue));
}Obrigado.
- Editado _Manigold_ terça-feira, 19 de junho de 2012 17:33
-
Olá Manigoldo,
Esta forma é possível, mas não é a mais indicada.
O que eu havia lhe dito anteriormente era para criar outro método, apenas com os parâmetros que vc precisa, e dentro deste método chamar o método que foi mapeador pelo EF para a procedure.
Desta forma é o mais indicado.
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique
Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil -
ola amigo , infelizmente nao tem como pois a proc tem varios procedimento dentro de uma, vou colar uma aqui, quem sabe vc me ajuda rsrs.
ALTER PROCEDURE dbo.SP_CD_FUNCIONARIO
@EXEC VARCHAR(3),
@PROCEDIMENTO NUMERIC,
@CD_OPERADOR_LOGIN VARCHAR(10) =NULL,
@CD_EMPRESA NUMERIC(18) =NULL,
@CD_FILIAL NUMERIC(18) =NULL,
@CD_FUNCIONAL NUMERIC(10) =NULL,
@DS_NOME VARCHAR(60) =NULL,
@CD_CPF VARCHAR(20) =NULL,
@CD_RG VARCHAR(20) =NULL,
@DS_NACIONALIDADE VARCHAR(40) =NULL,
@DS_ENDERECO VARCHAR(60) =NULL,
@DS_BAIRRO VARCHAR(40) =NULL,
@DS_CIDADE VARCHAR(40) =NULL,
@CD_ESTADO VARCHAR(2) =NULL,
@CD_DDD VARCHAR(3) =NULL,
@DS_TELEFONE VARCHAR(20) =NULL,
@CD_TITULO_ELEITOR VARCHAR(20) =NULL,
@CD_CNH VARCHAR(20) =NULL,
@CD_STATUS CHAR(1) =NULL
AS
--DECLARA VARIÁVEL DE RETORNO DE ERRO
DECLARE @MSG VARCHAR(1000)
--DECLARA VARIÁVEL AUXILIAR
DECLARE @NR_REGISTROS AS NUMERIC(9)
--DECLARA VARIAVEIS PARA LOG DE USUÁRIO
DECLARE @MSG_LOG VARCHAR(500)
DECLARE @TABELA_LOG VARCHAR(500)
DECLARE @OPERACAO_LOG VARCHAR(500)
--PROCEDIMENTOS PARA CONSULTAS
IF @EXEC = 'SEL'
BEGIN
--CONSULTA TODOS OS FUNCIONÁRIOS CADASTRADOS E A QUANTIDADE TOTAL DE REGISTROS
IF @PROCEDIMENTO = 1
BEGIN
SET @NR_REGISTROS = (SELECT COUNT(CD_FUNCIONAL) FROM CD_FUNCIONARIO WHERE CD_EMPRESA = @CD_EMPRESA AND CD_STATUS = 'A')
SELECT @NR_REGISTROS AS TOTAL_REGISTROS, *, CASE CD_STATUS WHEN 'I' THEN 'Inativo' ELSE 'Ativo' END AS DS_STATUS
FROM CD_FUNCIONARIO
WHERE CD_EMPRESA = @CD_EMPRESA
--AND CD_STATUS = 'A'
ORDER BY CD_STATUS ASC ,DS_NOME ASC
END
--CONSULTA UM FUNCIONÁRIO ESPECÍFICO POR CÓDIGO FUNCIONAL
IF @PROCEDIMENTO = 2
BEGIN
SELECT *
FROM CD_FUNCIONARIO
WHERE CD_FUNCIONAL = @CD_FUNCIONAL
AND CD_EMPRESA = @CD_EMPRESA
--AND CD_STATUS = 'A'
END
--CONSULTA TODOS OS FUNCIONÁRIOS DE UMA DETERMINADA FILIAL
IF @PROCEDIMENTO = 3
BEGIN
SELECT *
FROM CD_FUNCIONARIO
WHERE CD_EMPRESA = @CD_EMPRESA
AND CD_FILIAL = @CD_FILIAL
AND CD_STATUS = 'A'
ORDER BY DS_NOME
END
--CONSULTA TODOS OS FUNCIONÁRIOS CADASTRADOS E A QUANTIDADE TOTAL DE REGISTROS LIKE PELO CAMPO DS_NOME
IF @PROCEDIMENTO = 4
BEGIN
SET @NR_REGISTROS = (SELECT COUNT(CD_FUNCIONAL) FROM CD_FUNCIONARIO WHERE CD_EMPRESA = @CD_EMPRESA AND CD_STATUS = 'A' AND DS_NOME LIKE @DS_NOME + '%')
SELECT @NR_REGISTROS AS TOTAL_REGISTROS, *, CASE CD_STATUS WHEN 'I' THEN 'Inativo' ELSE 'Ativo' END AS DS_STATUS
FROM CD_FUNCIONARIO
WHERE CD_EMPRESA = @CD_EMPRESA
--AND CD_STATUS = 'A'
AND DS_NOME LIKE @DS_NOME + '%'
ORDER BY CD_STATUS ASC ,DS_NOME ASC
END
END
--PROCEDIMENTOS PARA INCLUSÃO
IF @EXEC = 'INS'
BEGIN
IF @PROCEDIMENTO = 1
BEGIN
--VERIFICA SE EXISTE UM FUNCIONÁRIO COM O CPF INFORMADO
IF EXISTS (SELECT TOP 1 * FROM CD_FUNCIONARIO WHERE CD_EMPRESA = @CD_EMPRESA AND CD_CPF = @CD_CPF)
BEGIN
--VALORIZA MENSAGEM DE ERRO
SET @MSG = 'Já existe um funcionário cadastrado com este CPF !'
GOTO ERRO
END
--Pega o próximo código de categoria
SET @CD_FUNCIONAL = (SELECT ISNULL(MAX(CD_FUNCIONAL) + 1, 1) FROM CD_FUNCIONARIO WHERE CD_EMPRESA = @CD_EMPRESA)
--Inclui a categoria
INSERT INTO CD_FUNCIONARIO
(CD_EMPRESA, CD_FILIAL, CD_FUNCIONAL, DS_NOME, CD_CPF, CD_RG, DS_NACIONALIDADE, DS_ENDERECO, DS_BAIRRO,
DS_CIDADE, CD_ESTADO, CD_DDD, DS_TELEFONE, CD_TITULO_ELEITOR, CD_CNH, CD_STATUS)
VALUES
(@CD_EMPRESA, @CD_FILIAL, @CD_FUNCIONAL, @DS_NOME, @CD_CPF, @CD_RG, @DS_NACIONALIDADE, @DS_ENDERECO, @DS_BAIRRO,
@DS_CIDADE, @CD_ESTADO, @CD_DDD, @DS_TELEFONE, @CD_TITULO_ELEITOR, @CD_CNH, @CD_STATUS)
--VERIFICA A OCORRÊNCIA DE ERROS
IF @@ERROR > 0
BEGIN
--VALORIZA MENSAGEM DE ERRO
SET @MSG = 'Ocorreu um erro durante a inclusão do funcionário !'
GOTO ERRO
END
--Valoriza as variaveis do log
SET @MSG_LOG = 'INCLUSÃO de funcionário ' + CAST(@CD_FUNCIONAL AS VARCHAR(20))
SET @TABELA_LOG = 'CD_FUNCIONARIO'
SET @OPERACAO_LOG = 'I'
END
--LIMPA VARIÁVEL DE ERRO
SET @MSG = ''
SELECT @MSG AS DS_ERRO
END
--PROCEDIMENTOS PARA ALTERAÇÃO
IF @EXEC = 'UPD'
BEGIN
IF @PROCEDIMENTO = 1
BEGIN
--ALTERA FUNCIONÁRIO
UPDATE CD_FUNCIONARIO
SET CD_FILIAL = @CD_FILIAL,
DS_NOME = @DS_NOME,
CD_CPF = @CD_CPF,
CD_RG = @CD_RG,
DS_NACIONALIDADE = @DS_NACIONALIDADE,
DS_ENDERECO = @DS_ENDERECO,
DS_BAIRRO = @DS_BAIRRO,
DS_CIDADE = @DS_CIDADE,
CD_ESTADO = @CD_ESTADO,
CD_DDD = @CD_DDD,
DS_TELEFONE = @DS_TELEFONE,
CD_TITULO_ELEITOR = @CD_TITULO_ELEITOR,
CD_CNH = @CD_CNH,
CD_STATUS = @CD_STATUS
WHERE CD_FUNCIONAL = @CD_FUNCIONAL
AND CD_EMPRESA = @CD_EMPRESA
--VERIFICA A OCORRÊNCIA DE ERROS
IF @@ERROR > 0
BEGIN
--VALORIZA MENSAGEM DE ERRO
SET @MSG = 'Ocorreu um erro durante a alteração do funcionário de nome '+CONVERT(VARCHAR(100),@DS_NOME)+' !'
GOTO ERRO
END
--VALORIZA AS VARIAVEIS DO LOG
SET @MSG_LOG = 'ALTERAÇÃO de funcionário codigo ' + CAST(@CD_FUNCIONAL AS VARCHAR(20))+', nome '+CONVERT(VARCHAR(100),@DS_NOME)
SET @TABELA_LOG = 'CD_FUNCIONARIO'
SET @OPERACAO_LOG = 'A'
END
--LIMPA VARIÁVEL DE ERRO
SET @MSG = ''
SELECT @MSG AS DS_ERRO
END
--ATUALIZACAO DE LOG PARA USUARIO
IF LEN(@MSG_LOG) > 0
BEGIN
--INCLUI O LOG DE OPERAÇÕES
INSERT INTO OP_LOG
(DT_TRANSACOES, CD_EMPRESA, CD_LOGIN, DS_TABELAS, DS_OPERACOES, DS_DESCRICAO)
VALUES
(GETDATE(), @CD_EMPRESA, @CD_OPERADOR_LOGIN, @TABELA_LOG, @OPERACAO_LOG, @MSG_LOG)
--ZERA A VARIAVEL DE MENSAGEM DO LOG
SET @MSG_LOG = ''
END
GOTO FIM
ERRO:
SELECT @MSG AS DS_ERRO
RETURN
FIM:
OBRIGADO.
-
Olá,
Você pode criar um método que reflita sua PROC e depois ir criando outros métodos dependendo de sua necessidade
public void executeProcTeste(string param1,param2){ //CODIGO } public void executeProcTeste(string param1){ executeProcTeste(param1,null); }
Não esqueça de marcar o post como útil caso tenha te ajudado.
-
Olá Manigoldo,
O que o Marcos disse era o que eu estava comentando a vc. Criei um exemplo para ilustrar o que pode ser feito.
Criei uma procedure que recebe um parâmetro opcional:
CREATE PROCEDURE INSERTAVALIACAO @NOTA INT = NULL AS BEGIN IF (@NOTA IS NULL) INSERT INTO TBAVALIACAO VALUES (5) ELSE INSERT INTO TBAVALIACAO VALUES (@NOTA) END GO
Depois mapei-a com o Entity Framework... se vc olhar o arquivo Designer.Cs do seu arquivo EDMX verá que existe um método com o nome de sua procedure, como o código abaixo, que foi gerado com a procedure que mapeei:
public int INSERTAVALIACAO(Nullable<global::System.Int32> nOTA) { ObjectParameter nOTAParameter; if (nOTA.HasValue) { nOTAParameter = new ObjectParameter("NOTA", nOTA); } else { nOTAParameter = new ObjectParameter("NOTA", typeof(global::System.Int32)); } return base.ExecuteFunction("INSERTAVALIACAO", nOTAParameter); }
Agora, crie um método com o mesmo nome do método criado pelo Entity Framework, só que utilizando apenas os parâmetro que vc realmente quer utilizar.
No caso, para este exemplo, criei um método sem parâmetros. E, no corpo do método vc deve chamar o método criado pelo Entity Framework, passando NULL nos parâmetro que vc não deseja mais utilizar, desta forma:
public int INSERTAVALIACAO() { return INSERTAVALIACAO(null); }
Desta forma, vc acaba criando duas assinaturas diferentes para a mesma chamada de procedure, só que o seu código C# terá a possibilidade de chamar uma assinatura de método apenas com os parâmetros que vc realmente precisa.
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.com/
Twitter: @ferhenrique
Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil- Sugerido como Resposta Vitor Mendes quarta-feira, 20 de junho de 2012 12:35