none
¿Como pasar la variable Fecha (tipo DateTime) a la consulta como @FECHA para que busque la Fecha siguiente ? RRS feed

  • Pregunta

  • No sé como pasar la variable Fecha (tipo DateTime) a la consulta como @FECHA para que me busque la siguiente fecha de FechaActual del lector a la que hay en la variable @FECHA lo he intentado con “DECLARE @FECHA DATETIME SET @FECHA="+Fecha, pero me da error

     

    public CPersona LeerBaseDeDatosNext(string NombreFichero,string fecha_origen)

            {

     

     

                DateTime Fecha;

                Fecha = new DateTime();

                Fecha = DateTime.ParseExact(fecha_origen, "dd/MM/yyyy",

                                                 null);

     

     

     

     

                string strConexion = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + pathName + NombreFichero;

     

                if (NombreFichero.IndexOf(".mdb") == -1)// Si no encuentra la extension .mdb la añade

                {

                    strConexion = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + pathName + NombreFichero + ".mdb;";

                }

     

                string nombre = "", apellidos = "";

                string observaciones = "";

                DateTime FechaActual = new DateTime(01 / 01 / 1582);

                DateTime FechaNacimiento = new DateTime(01 / 07 / 1992);

     

                decimal peso = 0, altura = 0, masacorporal = 0, grasacorporal = 0, masamuscular = 0, masaosea = 0, aguacorporal = 0, muñeca = 0;

                int cadera = 0, cuello = 0, cintura = 0, azucar = 0;

                string medicacion = "";

                bool hombre = false, analizador = false, check_medicacion = false, diabetico = false;

     

                ConexionConBD = new OleDbConnection(strConexion);

                string Consulta = "DECLARE @FECHA DATETIME SET @FECHA="+Fecha+" SELECT Nombre, Apellidos, FechaNacimiento, FechaActual, Peso, Altura, Cintura, Cadera, Cuello, Muñeca, Masacorporal, Grasacorporal, Masamuscular, Masaosea, Aguacorporal, Hombre, Analizador, CheckMedica, Medicacion, Diabetico, Azucar, Observaciones FROM BD WHERE FechaActual = (SELECT MIN(FechaActual) FROM BD WHERE FechaActual > @FECHA)";

     

     

                Orden = new OleDbCommand(Consulta, ConexionConBD);

                ConexionConBD.Open();

                Lector = Orden.ExecuteReader();

                while (Lector.Read())

                {

                    nombre = Lector["Nombre"].ToString();

                    apellidos = Lector["Apellidos"].ToString();

                    FechaNacimiento = Convert.ToDateTime(Lector["FechaNacimiento"]);

                    FechaActual = Convert.ToDateTime(Lector["FechaActual"]);

                    peso = Convert.ToDecimal(Lector["Peso"]);

                    altura = Convert.ToDecimal(Lector["Altura"]);

                    cintura = Convert.ToInt32(Lector["Cintura"]);

                    cadera = Convert.ToInt32(Lector["Cadera"]);

                    cuello = Convert.ToInt32(Lector["Cuello"]);

                    muñeca = Convert.ToDecimal(Lector["Muñeca"]);

                    masacorporal = Convert.ToDecimal(Lector["Masacorporal"]);

                    grasacorporal = Convert.ToDecimal(Lector["Grasacorporal"]);

                    masamuscular = Convert.ToDecimal(Lector["Masamuscular"]);

                    masaosea = Convert.ToDecimal(Lector["Masaosea"]);

                    aguacorporal = Convert.ToDecimal(Lector["Aguacorporal"]);

                    hombre = Convert.ToBoolean(Lector["Hombre"]);

                    analizador = Convert.ToBoolean(Lector["Analizador"]);

                    check_medicacion = Convert.ToBoolean(Lector["CheckMedica"]);

                    medicacion = Lector["Medicacion"].ToString();

                    diabetico = Convert.ToBoolean(Lector["Diabetico"]);

                    azucar = Convert.ToInt32(Lector["Azucar"]);

                    observaciones = Lector["Observaciones"].ToString();

                }

                CerrarConexion();

                return new CPersona(nombre, apellidos, FechaNacimiento.ToString("dd/MM/yyyy"), FechaActual.ToString("dd/MM/yyyy"), peso, altura, cintura, cadera, cuello, muñeca, masacorporal, grasacorporal, masamuscular, masaosea, aguacorporal, hombre, analizador, check_medicacion, medicacion, diabetico, azucar, observaciones);

     

            }

    sábado, 9 de septiembre de 2017 22:03

Respuestas

  • '@Fecha' refiere a un parámetro (recuerda que en OleDb los parámetros se establecen mediante marcadores de posición (?) y no por nombre) por tanto debes de especificar un valor de la forma que ya conoces:

    String Consulta = "SELECT Nombre, ... WHERE FechaActual > ?)";
    
    Orden = new OleDbCommand(Consulta, ConexionConBD);
    
    Orden.Parameters.Add("@Fecha", OleDbType.Date).Value = Fecha.Date;


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Javier B.A jueves, 14 de septiembre de 2017 17:10
    sábado, 9 de septiembre de 2017 22:20
  • Con independencia de que se trate de una consulta de inserción, actualización, eliminación o de selección -como es el presente caso- si requieres asignar o comparar un valor de columna con una variable lo debes de hacer mediante un parámetro tal y como te he indicado en el ejemplo anterior, ¿hiciste alguna prueba con el código proporcionado? ¿obtienes alguna excepción? ¿cuál?.

    Punto adicional, si tienes más de una fila con la misma fecha no deberías esperar recuperar una sola fila, de ser el caso el método debería retornar una colección de tipo 'CPersona'.


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Javier B.A jueves, 14 de septiembre de 2017 17:11
    domingo, 10 de septiembre de 2017 17:52

Todas las respuestas

  • '@Fecha' refiere a un parámetro (recuerda que en OleDb los parámetros se establecen mediante marcadores de posición (?) y no por nombre) por tanto debes de especificar un valor de la forma que ya conoces:

    String Consulta = "SELECT Nombre, ... WHERE FechaActual > ?)";
    
    Orden = new OleDbCommand(Consulta, ConexionConBD);
    
    Orden.Parameters.Add("@Fecha", OleDbType.Date).Value = Fecha.Date;


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Javier B.A jueves, 14 de septiembre de 2017 17:10
    sábado, 9 de septiembre de 2017 22:20
  • Pero esta vez es una lectura de base de datos no una grabación, se entiende que lee el valor FechaActual mediante FechaActual = Convert.ToDateTime(Lector["FechaActual"]) (que el nombre FechaActual no es el mejor, en realidad contiene la fecha del momento de creación de ese registro en la base de datos) y que tengo que pasarle el valor de la fecha guardada en memoria  de Fecha a @Fecha. ¿Como hacerlo?

    domingo, 10 de septiembre de 2017 9:45
  • Con independencia de que se trate de una consulta de inserción, actualización, eliminación o de selección -como es el presente caso- si requieres asignar o comparar un valor de columna con una variable lo debes de hacer mediante un parámetro tal y como te he indicado en el ejemplo anterior, ¿hiciste alguna prueba con el código proporcionado? ¿obtienes alguna excepción? ¿cuál?.

    Punto adicional, si tienes más de una fila con la misma fecha no deberías esperar recuperar una sola fila, de ser el caso el método debería retornar una colección de tipo 'CPersona'.


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Javier B.A jueves, 14 de septiembre de 2017 17:11
    domingo, 10 de septiembre de 2017 17:52