linq no me graba los datos

12/11/2009 - 17:16 por damian | Informe spam
Hola, antes que nada les comento que soy nuevo en este foro. Hace un
tiempo que estoy empezando con C# y hace un par de dias me beje el C#
Express 2008 y lo primero que quise probar fue Linq to Sql. Siguiendo
los tutoriales que pude encontrar por la web trate de hacer una pruba.
Cree una base de datos en sql expres 2008 y le agregue una tabla
"clientes". Cree el objeto de linq y un formulario para poder
interactuar.
Lo primero que hice fue llenar unos registro a mano desde el
explorador de base de datos.
cree las consultas con los objetos de linq y anduvo bien.
Pero cuando quise insertar un nuevo registro ahi me trabe. No me sale
ningun error. Aparentemente funciona, pero cuando voy al explorador de
base de datos el registro que cree no existe.
Trate de hacer una prueba, tratando de actualizar un registro
existente y nuevamente no me graba los cambios.
¿Que puede estar pasando? algo debo tener mal configurado pero no
puedo darme cuenta.
Aca les dejo el codigo:

DataClasses1DataContext dc = new DataClasses1DataContext
();

clientes cliente = new clientes();
cliente.nombre = "Juan Perez";
cliente.localidad = "Buenos Aires";
cliente.direccion = "Pampa y la via";
cliente.cuit = "123456789";
cliente.dni = "1234567989";
dc.clientes.InsertOnSubmit(cliente);
try
{
dc.SubmitChanges
(System.Data.Linq.ConflictMode.FailOnFirstConflict);
MessageBox.Show(cliente.nombre);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

Aclaro que la clase cliente tiene un campo id que es autoincremental y
lo tengo como primary key

Desde ya gracias por sus aportes

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
12/11/2009 - 17:38 | Informe spam
"damian" wrote in message
news:
[...] Pero cuando quise insertar un nuevo registro ahi me trabe. No me
sale
ningun error. Aparentemente funciona, pero cuando voy al explorador de
base de datos el registro que cree no existe.



El código de ejemplo que acompañas aparentemente parece correcto.
Cuando dices que compruebas si el registro te lo ha insertado, ¿estás
seguro de que lo miras en la base de datos correcta? Si estás usando el Sql
Server Express en modo "instancia de usuario" con la configuración
predeterminada, el comportamiento por defecto del Visual Studio consiste en
que te crea un .mdf en el directorio del proyecto, y cuando lo ejecutas
desde el debugger te saca una copia del .mdf al directorio Debug y ejecuta
el código contra esa copia. Lógicamente, te inserta en ella el nuevo
registro, pero si vas y examinas el .mdf original que creaste en el
directorio del proyecto, evidentemente no aparece ese registro.
Respuesta Responder a este mensaje
#2 damian
12/11/2009 - 19:32 | Informe spam
Alberto, Gracias por tu respuesta. Me fije en lo que me dijiste pero
no es eso.
Hice otra prueba, agregue unos textbox y puse este codigo

DataClasses1DataContext dc = new DataClasses1DataContext();

clientes cliente = new clientes();
cliente.nombre = textBox2.Text;
cliente.localidad = textBox3.Text;
cliente.direccion = textBox4.Text;
cliente.cuit = "123456789";
cliente.dni = "1234567989";
dc.clientes.InsertOnSubmit(cliente);
try
{
dc.SubmitChanges
(System.Data.Linq.ConflictMode.FailOnFirstConflict);
MessageBox.Show(cliente.nombre);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

Y luego agregue otro boton con este codigo:

DataClasses1DataContext dc = new DataClasses1DataContext();
var lqcli = from cliente in dc.clientes
where cliente.nombre==textBox2.Text
select cliente;

clientes oCli=lqcli.First();
textBox1.Text = oCli.id.ToString();
textBox2.Text = oCli.nombre;
textBox3.Text = oCli.direccion;

Bueno, lo que hice fue ejecutar el form y agregar 5 clientes
Luego, si yo pongo algo en el textbox2 que coincide con un
cliente.nombre me trae el registro. Hasta ahi parece que esta bien
Pero cuando cierro el form y luego lo vuelvo a ejecutar, me da error
por que no encuentra nada
Y me fijo en la bd y esta vacia!.
Es como si el metodo SubmitChanges del DataContext no ejecutara los
insert.
Gracias por la ayuda
Respuesta Responder a este mensaje
#3 Alberto Poblacion
13/11/2009 - 00:53 | Informe spam
"damian" wrote in message
news:
Alberto, Gracias por tu respuesta. Me fije en lo que me dijiste pero
no es eso.
[...]
Bueno, lo que hice fue ejecutar el form y agregar 5 clientes
Luego, si yo pongo algo en el textbox2 que coincide con un
cliente.nombre me trae el registro. Hasta ahi parece que esta bien
Pero cuando cierro el form y luego lo vuelvo a ejecutar, me da error
por que no encuentra nada
Y me fijo en la bd y esta vacia!.
Es como si el metodo SubmitChanges del DataContext no ejecutara los
insert.
Gracias por la ayuda



Pues precisamente, con estos síntomas que indicas, sigue teniendo todo el
aspecto de que ocurre lo que yo te decía:

La primera vez insertas 5 registros y se añaden correctamente a la base
de datos (¡la copia local de la base de datos!). Después los lees y los
encuentra. Fíjate en que los lees con un nuevo datacontext, así que los lees
de la base de datos, no de memoria, y por lo tanto se deduce que el
SubmitChanges sí que los ha grabado.

Después cierras el programa y lo vuelves a abrir. Al volverlo a abrir, se
copia de nuevo el .mdf vacío encima de la copia local que tenía los 5
registros. Por lo tanto se borran los registros, y al volver a hacer la
búsqueda te da error.
Respuesta Responder a este mensaje
#4 damian
13/11/2009 - 13:06 | Informe spam
Alberto, muchas gracias. Efectivamente era lo que vos me decias. Como
puedo solucionar esto para no tener que andar copiando la base de
datos a mano?
Respuesta Responder a este mensaje
#5 Alberto Poblacion
13/11/2009 - 13:36 | Informe spam
"damian" wrote in message
news:
Alberto, muchas gracias. Efectivamente era lo que vos me decias. Como
puedo solucionar esto para no tener que andar copiando la base de
datos a mano?




Si pinchas sobre el archivo .mdf en el Explorador de Soluciones de Visual
Studio y examinas las Propiedades, verás que hay una de ellas que dice "Copy
Always". Lo puedes cambiar por "Copy if newer", y así solo te copia el
original sobre la versión del directorio del ejecutable en caso de que hagas
cambios sobre el original.

Otra opción es modificar la cadena de conexión, y cambiar la ruta del
fichero para que apunte de forma fija a la versión que te interese, que la
puedes copiar al directorio que te convenga. O bien montar la base de datos
de forma fija en el Sql Server Express, y cambiar la cadena de conexión para
que funcione contra esa base de datos en lugar de usar el modo "User
Instance".
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida