none
Linq com stored procedure RRS feed

  • Pergunta

  • Eu criei no VS 2010 a stored procedure:

    CREATE PROCEDURE [dbo].[sp_RelatorioAluno]
    	@id_turma INT,
    	@dataa VARCHAR(30)
    AS
    BEGIN
    	SELECT 
    	Aggr.id_turma,
    	Aggr.id_usuario,
    	Aggr.dia_mes_ano,
    	CASE WHEN Aggr.total_de_segundos IS NOT NULL THEN
    		CONVERT(VARCHAR, ((Aggr.total_de_segundos)/3600)) +':' +
    		CONVERT(VARCHAR, (((Aggr.total_de_segundos)%3600)/60)) +':' +
    		CONVERT(VARCHAR, (((Aggr.total_de_segundos)%3600)%60)) 
    	ELSE
    		'0:0:0'
    	END total_de_horas 
    FROM 
    (
    SELECT DISTINCT
    	id_turma, 
    	id_usuario,
    	CONVERT(VARCHAR, R1.data_hora,103) dia_mes_ano,
    	DATEDIFF
    	(SECOND,
    		(SELECT TOP 1 data_hora FROM [dbo].[dbo].[RelatorioAluno] R2 WHERE R2.id_usuario = R1.id_usuario AND CONVERT(VARCHAR, R2.data_hora,103) =  CONVERT(VARCHAR, R1.data_hora,103) ORDER BY data_hora),
    		(SELECT TOP 1 data_hora FROM [dbo].[dbo].[RelatorioAluno] R2 WHERE R2.id_usuario = R1.id_usuario AND CONVERT(VARCHAR, R2.data_hora,103) =  CONVERT(VARCHAR, R1.data_hora,103) ORDER BY data_hora DESC)
    	) TOTAL_DE_SEGUNDOS
    FROM 
    	[dbo].[dbo].[RelatorioAluno] R1
    	WHERE R1.id_turma = @id_turma
    ) AS Aggr
    	WHERE Aggr.dia_mes_ano = @dataa
    END


    Fiz desta forma pq vou precisar da turma e a data dinamicamente, até ai tudo bem. O problema é chamar ela, o que eu tenho é o seguinte:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Configuration;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace Verification
    {
        public partial class RelatorioAluno : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                //quando carrega a página entra aqui
                if (!Page.IsPostBack)
                {
                    //pega a url
                    string url = Request.Url.AbsoluteUri;
                    //pega o id
                    string id_turma = Request.QueryString["id_turma"];
                    string dia_mes_ano = Request.QueryString["dia_mes_ano"];
    
                    this.SelecionaRel(id_turma, dia_mes_ano);
                }
            }
    
            void SelecionaRel(string id_turma, string dia_mes_ano)
            {
                using (DataClasses1DataContext context = new DataClasses1DataContext(ConfigurationManager.ConnectionStrings["dboConnectionString"].ConnectionString))
                {
                    var resultado = from re in sp_RelatorioAlunoResult
                                    select re.total_de_horas;
    
                    DataList1.DataSource = resultado.ToList();
                    DataList1.DataBind();
                }
                
            }
        }
    }


    Ali onde tento pegar o sp_RelatorioAluno se eu informa o que quero dentro deste método ex: sp_RelatorioAluno(4, '28/05/2012') ele n me deixa compilar da erro. Eu preciso que depois que ele faça esta procedure ele me jogue na view do aspx, jogar na view eu consigo com o dataList. Alguém sabe como me ajudar?

    O que ele me retorna se eu faço no sql server 2008 é:

    id_turma | id_usuario | dia_mes_ano | total_de_horas

    4 | 5 | 28/05/2012    |2:48:0
    4 | 11| 28/05/2012    |2:58:59
    4 | 15| 28/05/2012    |0:0:0
    4 | 16| 28/05/2012    |0:0:0
    4 | 17| 28/05/2012    |0:0:0

    O retorno mostra o total de horas de cada aluno, ele tem várias entradas no mesmo dia dai vai pegando e somando as horas em aula.



    • Editado guitutilo terça-feira, 29 de maio de 2012 23:24
    terça-feira, 29 de maio de 2012 23:22

Respostas

  • Olá Giututilo,

    A sintaxe correta é assim:

    var resultado = context.sp_RelatorioAlunoResult(Convert.ToInt32(id_turma), dia_mes_ano);

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta guitutilo sexta-feira, 1 de junho de 2012 02:28
    quarta-feira, 30 de maio de 2012 01:49
    Moderador
  • Olá Guitutilo,

    Abra os arquivos DataClasses1.dbmlt.layout e DataClasses1.designer.cs e veja se a procedure esta registrada em algum ponto.

    Se não estiver registrada, apague o mapeamento e faça-o novamente.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta guitutilo sexta-feira, 1 de junho de 2012 02:28
    quarta-feira, 30 de maio de 2012 11:49
    Moderador

Todas as Respostas