Que hay?
Vereis:
- En el trabajo hemos perdido el servidor que tenia todo montado (un servidor apache, tomcat, webapps montados, mysql, blablalba...). El motivo de la perdida, es que una empresa externa se encarga ahora del mantenimiento informatico ("se encarga"...). Dado lo acostumbrados que estaban en la empresa a trabajar en determinadas aplicaciones que se fueron creando "il gusto", al desaparecer dicho "server" y colocar un peazo maquinon con su mirror y un Cluster de la repoya, ahora todo ha cambiado. Se han cambiado las intranets y aplicaciones.
El tema es, que algunas aplicaciones son muy concretas de la tienda en cuestion, y las queriamos para nosotros. Otras tiendas no las tienen.
Dado que ya no puedo montar una maquina y prepararla a modo server (deberia colocarla en dominio, y no quiero fabricar nada para que luego vengan otros y me porculen), queremos desarrollar algunas de las aplicaciones que ya teniamos pero a nivel "local".
Así pues, estoy creando una aplic, con una BD en Access, ya que tampoco necesitan mas. El sistema es facil, el exe y la mdb se encuentran en el mismo pc, y la gente accede cooperativamente a la aplic por medio de "accesos directos al escritorio" xDDDDDD
Yendo al tema en si mismo, el problema lo tengo ahora cuando intento borrar rows de un dataset.
Cuando lo inizializo, con la string de conex correcta, generando el dataset desde el adapter con las querys de update y delete tambien incluidas junto con las de select y insert, todo va ok.
Las select van perfectas y con un dbreader, puedo perfectamente recoger el resultset y llenar por ejemplo, un datagrid.
El insert, tambien va de puta madre.
Creo una row, la relleno con lo que debe ser, se la añado al dataset y finalmente hago un adapter.update y un dataset.acceptChanges.
Entonces tenemos que el insert y select van perfectamente.
En el proceso de borrar, uso el find del dataset que busca por promarykey. Me devuelve la fila que quiero borrar, y uso un .Tables(0).remove(row) y cuando debugo, veo como el numero de filas del dataset EFECTIVAMENTE ha disminuido. Hasta aquí OK. Pero ahora viene lo bueno: cuando hago un adapter.update(), MAGICAMENTE EN EL DATASET VUELVEN A APARECER LAS MISMAS FILAS QUE ANTES DE BORRAR! Es decir, si tenia 51, borro una, lo veo en el debugg y al hacer el .Update(), de nuevo 51 rows...
Podriais decirme: eso es que no tienes correcta la query de delete o la de update.
Bien, pues me meto en el adapter, en el gestionador de querys en propierties, reviso la query de delete, HAGO UNA PRUEBA MANUAL introduciendo yo los parametros (sustituyendo los ? cuando hasces un executeQuery) y que sucede? QUE FUNCIONA! Osea, que lo cierro todo, me dice "X rows affected", me voy al mdb (desde acces, y efectivamente ha borrado o updated la fila que he gestionado desde V.
Entonces, si sabiendo que las querys del Adapter son correctas y que el Insert SI FUNCIONA (es decir, me deja la nueva fila en el mdb y en el dataset para siempre), porque cojones no puedo borrar? Porque el delete no funciona!?
Me estoy volviendo muy loco...
Si alguien puede hecharme un cable plis... Necesito borrar!!!
Como detalle añadir, que no uso ningun campo con "field", es decir, no gestiono visiblemente o en tiempo real los datos de la db. Osea, que no es el tipico formulario con campos para clientes y blabla... Así que hay que trabajar con querys o con añadidos en el dataset y post updates.
Por cierto! me aparece otra vez la misma informacion cuando vuelvo ha hacer un adapter.Fill(dataset)!
Helpz me plizzzz....
Trozito de codigo para el Insert (para flipar lo bien que va el ADO... dios que mierdota!)
Dim rw As DataRow
rw = DataSet11.Tables(0).NewRow
Aqui hay un trozito de relleno de variables, no importa lo paso.
rw.Item("Nombre") = nombre
...... trozo de relleno de la row, tampoco importa.
Aqui viene el temilla:
'se prepara la sentencia de INSERT.
Try
DataSet11.Tables(0).Rows.Add(rw)
OleDbDataAdapter1.Update(DataSet11)
DataSet11.AcceptChanges()
Call updateListViewWithDB()
Call limpiarForm()
Catch ex As Exception
Console.WriteLine("Error. No ha sido posible añadir la información a la base de datos." + vbCrLf + ex.Message)
End Try
Esto ultimo que veis, funciona perfectamente. Esta funcion que se llama updateListViewWithDB, basicamente es una rellamada a una qury Select * from Tambla, blabla... y actualizo con un for de maximo numero de resultados el listview. Normal, ok?
Pero ahora os enseño el trozo de borrar:
Try
Dim delRw As DataRow
delRw = DataSet11.Tables(0).Rows.Find(it.SubItems(8).Text) //en it.subitems blbla, tengo la primarykey.
DataSet11.Tables(0).Rows.Remove(delRw)
DataSet11.AcceptChanges()
Dim polla As Integer = OleDbDataAdapter1.Update(DataSet11)
MsgBox(polla.ToString) ESTO DA CERO! Osea, QUE NO ACTUALIZA NINGUN ROW! AQUI ES DONDE ESTA EL PUTO PROBLEMA!!!!!!
Call updateListViewWithDB()
Catch ex As Exception
Console.WriteLine("Error. No ha sido posible obtener información de la base de datos." + vbCrLf + ex.Message)
End Try
y es rarisimo, porque como he dicho, en el OleDbadapter, si lo hago manualmente FUNCIONA! Luego las querys de update y delete estan bien! Luego al hacer el adapter.Update(dataset) DEBERIA IR! Y NO VA!!!
MIERDA MIERDA MIERDA! xDDD