Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

proedimientos almacenados para mysql5

Estas en el tema de proedimientos almacenados para mysql5 en el foro de Mysql en Foros del Web. Disculpen, soy nuevo en el foro y algo conozco de MySql. Mi problema es que al crear procedimientos almacenados en MySql y depurarlo en Visual ...
  #1 (permalink)  
Antiguo 27/06/2008, 09:05
 
Fecha de Ingreso: junio-2008
Ubicación: Concepción
Mensajes: 24
Antigüedad: 15 años, 10 meses
Puntos: 0
Pregunta proedimientos almacenados para mysql5

Disculpen, soy nuevo en el foro y algo conozco de MySql. Mi problema es que al crear procedimientos almacenados en MySql y depurarlo en Visual Studio con C#, el OdbcCommand me indica error de sintaxis en "mi_sp" en línea 1. Cambié el CommandType a Text y escribí ahí la sentencia sql y no marcó el error, pero tampoco almacenó lso datos, sino que una fila vacía y no sé qué hacer.

El código de "mis_sp" es:

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_ingresa_empresa`(IN rut_empresa VARCHAR(12), IN razon_social VARCHAR(100), IN giro VARCHAR(100), IN nacionalidad VARCHAR(30), IN direccion VARCHAR(100), IN comuna INT, IN telefono VARCHAR(15), IN fax VARCHAR(15), IN email VARCHAR(50), IN mutual INT, IN iso BOOL, IN organigrama BOOL, IN fecha_constitucion DATE)
BEGIN
INSERT INTO contratistas
VALUES(rut_empresa, razon_social, giro, nacionalidad, direccion, comuna, telefono, fax, email, iso, organigrama, fecha_constitucion);
END

El error lo marca el depurador en el objeto OdbcCommand.ExecuteNonQuery y se lo salta al catch,

try
{
ingresa.ExecuteNonQuery();
con.Desconectar();
return true;
}
catch
{
con.Desconectar();
return false;
}

Ojalá alguien me pueda ayudar. Estoy un tanto desesperado, ya que ese error me aparecerá en cada ingreso que yo desee hacer en otras tablas. Espero respuesta, Gracias de antemano.
  #2 (permalink)  
Antiguo 27/06/2008, 09:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: proedimientos almacenados para mysql5

Que te salte un error en el Odbc, no nos dice demasiado. El problema puede ser de muchos tipos sin saber cuál es el número de error devuelto ni el mensaje.
Antes que nada, te sugiero que si estás usando Visual Studio .Net, es mejor usar el conector específico de MySQL para .Net.
Por otr lado:
1. SI lo que quieres es que el SP se almacene en la base de datos (es decir, crearlo), la sentencia de creación debe ser enviada como una sentencia común de consulta.
2. Por precaución, elimina el segmento de "DEFINER=`root`@`localhost`", eso le pertenece solamente al root, y si el user que estás usando no es el root, puede generar un error.
3. Para ejecutarlo, la llamada es "sp_ingresa_empresa", luego debes indicar que el tipo de sentencia es "StoreProcedure" y no "Text", después debes ingresar las variables como parámetros ANTES de ejecutar la sentencia.
4. No te olvides que al declarar un parámetro se debe indicar si de entrada, salida o entrada-salida.
5. En el control de catch, no estás capturando el tipo de excepción que se produce, por lo que no sabes realmente qué está pasando. Trata de corregir eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 27/06/2008, 09:46
 
Fecha de Ingreso: junio-2008
Ubicación: Concepción
Mensajes: 24
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: proedimientos almacenados para mysql5

Hola y gracias por responder mi consulta y paso a explicar mejor el problema:

Los puntos del 1 al 4 están claros, la consulta fue enviada correctamente, el DEFINER solo aparece aquí en el foro porque copie el procedimiento almacenado ya creado (pero se creó con el CREATE PROCEDURE normal), se declararon bien las entradas y salidas y por último, la llamada de "mi_sp" era solo para consultar en el foro, pues es correcto lo de "sp_ingresa_empresa", y el tipo también es stored procedure.

Pero, como logro saber cual es el tipo de error exacto en el catch? No sé como manejarlo, pero en todo caso el error que marca en el ExecuteNonQuery() es el

{"ERROR [HY000] [MySQL][MyODBC 5.00.10][MySQL] 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sp_ingresa_empresa' at line 1"}

Entonces supongo que el error debe estar en el procedimiento almacenado. Bueno, gracias de nuevo por responder y ojalá puedas ayudarme. ¿Como hago eso de la excepción en el catch?
  #4 (permalink)  
Antiguo 27/06/2008, 10:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: proedimientos almacenados para mysql5

Viéndolo más detalladamene, y suponiendo que los campos entrantes son los mismos de la tabla, el tema estaría en que estás ingresando 13 valores, y están insertando 12 campos.
Si la tabla tiene esos mismos campos, entonces te está faltando insertar el campo "mutual".
Tal vez sea eso.

Respecto a la captura de las excepciones, te sugiero ver esta página, donde en los ejemplos tienes código sobre el caso: 25.1.4.5. Connector/ODBC Programming Examples
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 27/06/2008, 10:25
 
Fecha de Ingreso: junio-2008
Ubicación: Concepción
Mensajes: 24
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: proedimientos almacenados para mysql5

Gracias nuevamente por la respuesta, quizás sea más fácil conectándose a messenger, mi msn es [email protected].

Con respecto a mi problema, funcionó lo de la excepción, ahí se detalló el error pero me dí cuenta que es el mismo que ya he indicado y efectivamente tenía 12 valores en vez de los 13 correspondientes

Bueno, no sé qué hacer para que guarde pero seguiré intentandolo, aunque me estrese jaja Ojalá guarde al menos una fila luego para seguir haciendo pruebas con esto. Me tomó dos días completos encontrar un error en el login, espero que esto tampoco me tome mucho más. Gracias.
  #6 (permalink)  
Antiguo 27/06/2008, 11:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: proedimientos almacenados para mysql5

Si la tabla tiene 13 campos, entonces lo único que tienes que hacer es modificar el SP para incluir el campo que falta.
Allí la cosa es simplemente que tendrás que volver a generar el SP, previo eliminarlo (usar DROP PROCEDURE procedimiento).
No deberías tener problemas.
Una buena medida es programar la aplicación con una rutina de creación de la base con los procedimientos, triggers y demás, y también una rutina para su destrucción.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 27/06/2008, 12:45
 
Fecha de Ingreso: junio-2008
Ubicación: Concepción
Mensajes: 24
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: proedimientos almacenados para mysql5

No conozco qué son lso triggers pues nunca he trabajado con ellos, pero he leído que son bien útiles. Me volvió a pasar que me avisa que ingresa corectamente los datos, pero en la base de datos se ingresa un registro vacío. Bueno ya no sé que hacer. Empiezo a desesperarme por no ver resultados....

De todos modos no dejo de agradecer por tu ayuda.
  #8 (permalink)  
Antiguo 27/06/2008, 13:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: proedimientos almacenados para mysql5

Postea la estructura de la tabla. Puede que nos esté faltando algún detalle de analizar.
Y si puedes postea un ejemplo de datos que estás intentando cargar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 28/06/2008, 19:32
 
Fecha de Ingreso: junio-2008
Ubicación: Concepción
Mensajes: 24
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: proedimientos almacenados para mysql5

Voy a colocar la estructura completa de la tabla:
rut_empresa VARCHAR(12) clave,
razon_social VARCHAR(100),
giro VARCHAR(100),
nacionalidad VARCHAR(30),
direccion VARCHAR(100),
comuna INTEGER --> indice de otra tabla "comunas",
telefono VARCHAR(15),
fax VARCHAR(15),
email VARCHAR(50),
mutual INTEGER --> indice de otra tabla "mutuales",
iso BOOLEAN (o es BOOL?),
orgabigrama BOOLEAN,
fecha_constitucion DATE

Y el codigo de ingreso es el sgte:

con = new Conexion();
OdbcCommand ingresa = new OdbcCommand();

con.Conectar();

ingresa.CommandText = "sp_ingresa_empresa";
ingresa.Connection = con.Consultar();
ingresa.CommandType = CommandType.StoredProcedure;

ingresa.Parameters.Add(new OdbcParameter("rut_empresa", OdbcType.NVarChar, 12));
ingresa.Parameters.Add(new OdbcParameter("razon_social", OdbcType.NVarChar, 100));
ingresa.Parameters.Add(new OdbcParameter("giro", OdbcType.NVarChar, 100));
ingresa.Parameters.Add(new OdbcParameter("nacionalidad", OdbcType.NVarChar, 30));
ingresa.Parameters.Add(new OdbcParameter("direccion", OdbcType.NVarChar, 100));
ingresa.Parameters.Add(new OdbcParameter("comuna", OdbcType.Int));
ingresa.Parameters.Add(new OdbcParameter("telefono", OdbcType.NVarChar, 15));
ingresa.Parameters.Add(new OdbcParameter("fax", OdbcType.NVarChar, 15));
ingresa.Parameters.Add(new OdbcParameter("email", OdbcType.NVarChar, 50));
ingresa.Parameters.Add(new OdbcParameter("mutual", OdbcType.Int));
ingresa.Parameters.Add(new OdbcParameter("iso", OdbcType.TinyInt));
ingresa.Parameters.Add(new OdbcParameter("organigrama", OdbcType.TinyInt));
ingresa.Parameters.Add(new OdbcParameter("fecha_constitucion", OdbcType.Date));

ingresa.Parameters["rut_empresa"].Direction = ParameterDirection.Input;
ingresa.Parameters["razon_social"].Direction = ParameterDirection.Input;
ingresa.Parameters["giro"].Direction = ParameterDirection.Input;
ingresa.Parameters["nacionalidad"].Direction = ParameterDirection.Input;
ingresa.Parameters["direccion"].Direction = ParameterDirection.Input;
ingresa.Parameters["comuna"].Direction = ParameterDirection.Input;
ingresa.Parameters["telefono"].Direction = ParameterDirection.Input;
ingresa.Parameters["fax"].Direction = ParameterDirection.Input;
ingresa.Parameters["email"].Direction = ParameterDirection.Input;
ingresa.Parameters["mutual"].Direction = ParameterDirection.Input;
ingresa.Parameters["iso"].Direction = ParameterDirection.Input;
ingresa.Parameters["organigrama"].Direction = ParameterDirection.Input;
ingresa.Parameters["fecha_constitucion"].Direction = ParameterDirection.Input;

ingresa.Parameters["rut_empresa"].Value = _rut_empresa;
ingresa.Parameters["razon_social"].Value = _razon_social;
ingresa.Parameters["giro"].Value = _giro;
ingresa.Parameters["nacionalidad"].Value = _nacionalidad;
ingresa.Parameters["direccion"].Value = _direccion;
ingresa.Parameters["comuna"].Value = _comuna;
ingresa.Parameters["telefono"].Value = _telefono;
ingresa.Parameters["fax"].Value = _fax;
ingresa.Parameters["email"].Value = _email;
ingresa.Parameters["mutual"].Value = _mutual;
ingresa.Parameters["iso"].Value = _iso;
ingresa.Parameters["organigrama"].Value = _organigrama;
ingresa.Parameters["fecha_constitucion"].Value = _fecha_constitucion;

try
{
ingresa.ExecuteNonQuery();
con.Desconectar();
return true;
}
catch (OdbcException exc)
{
con.Desconectar();
return false;
}

Weno, ojalá ahi quede un poco más claro... Ojalá puedas ayudarme con eso :(. Gracias
  #10 (permalink)  
Antiguo 30/06/2008, 18:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: proedimientos almacenados para mysql5

Luego de ver el código posteado, no encuentro errores evidentes, por lo que si es el que estás ejecutando no debería generar problemas... salvo un detalle.
Suponiendo que ingresas todos los valores correctamente, y que el SP está correctamente escrito ahora (recordando que había que incluir el campo "mutual" en el INSERT), solamente puedo suponer una de varias posibilidades que generen error:
1) Los campos FOREIGN KEY hacen, obviamente referencia a campos clave de sendas tablas. ¿Te aseguraste que esos valores YA ESTÉN CARGADOS en sus tablas ANTES de insertar este registro? Es un error muy común al comenzar a trabajar con tablas referenciales. Las tablas primarias (las que no hacen referencia a otras) deben estar cargadas antes de las secundarias, o no te permitirá cargar la secundaria (las que tienen campos FK).

2) En las parametrizaciones es posible que el nombre del parámetro requiera el uso de "@" o "?" antes del nombre, aunque en el prototipo del SP no se encuentren escritos. Esto es, algo así:
Código:
ingresa.Parameters["?rut_empresa"].Direction = ParameterDirection.Input;
o bien:
Código:
ingresa.Parameters["@rut_empresa"].Direction = ParameterDirection.Input;
3) Los campos de tipo fecha, si se ingresan en forma de string, requieren un formato específico (aaaa-mm-dd), ya que es el formato que MySQL maneja. Si quieres que el ODBC se encargue de la conversión, la variable fecha_constitucion DEBE SER de tipo DateTime, o Date. También debes recordar que el ODBC por default no puede manejar fechas nulas (NULL), sino debe ser configurado para eso.

Un tip final sería: El C# en Visual Studio cuenta con una clase MsgBx y otra MessageBox. Generan una ventana de mensaje configurable que puedes usar para que te muestre la propiedad Message que estás capturando en la variable exc del catch. Usala para visualizar el mensaje que está devolviendo ODBC. Eso te dirá claramente cuál es el error.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 02/07/2008, 13:25
 
Fecha de Ingreso: junio-2008
Ubicación: Concepción
Mensajes: 24
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: proedimientos almacenados para mysql5

Gracias, me ha sido muy útil tu comentario, pero sigo con dudas...

Mejoré los detalles que marcaban errores pero sigo sin poder ingresar la fecha. Algunas personas me han dicho que cambie el formato justo en la declaracion

ingresa.Parameters["fecha_constitucion"].Value = _fecha_constitucion;

Me dicen algo de que es justo en el momento de pasar el valor del aprametro fecha_constitucion pero no se cual seran las palabras reservadas o la metodologia para hacer esto. En sql server esto funca sin ningun error.
  #12 (permalink)  
Antiguo 02/07/2008, 14:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: proedimientos almacenados para mysql5

El tema es que el valor de la variable _fecha_constitucion, si quieres cambiarlo en el momento de cargar el parámetro, debe responder al formato "aaaa-mm-dd HH:mm:ss".
MySQL es contextual, de modo que si le metes ese string y espera un DateTime, simplemente lo convertirá dentro de la base.
Ten en cuenta que las horas se deben ingresar como 00:00:00 a 23:59:59, o de lo contrario puede haber un error de interpretación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:04.