none
Problema con EntityFramework 4.6.1 RRS feed

  • Pregunta

  • Buenas tardes, tengo un problema con mi aplicación de Windows Form hecha en VS Community 2017.

    El caso es que tengo una conexión con SQL Server, en esta BD tengo un procedimiento almacenado que al correrlo en el management studio funciona a la perfección pero en VS 2017 no funciona me da un error como si llamara a un parametro de tipo nvarchar para convertirlo a número:

    InnerException {"Error converting data type nvarchar to numeric."} System.Exception {System.Data.SqlClient.SqlException}

    Pero en mi procedimiento almacenado no tengo parámetros de este tipo, los que tengo son:

    @semana as int,
    @fec_ini_plan as char(8), 
    @fec_ini as char(8), 
    @reoptimizacion varchar(20)

    Lo que me extraña es que directamente en el Management Studio funciona perfectamente, y de hecho cree otro proyecto en VS en el cual agregue nuevamente el modelo de EF y me funciona perfectamente este SP, pero cuando lo intento ejecutar del proyecto original me da el error. Ya quite el modelo de EF y lo volvi a crear completamente, actualice el SP, lo quite del modelo y lo volví a agregar, no se que mas hacer.

    Agradezco el apoyo de antemano. Gracias.


    C. Zapata

    miércoles, 2 de enero de 2019 23:04

Respuestas

  • Hola Sergio y Leonardo, gracias por responder, el procedimiento almacenado es largo pero te dire exactamente donde se encuentra el problema, este es mi procedimiento almacenado (Resumido):

    ALTER PROCEDURE [dbo].[llena_registros]
    
    @semana as int,
    @fec_ini_plan as char(8), 
    @fec_ini as char(8), 
    @reoptimizacion varchar(20)
    
    CREATE TABLE #tmp_table
    		( codigo VARCHAR(20), peso decimal(18,4), 
    		G_JUE DECIMAL(18,2),Q_JUE DECIMAL(18,2), C_JUE DECIMAL(18,2), M_JUE DECIMAL(18,2), S_JUE DECIMAL(18,2),
    		G_VIE DECIMAL(18,2),Q_VIE DECIMAL(18,2), C_VIE DECIMAL(18,2), M_VIE DECIMAL(18,2), S_VIE DECIMAL(18,2),
    		G_SAB DECIMAL(18,2),Q_SAB DECIMAL(18,2), C_SAB DECIMAL(18,2), M_SAB DECIMAL(18,2), S_SAB DECIMAL(18,2),
    		G_LUN DECIMAL(18,2),Q_LUN DECIMAL(18,2), C_LUN DECIMAL(18,2), M_LUN DECIMAL(18,2), S_LUN DECIMAL(18,2),
    		G_MAR DECIMAL(18,2),Q_MAR DECIMAL(18,2), C_MAR DECIMAL(18,2), M_MAR DECIMAL(18,2), S_MAR DECIMAL(18,2),
    		G_MIE DECIMAL(18,2),Q_MIE DECIMAL(18,2), C_MIE DECIMAL(18,2), M_MIE DECIMAL(18,2), S_MIE DECIMAL(18,2))
    
    insert into #tmp_table
    	select codigo, cast(peso as decimal(18,4)),
    			replace(replace(G_JUE,' ',''),',',''), replace(replace(Q_JUE,' ',''),',',''), replace(replace(C_JUE,' ',''),',',''), replace(replace(M_JUE,' ',''),',',''), replace(replace(S_JUE,' ',''),',',''),
    			replace(replace(G_VIE,' ',''),',',''), replace(replace(Q_VIE,' ',''),',',''), replace(replace(C_VIE,' ',''),',',''), replace(replace(M_VIE,' ',''),',',''), replace(replace(S_VIE,' ',''),',',''),
    			replace(replace(G_SAB,' ',''),',',''), replace(replace(Q_SAB,' ',''),',',''), replace(replace(C_SAB,' ',''),',',''), replace(replace(M_SAB,' ',''),',',''), replace(replace(S_SAB,' ',''),',',''),
    			replace(replace(G_LUN,' ',''),',',''), replace(replace(Q_LUN,' ',''),',',''), replace(replace(C_LUN,' ',''),',',''), replace(replace(M_LUN,' ',''),',',''), replace(replace(S_LUN,' ',''),',',''),
    			replace(replace(G_MAR,' ',''),',',''), replace(replace(Q_MAR,' ',''),',',''), replace(replace(C_MAR,' ',''),',',''), replace(replace(M_MAR,' ',''),',',''), replace(replace(S_MAR,' ',''),',',''),
    			replace(replace(G_MIE,' ',''),',',''), replace(replace(Q_MIE,' ',''),',',''), replace(replace(C_MIE,' ',''),',',''), replace(replace(M_MIE,' ',''),',',''), replace(replace(S_MIE,' ',''),',','')
    	from (
    			SELECT [PLAN DE PRODUCCION/DISTRIBUCION] AS codigo, F3 as peso, 
    				CASE WHEN F11  LIKE('%E%') then SUBSTRING(F11,0,CHARINDEX('e',F11,1)) else F11 end AS G_JUE,
    				CASE WHEN F12  LIKE('%E%') then SUBSTRING(F12,0,CHARINDEX('e',F12,1)) else F12 end AS Q_JUE,  
    				CASE WHEN F13  LIKE('%E%') then SUBSTRING(F13,0,CHARINDEX('e',F13,1)) else F13 end AS C_JUE, 
    				CASE WHEN F14  LIKE('%E%') then SUBSTRING(F14,0,CHARINDEX('e',F14,1)) else F14 end AS M_JUE,  
    				CASE WHEN F15  LIKE('%E%') then SUBSTRING(F15,0,CHARINDEX('e',F15,1)) else F15 end AS S_JUE,
    				CASE WHEN F17  LIKE('%E%') then SUBSTRING(F17,0,CHARINDEX('e',F17,1)) else F17 end AS G_VIE, 
    				CASE WHEN F18  LIKE('%E%') then SUBSTRING(F18,0,CHARINDEX('e',F18,1)) else F18 end AS Q_VIE,  
    				CASE WHEN F19  LIKE('%E%') then SUBSTRING(F19,0,CHARINDEX('e',F19,1)) else F19 end AS C_VIE, 
    				CASE WHEN F20  LIKE('%E%') then SUBSTRING(F20,0,CHARINDEX('e',F20,1)) else F20 end AS M_VIE, 
    				CASE WHEN F21  LIKE('%E%') then SUBSTRING(F21,0,CHARINDEX('e',F21,1)) else F21 end AS S_VIE,
    				CASE WHEN F23  LIKE('%E%') then SUBSTRING(F23 ,0,CHARINDEX('e',F23,1)) else F23   end AS G_SAB, 
    				CASE WHEN F24  LIKE('%E%') then SUBSTRING(F24 ,0,CHARINDEX('e',F24,1)) else F24   end AS Q_SAB,  
    				CASE WHEN [0]  LIKE('%E%') then SUBSTRING([0] ,0,CHARINDEX('e',[0],1)) else [0]   end AS C_SAB, 
    				CASE WHEN F26  LIKE('%E%') then SUBSTRING(F26 ,0,CHARINDEX('e',F26,1)) else F26   end AS M_SAB, 
    				CASE WHEN [01] LIKE('%E%') then SUBSTRING([01],0,CHARINDEX('e',[01],1)) else [01] end AS S_SAB,
    				CASE WHEN F29  LIKE('%E%') then SUBSTRING(F29,0,CHARINDEX('e',F29,1)) else F29 end AS G_LUN,  
    				CASE WHEN F30  LIKE('%E%') then SUBSTRING(F30,0,CHARINDEX('e',F30,1)) else F30 end AS Q_LUN, 
    				CASE WHEN F31  LIKE('%E%') then SUBSTRING(F31,0,CHARINDEX('e',F31,1)) else F31 end AS C_LUN, 
    				CASE WHEN F32  LIKE('%E%') then SUBSTRING(F32,0,CHARINDEX('e',F32,1)) else F32 end AS M_LUN,  
    				CASE WHEN F33  LIKE('%E%') then SUBSTRING(F33,0,CHARINDEX('e',F33,1)) else F33 end AS S_LUN,
    				CASE WHEN F35  LIKE('%E%') then SUBSTRING(F35,0,CHARINDEX('e',F35,1)) else F35 end AS G_MAR,  
    				CASE WHEN F36  LIKE('%E%') then SUBSTRING(F36,0,CHARINDEX('e',F36,1)) else F36 end AS Q_MAR,  
    				CASE WHEN F37  LIKE('%E%') then SUBSTRING(F37,0,CHARINDEX('e',F37,1)) else F37 end AS C_MAR, 
    				CASE WHEN F38  LIKE('%E%') then SUBSTRING(F38,0,CHARINDEX('e',F38,1)) else F38 end AS M_MAR,  
    				CASE WHEN F39  LIKE('%E%') then SUBSTRING(F39,0,CHARINDEX('e',F39,1)) else F39 end AS S_MAR,
    				CASE WHEN F41   LIKE('%E%') then SUBSTRING(F41 ,0,CHARINDEX('e',F41,1))  else F41  end AS G_MIE, 
    				CASE WHEN F42   LIKE('%E%') then SUBSTRING(F42 ,0,CHARINDEX('e',F42,1))  else F42  end AS Q_MIE, 
    				CASE WHEN [02]  LIKE('%E%') then SUBSTRING([02],0,CHARINDEX('e',[02],1)) else [02] end AS C_MIE, 
    				CASE WHEN F44   LIKE('%E%') then SUBSTRING(F44 ,0,CHARINDEX('e',F44,1))  else F44  end AS M_MIE, 
    				CASE WHEN [03]  LIKE('%E%') then SUBSTRING([03],0,CHARINDEX('e',[03],1)) else [03] end AS S_MIE
    				FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    								'Excel 12.0;Database=C:\XML-XLS\PEDIDOS_CLIENTES.xlsx',
    								'SELECT * FROM [PRODUCCION CODIGO PADRE$]') inner join productos p on [PLAN DE PRODUCCION/DISTRIBUCION] = p.cod_producto
    																			inner join familias f on (p.cod_familia = f.cod_familia and f.incluido = 1)
    				WHERE F2 is not null and F3 is not null
    		) sel1
    
    		select * from #tmp_table


    El context en VS esta así:

    Como ves coinciden los tipos de datos int, string, string, string

    public virtual int llena_registros(Nullable<int> semana, string fec_ini_plan, string fec_ini, string reoptimizacion)
            {
                var semanaParameter = semana.HasValue ?
                    new ObjectParameter("semana", semana) :
                    new ObjectParameter("semana", typeof(int));
        
                var fec_ini_planParameter = fec_ini_plan != null ?
                    new ObjectParameter("fec_ini_plan", fec_ini_plan) :
                    new ObjectParameter("fec_ini_plan", typeof(string));
        
                var fec_iniParameter = fec_ini != null ?
                    new ObjectParameter("fec_ini", fec_ini) :
                    new ObjectParameter("fec_ini", typeof(string));
        
                var reoptimizacionParameter = reoptimizacion != null ?
                    new ObjectParameter("reoptimizacion", reoptimizacion) :
                    new ObjectParameter("reoptimizacion", typeof(string));
        
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("llena_registros", semanaParameter, fec_ini_planParameter, fec_iniParameter, reoptimizacionParameter);
            }
      

    Como ves lo que hago es llenar una tabla temporal con unos valores que tomo de un archivo de excel, el problema en si se presenta con el campo de peso que es decimal(18,4), este valor si lo cambio a varchar lo toma pero no carga bien el numero ya que no discrimina entre los enteros y los decimales, a mi parecer es algo que puede que tenga que ver con el collation o la forma como reconoce los decimales.

    Mi configuración regional y la configuración de mi BD:

     

    Cabe destacar que no estoy trabajando con code first, ya tenia la base de datos y a partir de ella hice la entidad de EF.

    C. Zapata



    • Editado CAZA - jueves, 3 de enero de 2019 14:25
    • Marcado como respuesta Pablo RubioModerator miércoles, 16 de enero de 2019 22:48
    jueves, 3 de enero de 2019 14:04

Todas las respuestas

  • Hola. Puedes mostrar el código donde haces la llamada a acceso a datos? También el código de tu procedimiento. Gracias 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 3 de enero de 2019 7:34
  • hola

    >>Error converting data type nvarchar to numeric.

    revisaste el mapping de la entidad, quizas estas queriendo asignar una propiedad int a un campo que devuelve string

    valida que los tipos de los campos en la db coinciden con el de las propiedades donde quieres asignar el dato

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Pedro Alfaro jueves, 3 de enero de 2019 16:10
    jueves, 3 de enero de 2019 11:26
  • Hola Sergio y Leonardo, gracias por responder, el procedimiento almacenado es largo pero te dire exactamente donde se encuentra el problema, este es mi procedimiento almacenado (Resumido):

    ALTER PROCEDURE [dbo].[llena_registros]
    
    @semana as int,
    @fec_ini_plan as char(8), 
    @fec_ini as char(8), 
    @reoptimizacion varchar(20)
    
    CREATE TABLE #tmp_table
    		( codigo VARCHAR(20), peso decimal(18,4), 
    		G_JUE DECIMAL(18,2),Q_JUE DECIMAL(18,2), C_JUE DECIMAL(18,2), M_JUE DECIMAL(18,2), S_JUE DECIMAL(18,2),
    		G_VIE DECIMAL(18,2),Q_VIE DECIMAL(18,2), C_VIE DECIMAL(18,2), M_VIE DECIMAL(18,2), S_VIE DECIMAL(18,2),
    		G_SAB DECIMAL(18,2),Q_SAB DECIMAL(18,2), C_SAB DECIMAL(18,2), M_SAB DECIMAL(18,2), S_SAB DECIMAL(18,2),
    		G_LUN DECIMAL(18,2),Q_LUN DECIMAL(18,2), C_LUN DECIMAL(18,2), M_LUN DECIMAL(18,2), S_LUN DECIMAL(18,2),
    		G_MAR DECIMAL(18,2),Q_MAR DECIMAL(18,2), C_MAR DECIMAL(18,2), M_MAR DECIMAL(18,2), S_MAR DECIMAL(18,2),
    		G_MIE DECIMAL(18,2),Q_MIE DECIMAL(18,2), C_MIE DECIMAL(18,2), M_MIE DECIMAL(18,2), S_MIE DECIMAL(18,2))
    
    insert into #tmp_table
    	select codigo, cast(peso as decimal(18,4)),
    			replace(replace(G_JUE,' ',''),',',''), replace(replace(Q_JUE,' ',''),',',''), replace(replace(C_JUE,' ',''),',',''), replace(replace(M_JUE,' ',''),',',''), replace(replace(S_JUE,' ',''),',',''),
    			replace(replace(G_VIE,' ',''),',',''), replace(replace(Q_VIE,' ',''),',',''), replace(replace(C_VIE,' ',''),',',''), replace(replace(M_VIE,' ',''),',',''), replace(replace(S_VIE,' ',''),',',''),
    			replace(replace(G_SAB,' ',''),',',''), replace(replace(Q_SAB,' ',''),',',''), replace(replace(C_SAB,' ',''),',',''), replace(replace(M_SAB,' ',''),',',''), replace(replace(S_SAB,' ',''),',',''),
    			replace(replace(G_LUN,' ',''),',',''), replace(replace(Q_LUN,' ',''),',',''), replace(replace(C_LUN,' ',''),',',''), replace(replace(M_LUN,' ',''),',',''), replace(replace(S_LUN,' ',''),',',''),
    			replace(replace(G_MAR,' ',''),',',''), replace(replace(Q_MAR,' ',''),',',''), replace(replace(C_MAR,' ',''),',',''), replace(replace(M_MAR,' ',''),',',''), replace(replace(S_MAR,' ',''),',',''),
    			replace(replace(G_MIE,' ',''),',',''), replace(replace(Q_MIE,' ',''),',',''), replace(replace(C_MIE,' ',''),',',''), replace(replace(M_MIE,' ',''),',',''), replace(replace(S_MIE,' ',''),',','')
    	from (
    			SELECT [PLAN DE PRODUCCION/DISTRIBUCION] AS codigo, F3 as peso, 
    				CASE WHEN F11  LIKE('%E%') then SUBSTRING(F11,0,CHARINDEX('e',F11,1)) else F11 end AS G_JUE,
    				CASE WHEN F12  LIKE('%E%') then SUBSTRING(F12,0,CHARINDEX('e',F12,1)) else F12 end AS Q_JUE,  
    				CASE WHEN F13  LIKE('%E%') then SUBSTRING(F13,0,CHARINDEX('e',F13,1)) else F13 end AS C_JUE, 
    				CASE WHEN F14  LIKE('%E%') then SUBSTRING(F14,0,CHARINDEX('e',F14,1)) else F14 end AS M_JUE,  
    				CASE WHEN F15  LIKE('%E%') then SUBSTRING(F15,0,CHARINDEX('e',F15,1)) else F15 end AS S_JUE,
    				CASE WHEN F17  LIKE('%E%') then SUBSTRING(F17,0,CHARINDEX('e',F17,1)) else F17 end AS G_VIE, 
    				CASE WHEN F18  LIKE('%E%') then SUBSTRING(F18,0,CHARINDEX('e',F18,1)) else F18 end AS Q_VIE,  
    				CASE WHEN F19  LIKE('%E%') then SUBSTRING(F19,0,CHARINDEX('e',F19,1)) else F19 end AS C_VIE, 
    				CASE WHEN F20  LIKE('%E%') then SUBSTRING(F20,0,CHARINDEX('e',F20,1)) else F20 end AS M_VIE, 
    				CASE WHEN F21  LIKE('%E%') then SUBSTRING(F21,0,CHARINDEX('e',F21,1)) else F21 end AS S_VIE,
    				CASE WHEN F23  LIKE('%E%') then SUBSTRING(F23 ,0,CHARINDEX('e',F23,1)) else F23   end AS G_SAB, 
    				CASE WHEN F24  LIKE('%E%') then SUBSTRING(F24 ,0,CHARINDEX('e',F24,1)) else F24   end AS Q_SAB,  
    				CASE WHEN [0]  LIKE('%E%') then SUBSTRING([0] ,0,CHARINDEX('e',[0],1)) else [0]   end AS C_SAB, 
    				CASE WHEN F26  LIKE('%E%') then SUBSTRING(F26 ,0,CHARINDEX('e',F26,1)) else F26   end AS M_SAB, 
    				CASE WHEN [01] LIKE('%E%') then SUBSTRING([01],0,CHARINDEX('e',[01],1)) else [01] end AS S_SAB,
    				CASE WHEN F29  LIKE('%E%') then SUBSTRING(F29,0,CHARINDEX('e',F29,1)) else F29 end AS G_LUN,  
    				CASE WHEN F30  LIKE('%E%') then SUBSTRING(F30,0,CHARINDEX('e',F30,1)) else F30 end AS Q_LUN, 
    				CASE WHEN F31  LIKE('%E%') then SUBSTRING(F31,0,CHARINDEX('e',F31,1)) else F31 end AS C_LUN, 
    				CASE WHEN F32  LIKE('%E%') then SUBSTRING(F32,0,CHARINDEX('e',F32,1)) else F32 end AS M_LUN,  
    				CASE WHEN F33  LIKE('%E%') then SUBSTRING(F33,0,CHARINDEX('e',F33,1)) else F33 end AS S_LUN,
    				CASE WHEN F35  LIKE('%E%') then SUBSTRING(F35,0,CHARINDEX('e',F35,1)) else F35 end AS G_MAR,  
    				CASE WHEN F36  LIKE('%E%') then SUBSTRING(F36,0,CHARINDEX('e',F36,1)) else F36 end AS Q_MAR,  
    				CASE WHEN F37  LIKE('%E%') then SUBSTRING(F37,0,CHARINDEX('e',F37,1)) else F37 end AS C_MAR, 
    				CASE WHEN F38  LIKE('%E%') then SUBSTRING(F38,0,CHARINDEX('e',F38,1)) else F38 end AS M_MAR,  
    				CASE WHEN F39  LIKE('%E%') then SUBSTRING(F39,0,CHARINDEX('e',F39,1)) else F39 end AS S_MAR,
    				CASE WHEN F41   LIKE('%E%') then SUBSTRING(F41 ,0,CHARINDEX('e',F41,1))  else F41  end AS G_MIE, 
    				CASE WHEN F42   LIKE('%E%') then SUBSTRING(F42 ,0,CHARINDEX('e',F42,1))  else F42  end AS Q_MIE, 
    				CASE WHEN [02]  LIKE('%E%') then SUBSTRING([02],0,CHARINDEX('e',[02],1)) else [02] end AS C_MIE, 
    				CASE WHEN F44   LIKE('%E%') then SUBSTRING(F44 ,0,CHARINDEX('e',F44,1))  else F44  end AS M_MIE, 
    				CASE WHEN [03]  LIKE('%E%') then SUBSTRING([03],0,CHARINDEX('e',[03],1)) else [03] end AS S_MIE
    				FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    								'Excel 12.0;Database=C:\XML-XLS\PEDIDOS_CLIENTES.xlsx',
    								'SELECT * FROM [PRODUCCION CODIGO PADRE$]') inner join productos p on [PLAN DE PRODUCCION/DISTRIBUCION] = p.cod_producto
    																			inner join familias f on (p.cod_familia = f.cod_familia and f.incluido = 1)
    				WHERE F2 is not null and F3 is not null
    		) sel1
    
    		select * from #tmp_table


    El context en VS esta así:

    Como ves coinciden los tipos de datos int, string, string, string

    public virtual int llena_registros(Nullable<int> semana, string fec_ini_plan, string fec_ini, string reoptimizacion)
            {
                var semanaParameter = semana.HasValue ?
                    new ObjectParameter("semana", semana) :
                    new ObjectParameter("semana", typeof(int));
        
                var fec_ini_planParameter = fec_ini_plan != null ?
                    new ObjectParameter("fec_ini_plan", fec_ini_plan) :
                    new ObjectParameter("fec_ini_plan", typeof(string));
        
                var fec_iniParameter = fec_ini != null ?
                    new ObjectParameter("fec_ini", fec_ini) :
                    new ObjectParameter("fec_ini", typeof(string));
        
                var reoptimizacionParameter = reoptimizacion != null ?
                    new ObjectParameter("reoptimizacion", reoptimizacion) :
                    new ObjectParameter("reoptimizacion", typeof(string));
        
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("llena_registros", semanaParameter, fec_ini_planParameter, fec_iniParameter, reoptimizacionParameter);
            }
      

    Como ves lo que hago es llenar una tabla temporal con unos valores que tomo de un archivo de excel, el problema en si se presenta con el campo de peso que es decimal(18,4), este valor si lo cambio a varchar lo toma pero no carga bien el numero ya que no discrimina entre los enteros y los decimales, a mi parecer es algo que puede que tenga que ver con el collation o la forma como reconoce los decimales.

    Mi configuración regional y la configuración de mi BD:

     

    Cabe destacar que no estoy trabajando con code first, ya tenia la base de datos y a partir de ella hice la entidad de EF.

    C. Zapata



    • Editado CAZA - jueves, 3 de enero de 2019 14:25
    • Marcado como respuesta Pablo RubioModerator miércoles, 16 de enero de 2019 22:48
    jueves, 3 de enero de 2019 14:04