C# problema com função

4 respostas
T

Olá, pessoas!

Seguinte, tenho uma função aki em C# que conecta com SQL e cria uma DataSet. Acho que o código é auto explicativo, mas…ele tem que fazer uma consulta em uma tabela e jogar isso na DataSet. Ou seja, ele consulta se o médico possui algum agendamento dentro do período dado pelo usuário. Acontece que, mesmo que não haja agendamento algum, ele retorna sempre como se houvesse. A select está correta, pois testei no MS SQL. Mas não consigo perceber o q há d errado com a função em si.
Segue a função.

private bool MedicoPossuiAgendamentoIndisp(DateTime dataInicial, DateTime dataFinal, string id_medico)
    {
        if (conn.State == ConnectionState.Closed) { conn.Open(); }
        SqlDataAdapter getAgendaMedico = new SqlDataAdapter(" Select id_agendamento From AGENDAMENTOS_NETPORTO WHERE id_medico= " + id_medico.ToString() +
                                                            " AND ( datahora_agenda > '" + dataInicial.ToString("yyyy-MM-dd HH:mm") + "'" +
                                                            " AND datahora_agenda < '" + dataFinal.ToString("yyyy-MM-dd HH:mm") + "')" , conn);
                                                            
        DataSet dsAgendaMedico = new DataSet();
        getAgendaMedico.Fill(dsAgendaMedico);
        conn.Close();
        if (dsAgendaMedico.Tables[0].Rows.Count > 0)
        {
            return true;
        }
        else
        {
            return false;
        }

    }

Qualquer dúvida ou correção digam!
Obdrigada!

4 Respostas

juliofsn
Nesse caso não era melhor usar o COUNT do próprio SQL? Além disso, se você não vai usar os dados pra nada, não é necessário preencher o DataSet, eu faria assim:
private bool MedicoPossuiAgendamentoIndisp(DateTime dataInicial, DateTime dataFinal, string id_medico)  
        {  
            if (conn.State == ConnectionState.Closed) { conn.Open(); }  
            SqlCommand getAgendaMedico = new SqlCommand(" Select count(*) From AGENDAMENTOS_NETPORTO WHERE id_medico= " + id_medico.ToString() +  
                                                                " AND ( datahora_agenda > '" + dataInicial.ToString("yyyy-MM-dd HH:mm") + "'" +  
                                                                " AND datahora_agenda < '" + dataFinal.ToString("yyyy-MM-dd HH:mm") + "')" , conn);  
                                                                  
            int count = (int) getAgendaMedico.ExecuteScalar();
            conn.Close();  
            return count > 0;
      
        }
T

Olá!

Segui sua dica, mas o código não retorna nenhum agendamento, embora exista. Relembro q a consulta funciona perfeitamente no MSSQL.

De qualquer forma, agradeço a ajuda, pois esse método é mto mais simples q fazer DataSet.

Obrigada!

juliofsn

Bom que meu código já ajudou alguma coisa.

Bom, se a consulta funciona direto no banco, então pode ser a questão da data que pode estar sendo formatada de forma errada.

Uma outra dica que eu posso dar é: de preferência não use concatenação de strings para montar suas consultas, ao invés disso, use parâmetros e deixe o .NET fazer essas conversões internamente, além disso o operador "BETWEEN" eu acho mais adequado para essa comparação de datas, segue mais um exemplo:

private bool MedicoPossuiAgendamentoIndisp(DateTime dataInicial, DateTime dataFinal, string id_medico)    
{    
	if (conn.State == ConnectionState.Closed) { conn.Open(); }    
	SqlCommand getAgendaMedico = new SqlCommand(" Select count(*) From AGENDAMENTOS_NETPORTO WHERE id_medico= @id_medico" +    
														" AND datahora_agenda BETWEEN @data_inicial AND @data_final" , conn);    
	
	getAgendaMedico.Parameters.Add(new SqlParameter("@id_medico", id_medico));
	getAgendaMedico.Parameters.Add(new SqlParameter("@data_inicial", dataInicial));
	getAgendaMedico.Parameters.Add(new SqlParameter("@data_final", dataFinal));
	
	int count = (int) getAgendaMedico.ExecuteScalar();  
	conn.Close();    
	return count > 0;
}

Assim, você não precisa se preocupar com a formatação de data ou de números que o .NET vai ajustar para o formato correto, independente do idioma do banco.

T

Olá!
Realmente era um problema de conversão. Dessa forma q vc me sugeriu tbm não deu certo, aí entao foi corrigido assim:

if (conn.State == ConnectionState.Closed) { conn.Open(); }
        SqlCommand getAgendaMedico = new SqlCommand(" Select count(*) From AGENDAMENTOS_NETPORTO WHERE id_medico= " + id_medico.ToString() +
                                                                                " AND (datahora_agenda between '" + dataInicial.ToString("yyyy-MM-dd") + "' AND '" + dataFinal.ToString("yyyy-MM-dd") + "') " +
                                                                                " AND (CONVERT(VARCHAR(5),hora_ini,108) &gt;= '" + dataInicial.ToString("HH:mm") + "'" +
                                                                                " AND CONVERT(VARCHAR(5),hora_fim,108) &lt;= '" + dataFinal.ToString("HH:mm") + "')", conn);

        int count = (int)getAgendaMedico.ExecuteScalar();
        conn.Close();

        if (count &gt; 0)
        {
            return true;
        }
        else
        {
            return false;
        }

Mto obrigada pela ajuda!

Criado 14 de outubro de 2011
Ultima resposta 19 de out. de 2011
Respostas 4
Participantes 2