[ Foro de C# ]

insertar a foxpro

10-Oct-2014 01:04
Alex carde nanasks
8 Respuestas

Buenas tengo el siguiente problema o duda, necesito actualizar un campo de una tabla de foxpro el problema es que son como 700 caracteres y solo puedo ingresar 255 si no me envia el siguiente error "ERROR[42000] [mICROSOFT][ODBC visual fox pro driver] command contains unrecognized phrase/keyword" asi es todo eso, el campo obviamente soporta los 700 caracteres ya que al ingresarlo desde un update con un acces vinculado no tiene problema,alguna idea??
Nota:hice conexion por odbc y oledb y ninguna me funciono.
o si saben como funciona el concat para foxpro, porque no lo he logrado, de antemano gracias.


10-Oct-2014 01:19
Nacho Cabanes (+83)

Según la versión de FoxPro  y el tipo de campo, no podrás evitarlo. En general, en un fichero DBF como los que usa FoxPro, los campos de texto están limitados a 255 caracteres. Para mayor tamaño, tendrá que ser un campo Memo (que se guardan en otro fichero, por lo que su acceso es ligeramente más lento).


10-Oct-2014 01:20
Alex carde nanasks

es memo de hecho segun se, como lo puedo accesar o algo asi, no entiendo muy bien ese manejo de bd.


11-Oct-2014 12:14
Nacho Cabanes (+83)

Si ya es MEMO, el problema no es del tipo de datos, sino alguna otra cosa que estás haciendo. De hecho, mira con detalle el mensaje de error que mencionas: "command contains unrecognized phrase/keyword"  

Pon la orden SQL que estás usando, por si se ve algo extraño en ella.


13-Oct-2014 18:36
Alex carde nanasks



 cnfox.ABM("update mgw10008  set mgw10008.COBSERVA01='" + cadena_originl + "' where mgw10008.ciddocum01=" + ciddocum + ""); 


esta es la orden.


13-Oct-2014 19:04
Nacho Cabanes (+83)

Es una consulta muy normal, que no debería fallar, salvo que "ciddocum" no sea numérico (no tiene comillas alrededor) o que "cadena_originl" contenga comillas, porque ambas cosas podrían provocar una consulta SQL no válida.

Si no es así, los drivers que estás usando (ODBC) no te están permitiendo guardar más de 255 caracteres por campo, ni siquiera en los MEMO. ¿Seguro que has obtenido exactamente el mismo error usando OleDB?

Otro posible problema es que Visual Foxpro como tal no permita cadenas de más de 255 caracteres y lo tengas que hacer usando varias subcadenas de longitud 255 o menos:


update mgw10008  set mgw10008.COBSERVA01='" + subcadena1 + subcadena2 + subcadena3 + "' where mgw10008.ciddocum01=" + ciddocum + ""


o bien forzando una conversión de tipos, para que el propio dato sea MEMO en vez de cadena de texto, algo como


update mgw10008  set mgw10008.COBSERVA01='" + CAST (cadena_original AS M) + "' where mgw10008.ciddocum01=" + ciddocum + ""


También podrías (incómodo pero factible) tomar el MEMO desde un fichero, en vez de desde una cadena de texto:


update mgw10008  set mgw10008.COBSERVA01='" + filetostr('ficheroMemo.txt')+ "' where mgw10008.ciddocum01=" + ciddocum + ""




13-Oct-2014 19:54
Alex carde nanasks

ya habia intentado lo de las subcadenas pero sin exito!!(amenos que vaya en un ciclo for cada update, que no creo).


 string uno = cadena_originl.Substring(0, 254);//aqui hago mi armado sin for para pruebas
 string dos = cadena_originl.Substring(254,46);


incluso cambie la forma a  


OleDbCommand cmd = conn.CreateCommand();
         {
            cmd.CommandText = "update mgw10008  set mgw10008.COBSERVA01='"+uno +"' where mgw10008.ciddocum01=" + ciddocum + "";
            cmd.ExecuteNonQuery();
//no agrego la variable 2 porque me envia error.

}


sigo igual si son mas de 255 caracteres no actualiza.:(
con el cast me envia error de sintaxis


cmd.CommandText = "update mgw10008  set mgw10008.COBSERVA01=CAST(" + cadena_originl + ")AS M where mgw10008.ciddocum01=" + ciddocum + "";


 


14-Oct-2014 00:07
Alex carde nanasks

ya lo pude solucionar era algo tan simple, pero en fin les dejo la solución por si a alguien le sirve.
hay que concatenar en cadenas con limite a 255, y hay que poner un signo de '+' entre comilla simple como parte del texto para que Fox lo reconosca:


retorna=uno+" '+' "+ dos; // esto regresa mi metodo una vez que lo armo.


quedando asi al final:


 int regresa=(fox.ABM("update mgw10008  set mgw10008.COBSERVA01='" + regresame + "' where mgw10008.ciddocum01=" + ciddocum + "")); 


Gracias Nacho Cabanes me ayudaste a llegar a la solucion.


14-Oct-2014 10:57
Nacho Cabanes (+83)

¡Enhorabuena! Me alegro de que lo consiguieras. Por cierto, el CAST te daba error de sintaxis porque los paréntesis los habías colocado mal.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)