Principales respuestas
Problema con EntityFramework 4.6.1

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
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
Todas las respuestas
-
-
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
-
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