[ Foro de C# ]
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.
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).
es memo de hecho segun se, como lo puedo accesar o algo asi, no entiendo muy bien ese manejo de bd.
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.
cnfox.ABM("update mgw10008 set mgw10008.COBSERVA01='" + cadena_originl + "' where mgw10008.ciddocum01=" + ciddocum + "");
esta es la orden.
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 + ""
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 + "";
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.
¡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.)