SpartanDark
SpartanDark

Reputation: 23

Conversion failed when converting date and/or time from character string in C#

This is the connection class:

public string InsertarTecnico(int IdNumTecnico, string NombresTecnico, string ApellidosTecnico, string DireccionTecnico, string TelefonoTecnico, string ProvinciaTecnico, string CiudadTecnico, string TipoTecnico, string FechaTecnico)
    {
        string salida = "Datos guardados";

        try
        {
            cmd = new SqlCommand("Insert into TECNICO(NUMIDTECNICO, NOMBRETECNICO, APELLIDOTECNICO, DIRECCIONTECNICO, TELEFONOTECNICO, PROVINCIATECNICO, CIUDADTECNICO, FECHAYHORATECNICO, TIPO) values(" + IdNumTecnico + ", '" + NombresTecnico + "', '" + ApellidosTecnico + "', '" + DireccionTecnico + "', '"+TelefonoTecnico+"', '" + ProvinciaTecnico + "', '"+CiudadTecnico+"', '" + TipoTecnico + "', '" + FechaTecnico + "')", cn);
            cmd.Parameters.AddWithValue("@FechaTecnico", DateTime.Now);
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            salida = "No se puedo duardar los datos... " + ex.ToString();
        }
        return salida;
    }

This is the control code:

private void SaveTechnicalButton_Click(object sender, EventArgs e)
    {
        if (Conex.TecnicoRegistrado(Convert.ToInt32(IdTechnical.Text))==0)
        {
            MessageBox.Show(Conex.InsertarTecnico(Convert.ToInt32(IdTechnical.Text), NameTechnical.Text, LastNameTechnical.Text, AdressTechnical.Text, PhoneTechnical.Text, ProvinceTechnical.Text, CityTechnical.Text, SelectChiefTechnical.Text, DateTime.Parse(DateEnterTechnical.Text)));
        }
        else
        {
            MessageBox.Show("La persona que intenta ingresar ya se encuentra registrada");
        }
    }

enter image description here

The problem is conversion failed when converting date and/or time from character string

Upvotes: 0

Views: 494

Answers (2)

ironstone13
ironstone13

Reputation: 3443

You have to properly reformat text that is taken from DateEnterTechnical.Text control and passed to InsertarTecnico function as the last argument string TipoTecnico - as your date cannot be recognized by the database.

Ideally, you should

  • use some kind of calendar control on your form, to get a date from control, not a string
  • if you are getting a string, then parse it as date using, for example DateTime.ParseExact with a specific format string
  • format your date into ODBC canonical form when creating insert statement
  • remove direct usage of SQL queries from code, and replace it with a stored procedure, and pass parameters to your command

Upvotes: 0

Bruno Garcia
Bruno Garcia

Reputation: 6398

The order of the arguments are incorrect:

MessageBox.Show(Conex.InsertarTecnico(Convert.ToInt32(IdTechnical.Text), NameTechnical.Text, LastNameTechnical.Text, AdressTechnical.Text, PhoneTechnical.Text, CityTechnical.Text, ProvinceTechnical.Text, PhoneTechnical.Text, DateEnterTechnical.Text));

InsertarTecnico(int IdNumTecnico, string NombresTecnico, string ApellidosTecnico, string DireccionTecnico, string TelefonoTecnico, string ProvinciaTecnico, string CiudadTecnico, string FechaTecnico, string TipoTecnico)

You are passing DateEnterTechnical to TipoTecnico and twice TelefonoTechnico

The order seem to be:

MessageBox.Show(Conex.InsertarTecnico(Convert.ToInt32(IdTechnical.Text), NameTechnical.Text, LastNameTechnical.Text, AdressTechnical.Text, PhoneTechnical.Text, ProvinceTechnical.Text, CityTechnical.Text, DateTime.Parse(DateEnterTechnical.Text), tipoTecnico));

Make sure to parse the DateEnterTechnical to DateTime:

DateTime.Parse(DateEnterTechnical.Text)

Also, your code is subject to SQL injection. Considering using SqlParameters.

Upvotes: 1

Related Questions