none
Error al convertir una cadena de caracteres en fecha y/u hora. RRS feed

  • Pregunta

  • Hola gente estoy intentando hacer la consulta en la base de datos usando un datepicker de jquerry y cuando traigo ocurre el error antes mensionado les encargo cualquier ayuda la verdad soy un programador novato y no se mucho del tema 

    feshas equivale al texbox que estoy usando 

     protected void search_Click(object sender, EventArgs e)
            {
                string usu = (string)(Session["usu"]);
                string feshas = fesha.Text;
                DateTime date = DateTime.ParseExact(feshas,"MM/dd/yyyy", new CultureInfo("en-Us"), DateTimeStyles.None);
                SqlConnection cnn = new SqlConnection("Data Source=SERPS1ESA;Initial Catalog=contingencia;Persist Security Info=True;User ID=soporteprim;Password=Sprima2017");
                DataTable dt = new DataTable();
                string query = "select cod_uni , ref_item , desc_item, can_item, suc_cliente, fecha,hora_pedido from pedido_lite where cod_uni is not null and usu_ingreso='" + usu + "' and fecha='"+ date + "' order by cod_uni,fecha DESC ";
                SqlDataAdapter da = new SqlDataAdapter(query, cnn);
                da.Fill(dt);
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }

    viernes, 21 de octubre de 2016 12:57

Respuestas

  • Con ese código hay un problema en el sitio donde concatenas la fecha dentro de la query:

    string query = "...fecha='"+ date + "'...";

    Cuando el compilador se encuentra ese símbolo "+" entre medias de un string y un DateTime, lo que hace internamente es llamar al método .ToString() del datetime par convertirlo en string y concatenarlo al otro string.

    Pero el .ToString() del datetime realiza la conversión en el formato que esté configurado en el Panel de Control, por lo que puede conincidir o no con el formato que espera la base de datos, así que tu programa puede funcionar o no funcionar dependiendo de cómo esté configurado el ordenador en el que lo ejecutas. En tu caso, debe estar configurado en dia/mes/año, y por eso no funciona, ya que la base de datos requiere mes/dia/año.

    La solución "chapucera" consiste en forzar el formato de conversión escribiendo explícitamente el ToString:

    string query = "...fecha='"+ date.ToString("MM/dd/yyyy") + "'...";

    La solución "elegante" consiste en parametrizar la sentencia y meter el datetime en el parámetro sin convertirlo a string en ningún momento:

    string query = "select ... and fecha=@f order by ...";
    SqlDataAdapter da = new SqlDataAdapter(query, cnn);
    da.SelectCommand.Parameters.AddWithValue("@f", date);
    da.Fill(dt);
    



               

    viernes, 21 de octubre de 2016 19:02
  • Hola Juan Camilo Narvaez,

    Tu campo en BD de que tipo es ? DateTime, Date ?

    [-].... Error al convertir una cadena de caracteres en fecha y/u hora.

    Puedes usar el DateTime.TryParseExact para validar si el valor del control fesha se puede convertir a a una fecha válida o no. Además procura agregarle un Try-Catch por si se produce algún error.

    protected void search_Click(object sender, EventArgs e)
    {
        string usu = (string)Session["usu"];
    
        DateTime date;
        if (!DateTime.TryParseExact(fesha.Text, "MM/dd/yyyy",
                    CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
        {
            //Fecha no válida...
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "alert",
                string.Format("alert('No se pudo convertir {0} a fecha')", fesha.Text), true);
            return; //Sale del evento...
        }
    
        string query = string.Empty;
        try
        {
            using (SqlConnection con = new SqlConnection("MiCadenaConexion"))
            {
                con.Open();
                query = "select cod_uni, ref_item, desc_item, can_item, " +
                        "suc_cliente, fecha, hora_pedido from pedido_lite " +
                        "where cod_uni is not null and usu_ingreso = @user and fecha = @fecha " +
                        "order by cod_uni, fecha DESC";
    
                SqlDataAdapter da = new SqlDataAdapter(query, con);
                da.SelectCommand.Parameters.AddWithValue("@user", usu);
                da.SelectCommand.Parameters.AddWithValue("@fecha", date.Date); //Si es Date
                //.........AddWithValue("@fecha", date); //Si el campo es DateTime
                //........AddWithValue("@fecha", date.ToString("MM/dd/yyyy")); //Si es cadena
    
                DataTable dt = new DataTable();
                da.Fill(dt);
    
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
        }
        catch (Exception ex)
        {
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "alert",
            string.Format("alert('Se produjo un error : {0}')", ex.Message), true);
        }
    }

    Por lo que tienes que enviar mediante el fesha.Text un valor válido como por ejemplo: 10/31/2016 (31 de Oct. 2016)

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 21 de octubre de 2016 19:44

Todas las respuestas

  • Con ese código hay un problema en el sitio donde concatenas la fecha dentro de la query:

    string query = "...fecha='"+ date + "'...";

    Cuando el compilador se encuentra ese símbolo "+" entre medias de un string y un DateTime, lo que hace internamente es llamar al método .ToString() del datetime par convertirlo en string y concatenarlo al otro string.

    Pero el .ToString() del datetime realiza la conversión en el formato que esté configurado en el Panel de Control, por lo que puede conincidir o no con el formato que espera la base de datos, así que tu programa puede funcionar o no funcionar dependiendo de cómo esté configurado el ordenador en el que lo ejecutas. En tu caso, debe estar configurado en dia/mes/año, y por eso no funciona, ya que la base de datos requiere mes/dia/año.

    La solución "chapucera" consiste en forzar el formato de conversión escribiendo explícitamente el ToString:

    string query = "...fecha='"+ date.ToString("MM/dd/yyyy") + "'...";

    La solución "elegante" consiste en parametrizar la sentencia y meter el datetime en el parámetro sin convertirlo a string en ningún momento:

    string query = "select ... and fecha=@f order by ...";
    SqlDataAdapter da = new SqlDataAdapter(query, cnn);
    da.SelectCommand.Parameters.AddWithValue("@f", date);
    da.Fill(dt);
    



               

    viernes, 21 de octubre de 2016 19:02
  • Hola Juan Camilo Narvaez,

    Tu campo en BD de que tipo es ? DateTime, Date ?

    [-].... Error al convertir una cadena de caracteres en fecha y/u hora.

    Puedes usar el DateTime.TryParseExact para validar si el valor del control fesha se puede convertir a a una fecha válida o no. Además procura agregarle un Try-Catch por si se produce algún error.

    protected void search_Click(object sender, EventArgs e)
    {
        string usu = (string)Session["usu"];
    
        DateTime date;
        if (!DateTime.TryParseExact(fesha.Text, "MM/dd/yyyy",
                    CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
        {
            //Fecha no válida...
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "alert",
                string.Format("alert('No se pudo convertir {0} a fecha')", fesha.Text), true);
            return; //Sale del evento...
        }
    
        string query = string.Empty;
        try
        {
            using (SqlConnection con = new SqlConnection("MiCadenaConexion"))
            {
                con.Open();
                query = "select cod_uni, ref_item, desc_item, can_item, " +
                        "suc_cliente, fecha, hora_pedido from pedido_lite " +
                        "where cod_uni is not null and usu_ingreso = @user and fecha = @fecha " +
                        "order by cod_uni, fecha DESC";
    
                SqlDataAdapter da = new SqlDataAdapter(query, con);
                da.SelectCommand.Parameters.AddWithValue("@user", usu);
                da.SelectCommand.Parameters.AddWithValue("@fecha", date.Date); //Si es Date
                //.........AddWithValue("@fecha", date); //Si el campo es DateTime
                //........AddWithValue("@fecha", date.ToString("MM/dd/yyyy")); //Si es cadena
    
                DataTable dt = new DataTable();
                da.Fill(dt);
    
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
        }
        catch (Exception ex)
        {
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "alert",
            string.Format("alert('Se produjo un error : {0}')", ex.Message), true);
        }
    }

    Por lo que tienes que enviar mediante el fesha.Text un valor válido como por ejemplo: 10/31/2016 (31 de Oct. 2016)

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 21 de octubre de 2016 19:44