Usuario
LA OPERACIÓN ARITMÉTICA HA PROVOCADO UN DESBORDAMIENTO

Pregunta
-
Saludos, Tengo un problema al intentar obtener datos de la base de datos con procedimiento almacenado, el motor de base de datos que uso es MySql. En breve dejo el codigo de C# y la excepcion:
Codigo:
OdbcConnection cn = new OdbcConnection(ConfigurationManager.ConnectionStrings["dsnname"].ConnectionString); cn.Open(); OdbcDataAdapter da = new OdbcDataAdapter("call SP_SelectComputadoras(?)", cn); da.SelectCommand.Parameters.AddWithValue("PEstatus", "2"); DataTable dtPC = new DataTable(); da.Fill(dtPC);
Excepción:
Mensaje:
LA OPERACIÓN ARITMÉTICA HA PROVOCADO UN DESBORDAMIENTO
StackTrace:
EN SYSTEM.DATA.ODBC.ODBCDATAREADER.GETSQLTYPE(INT32 I)
EN SYSTEM.DATA.ODBC.ODBCDATAREADER.GETFIELDTYPE(INT32 I)
EN SYSTEM.DATA.PROVIDERBASE.SCHEMAMAPPING.SETUPSCHEMAWITHOUTKEYINFO(MISSINGMAPPINGACTION MAPPINGACTION, MISSINGSCHEMAACTION SCHEMAACTION, BOOLEAN GETTINGDATA, DATACOLUMN PARENTCHAPTERCOLUMN, OBJECT CHAPTERVALUE)
EN SYSTEM.DATA.PROVIDERBASE.SCHEMAMAPPING..CTOR(DATAADAPTER ADAPTER, DATASET DATASET, DATATABLE DATATABLE, DATAREADERCONTAINER DATAREADER, BOOLEAN KEYINFO, SCHEMATYPE SCHEMATYPE, STRING SOURCETABLENAME, BOOLEAN GETTINGDATA, DATACOLUMN PARENTCHAPTERCOLUMN, OBJECT PARENTCHAPTERVALUE)
EN SYSTEM.DATA.COMMON.DATAADAPTER.FILLMAPPINGINTERNAL(DATASET DATASET, DATATABLE DATATABLE, STRING SRCTABLE, DATAREADERCONTAINER DATAREADER, INT32 SCHEMACOUNT, DATACOLUMN PARENTCHAPTERCOLUMN, OBJECT PARENTCHAPTERVALUE)
EN SYSTEM.DATA.COMMON.DATAADAPTER.FILLMAPPING(DATASET DATASET, DATATABLE DATATABLE, STRING SRCTABLE, DATAREADERCONTAINER DATAREADER, INT32 SCHEMACOUNT, DATACOLUMN PARENTCHAPTERCOLUMN, OBJECT PARENTCHAPTERVALUE)
EN SYSTEM.DATA.COMMON.DATAADAPTER.FILLFROMREADER(DATASET DATASET, DATATABLE DATATABLE, STRING SRCTABLE, DATAREADERCONTAINER DATAREADER, INT32 STARTRECORD, INT32 MAXRECORDS, DATACOLUMN PARENTCHAPTERCOLUMN, OBJECT PARENTCHAPTERVALUE)
EN SYSTEM.DATA.COMMON.DATAADAPTER.FILL(DATATABLE[] DATATABLES, IDATAREADER DATAREADER, INT32 STARTRECORD, INT32 MAXRECORDS)
EN SYSTEM.DATA.COMMON.DBDATAADAPTER.FILLINTERNAL(DATASET DATASET, DATATABLE[] DATATABLES, INT32 STARTRECORD, INT32 MAXRECORDS, STRING SRCTABLE, IDBCOMMAND COMMAND, COMMANDBEHAVIOR BEHAVIOR)
EN SYSTEM.DATA.COMMON.DBDATAADAPTER.FILL(DATATABLE[] DATATABLES, INT32 STARTRECORD, INT32 MAXRECORDS, IDBCOMMAND COMMAND, COMMANDBEHAVIOR BEHAVIOR)
EN SYSTEM.DATA.COMMON.DBDATAADAPTER.FILL(DATATABLE DATATABLE)
EN ACTUALIZACIONSIAFIM.WEBFORMS.PARAMETROS.MAPEARRED() EN C:\USERS\USUARIO\DESKTOP\ACTUALIZACIONSIAFIM\ACTUALIZACIONSIAFIM\WEBFORMS\PARAMETROS.ASPX.CS:LÍNEA 149HResult:
-2146233066
---------------------------------------------------------------
Espero que me puedan ayudar, es urgente!!
Handel Santana
Todas las respuestas
-
Hola Handelsr:
He realizado tu código con una conexión odbc, pero contra sql server.
create procedure SP_SelectComputadoras (@PEstatus int) as return select 2*@PEstatus as col1, 3*@PEstatus as col2
El sp, es como los de mysql salvo que por defecto los parámetros son IN, no llevan delimitadores, y se ejecutan con exec en vez de call.
try { OdbcConnection cn = new OdbcConnection("Driver={SQL Server};Server=ESQUINERO;Database=ejUno;"); cn.Open(); OdbcDataAdapter da = new OdbcDataAdapter("EXEC sp_select ?", cn); da.SelectCommand.Parameters.AddWithValue("@PEstatus", 2); DataTable dtPC = new DataTable(); da.Fill(dtPC); } catch (OdbcException e){ MessageBox.Show(e.Message); }
Me he conectado con el ODBCConnection, con la cadena de conexión a mi servidor SQL Server, pero bajo odbc.
Y esto es funcional.
Si observas, y dado que no has expuesto tu código del procedure, el mismo, esta esperando recibir un varchar?
Otra pregunta, es si ¿has lanzado el código del procedure con ese parametro directamente desde el workBench de mysql? , o el gestor que utilices, y es funcional?
- Propuesto como respuesta Sergio ParraModerator jueves, 24 de enero de 2019 21:41
-
Hola:
1- Como parametro si espera un varchar
2- Si, lo probé directamente desde el motor de base de datos y es funcional. Por eso no expuse el codigo del procedure. Eso me hace pensar que tiene que ver de alguna manera con el Odbc.
Lo mas extraño es que ademas de mi PC, el sistema esta instalado es dos PCs mas y el error solo da en una de ellas.
Handel Santana
- Editado Handelsr viernes, 25 de enero de 2019 13:54
-
Hola
El varchar es anecdotico. Entonces el problema deberia radicar en el controlador? Otra opcion puede tener algo que ver con configuraciones de separadores decimales o similares? Dado que es un desbordamiento. Como no pusiste el codigo del procexure no creo que se pueda aportar mucho mas. :)
-
Este es el codigo del procedure:
select c.*, (select l.Proceso from siafimactualizacion.tbllog l where l.DirMAC=c.DirMac
and CodSistema=(select sistema from siafimactualizacion.tblparametros)
ORDER BY l.NoEvento desc limit 1) Actualizado,
(select s.NombreSistema from siafimactualizacion.tblsistemas s
inner join siafimactualizacion.tblparametros p on p.Sistema=s.Codigo) NombreSistema,
(select count(*) from siafimactualizacion.tblmensajeslog where Leido=0
and Mensaje!='Actualizame' and PCOrigenMAC=c.DirMAC) CantMensajes, 0 'Marcar'
from siafimactualizacion.tblcomputadoras c where PEstatus=2 or c.Estatus=PEstatus
order by c.Estatus desc;
En el codigo C# cambie las librerias del ODBC por las de MySql lo probe y funciono correctamente, Este es el codigo editado:
MySqlConnection cn = new MySqlConnection("Server=10.0.0.9;Database=bd;Uid=root;Pwd=contraseña;"); cn.Open(); MySqlDataAdapter da = new MySqlDataAdapter("SP_SelectComputadoras", cn); da.SelectCommand.CommandType = CommandType.StoredProcedure; da.SelectCommand.Parameters.AddWithValue("@PEstatus", "2"); DataTable dtPC = new DataTable(); da.Fill(dtPC);
El problema es que eso lo hice para probar ya que no puedo dejarlo así, las instituciones que usan ese sistema usan también otro sistema y tienen MySql Server instalado con contraseñas diferentes.
Algo que note es que cuando ocurre un evento que ejecuta otro procedure este error no aparece.
Handel Santana
- Editado Handelsr viernes, 25 de enero de 2019 16:54 Agregar informacion