none
'System.FormatException' en mscorlib.dll RRS feed

  • Pregunta

  • Muy buenas noches a todos.

    Llevo todo el dia queriendo solucionar este problema pero aun no le encuentro solución, todo paso cuando inserte mas datos string y 2 variables de tipo Datetime(String pFECHA, String pFECHAM), pero como ven ya cambien todo a string(en la BD tambien lo cambie a string ) excepto el pid_usuario y me sigue con el mismo error " El índice (basado en cero) debe ser mayor o igual a cero y menor que el tamaño de la lista de argumentos." .

    En la BD sql server tengo:

    • Id_RTrim como INT IDENTITY(1,1) PRIMARY KEY 
    • id_usuario como int 
    • Todos los demas son String 

    C#

    • id_usuario lo convierto en entero  para insertalo a la tabla de sql
    • y las fechas los deje ej:  string fecha = "fecha" para ver si se quitaba el error

    No sé si tenga que ver como inserto los datos con  string.format(). 

    Espero sus respuestas o alguna sugerencia para cambiar la forma de insertar los datos.

    ejemplo de como inserto los datos

    public static int CrearRTrim(Int32  pid_usuario, String pCUSTOMOR, String pPO, String pSTYLE, String pCOLOR_DESCRIPTION, String pITEM_NUMBER, String pITEM_DESCRIPTION, String pPRICE_TICKET, String pCPRICE_TICKET, String pHOUSE_LABEL, String pCHOUSE_LABEL, String pBULLET, String pCBULLET, String pECOM_STICKER, String pCECOM_STICKER, String pSIZE_STRIP, String pCSIZE_STRIP, String pPOLY_BAG, String pCPOLY_BAG, String pSIZE_CLUB, String pCSIZE_CLUB, String pDISCLAIMER, String pCDISCLAIMER, String pCARD_BOARD, String pCCARD_BOARD, String pGLOW_DARCK, String pCGLOW_DARCK, String pSIGNAGE_ENCLOSED, String pCSIGNAGE_ENCLOSED, String pRUBBER_BANDS, String pCRUBBER_BANDS, String pHANG_TAGS, String pCHANG_TAGS, String pCARTON_LABEL, String pCCARTON_LABEL, String pBOX_STICKER, String pCBOX_STICKER, String pPINK_LABEL, String pCPINK_LABEL, String pGREEN_LABEL, String pCGREEN_LABEL, String pLAUNCH_PAD, String pCLAUNCH_PAD, String pCARTON_MARKING, String pCCARTON_MARKING, String pCADS_OTRO, String pCCADS_OTRO, String pV_BOARDS, String pCV_BOARDS, String pHANGERS, String pCHANGERS, String pOTROS_TYPE, String pCOTROS_TYPE, String pWOVEN_LABEL, String pCWOVEN_LABEL, String pFECHA , String pFECHAM)
            {

                int resultado = 0;
                SqlConnection Conn = Conexion.ObtenerCOnexion();
                SqlCommand Comando = new SqlCommand(String.Format("Insert Into REGISTRO_TRIM(ID_USUARIO, CUSTOMOR, PO, STYLE, COLOR_DESCRIPTION, ITEM_NUMBER, ITEM_DESCRIPTION, PRICE_TICKET, CPRICE_TICKET, HOUSE_LABEL, CHOUSE_LABEL, BULLET, CBULLET, ECOM_STICKER, CECOM_STICKER, SIZE_STRIP, CSIZE_STRIP, POLY_BAG, CPOLY_BAG, SIZE_CLUB, CSIZE_CLUB, DISCLAIMER, CDISCLAIMER, CARD_BOARD, CCARD_BOARD, GLOW_DARCK, CGLOW_DARCK, SIGNAGE_ENCLOSED, CSIGNAGE_ENCLOSED, RUBBER_BANDS, CRUBBER_BANDS, HANG_TAGS, CHANG_TAGS, CARTON_LABEL, CCARTON_LABEL, BOX_STICKER, CBOX_STICKER, PINK_LABEL, CPINK_LABEL, GREEN_LABEL, CGREEN_LABEL, LAUNCH_PAD, CLAUNCH_PAD, CARTON_MARKING, CCARTON_MARKING, CADS_OTRO, CCADS_OTRO, V_BOARDS, CV_BOARDS, HANGERS, CHANGERS, OTROS_TYPE, COTROS_TYPE, WOVEN_LABEL, CWOVEN_LABEL, F_ACTUAL, F_MODIFICACION) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}','{18}','{19}','{20}','{21}','{22}','{23}','{24}','{25}','{26}','{27}', '{28}', '{29}', '{30}', '{31}', '{32}','{33}','{34}','{35}','{36}','{37}','{38}','{39}','{40}','{41}','{42}','{43}','{44}','{45}','{46}','{47}','{48}','{49}','{50}','{51}','{52}','{53}','{54}','{55}','{56}','{57})", pid_usuario, pCUSTOMOR, pPO, pSTYLE, pCOLOR_DESCRIPTION, pITEM_NUMBER, pITEM_DESCRIPTION, pPRICE_TICKET, pCPRICE_TICKET, pHOUSE_LABEL, pCHOUSE_LABEL, pBULLET, pCBULLET, pECOM_STICKER, pCECOM_STICKER, pSIZE_STRIP, pCSIZE_STRIP, pPOLY_BAG, pCPOLY_BAG, pSIZE_CLUB, pCSIZE_CLUB, pDISCLAIMER, pCDISCLAIMER, pCARD_BOARD, pCCARD_BOARD, pGLOW_DARCK, pCGLOW_DARCK, pSIGNAGE_ENCLOSED, pCSIGNAGE_ENCLOSED, pRUBBER_BANDS, pCRUBBER_BANDS, pHANG_TAGS, pCHANG_TAGS, pCARTON_LABEL, pCCARTON_LABEL, pBOX_STICKER, pCBOX_STICKER, pPINK_LABEL, pCPINK_LABEL, pGREEN_LABEL, pCGREEN_LABEL, pLAUNCH_PAD, pCLAUNCH_PAD, pCARTON_MARKING, pCCARTON_MARKING, pCADS_OTRO, pCCADS_OTRO, pV_BOARDS, pCV_BOARDS, pHANGERS, pCHANGERS, pOTROS_TYPE, pCOTROS_TYPE, pWOVEN_LABEL, pCWOVEN_LABEL, pFECHA, pFECHAM), Conn);
                resultado = Comando.ExecuteNonQuery();
                Conn.Close();
                return resultado;

            }

    martes, 30 de agosto de 2016 4:50

Respuestas

  • Hola BBautista,

    [-] ... El índice (basado en cero) debe ser mayor o igual a cero y menor que el tamaño de la lista de argumentos.

    Si te fijas bien en el formato envías desde 58 parámetros ({0} ..... {57}), pero al darle los valores solo mandas 57.

    Personalmente te recomendaría cambiar de metodología. Eso de pasar parámetros lo veo incorrecto. Lo mejor sería crear una clase dónde almacenes los valores, además deberías usar StoredProcedure.

    * Procedimiento almacenado : (El mismo nombre en el SQLCommand)

    CREATE PROCEDURE RegistrarTrim
    @pid_usuario INT,
    @pCUSTOMOR VARCHAR(50)
    ....
    ....
    AS
       INSERT INTO REGISTRO_TRIM(ID_USUARIO, CUSTOMOR ... ) 
       VALUES (@pid_usuario, @pCUSTOMOR ....)
    GO

    Y la clase :

         public class RegistroTrim
            {
                public string pid_usuario { get; set; }
                public string pCUSTOMOR { get; set; }
                //Demás propiedades
            }

    Y tu método :

          public static int CrearRTrim(RegistroTrim reg)
            {
                try
                {
                    using (SqlConnection con = new SqlConnection("CadenaConexion"))
                    {
                        con.Open();
                        SqlCommand Comando = new SqlCommand("RegistrarTrim", con);
                        Comando.CommandType = CommandType.StoredProcedure;
    
                        Comando.Parameters.AddWithValue("@pid_usuario", reg.pid_usuario);
                        Comando.Parameters.AddWithValue("@pCUSTOMOR", reg.pCUSTOMOR);
                        //Demás parámetros
    
                        return Comando.ExecuteNonQuery();
                    }      
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return -1;
                }
            }

    Así procuras tener un código más limpio.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta BBautista martes, 30 de agosto de 2016 5:40
    martes, 30 de agosto de 2016 5:17

Todas las respuestas

  • hola

    porque usas el string.Format() para asignar los valores de los parametros, eso es una mala practica, tienes que usar parametros

    la estructura de tu codigo deberia ser algo como

    using (SqlConnection conn = new SqlConnection("<connection string>"))  
    {  
        conn.Open();  
     
        string query = "INSERT INTO NombreTabla (campo1, campo2) VALUES (@param1, @param2)";  
        SqlCommand cmd = new SqlCommand(query, conn);  
        cmd.Parameters.AddWithValue("@param1", Convert.ToString(TextBox1.Text));  
        cmd.Parameters.AddWithValue("@param2", Convert.ToInt32(Textbox2.Text));  
     
        cmd.ExecuteNonQuery();  
     
    }

    como veras asignas la coleccion Parameters del command para poner los valores

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 30 de agosto de 2016 5:02
  • Hola BBautista,

    [-] ... El índice (basado en cero) debe ser mayor o igual a cero y menor que el tamaño de la lista de argumentos.

    Si te fijas bien en el formato envías desde 58 parámetros ({0} ..... {57}), pero al darle los valores solo mandas 57.

    Personalmente te recomendaría cambiar de metodología. Eso de pasar parámetros lo veo incorrecto. Lo mejor sería crear una clase dónde almacenes los valores, además deberías usar StoredProcedure.

    * Procedimiento almacenado : (El mismo nombre en el SQLCommand)

    CREATE PROCEDURE RegistrarTrim
    @pid_usuario INT,
    @pCUSTOMOR VARCHAR(50)
    ....
    ....
    AS
       INSERT INTO REGISTRO_TRIM(ID_USUARIO, CUSTOMOR ... ) 
       VALUES (@pid_usuario, @pCUSTOMOR ....)
    GO

    Y la clase :

         public class RegistroTrim
            {
                public string pid_usuario { get; set; }
                public string pCUSTOMOR { get; set; }
                //Demás propiedades
            }

    Y tu método :

          public static int CrearRTrim(RegistroTrim reg)
            {
                try
                {
                    using (SqlConnection con = new SqlConnection("CadenaConexion"))
                    {
                        con.Open();
                        SqlCommand Comando = new SqlCommand("RegistrarTrim", con);
                        Comando.CommandType = CommandType.StoredProcedure;
    
                        Comando.Parameters.AddWithValue("@pid_usuario", reg.pid_usuario);
                        Comando.Parameters.AddWithValue("@pCUSTOMOR", reg.pCUSTOMOR);
                        //Demás parámetros
    
                        return Comando.ExecuteNonQuery();
                    }      
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return -1;
                }
            }

    Así procuras tener un código más limpio.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta BBautista martes, 30 de agosto de 2016 5:40
    martes, 30 de agosto de 2016 5:17
  • De antemano gracias a ambos ya que cualquiera de las dos metodologías son mejores que la mia pero ahora si que practicando y preguntando se aprende. Y  si gracias Joel C. Naupa Crispin ya me di cuenta que los numeros de parametros no coenciden jeje. Para terminar, el sistema es mas rapido con procedimiento almaceno verdad? o estoy mal?.
    martes, 30 de agosto de 2016 5:53