[ADO.NET] VB: problemas con DataSets y Adapters!

bLaKnI

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 VB).
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

Soltrac

Por curiosidad...

Si haces DataSet11.Tables(0).Rows(0).Delete te la borra? En el dataset no, en la tabla de la bb.dd.

bLaKnI

Guaaaaaaau!
Ya esta!

Muchísimas gracias hermano! Lo tuyo ha sido una revelación!
Sabia de la existencia de este método, pero no me habia ni siquiera puesto a probarlo porque no encontraba la forma de encontrar el index de la row, para indicarselo a la funcion delete.

Al final, buscando un poquito, he recordado el magnifico "indexOf", y aqui si que ha bajado el cielo a la tierra. Resulta que con el metodo delete manual SI QUE ACTUALIZA y al hacer update, no varian las filas (osea, que se mantienen en numero despues del borrado, no vuelve al numero original antes de borrar)!
Otra tema es que si haces un commit antes de hacer el update, es cuando se vuelven las filas mal, osea, que al final el trozo de codigo queda tal que así:

dlRow = dataset.tables(0).rows.find(primarykey)
dim rwPos as iteger = dataset.tables(0).rows.indexOf(dlRow)

dataset.tables(0).rows(rwPos).delete()

oledbAdapter.update(dataset)
dataset.acceptChanges() (aqui tiene que ir el accept [commit], pues si se pone antes del update [llamada de querys update/delete/insert] la lias, porque el dataset deja el estado original y hace rollback de la operativa de eliminación... no se porque :S)

E voilà! ^^

Sorprendentemente, en este caso SI que acutalizaba, es decir, que SI borraba filas, mientras que con la otra manera no... Impresionante no? xD
Pa cagarse en el ADO! xDDD

Pues nada! Muchisimas gracias de nuevo Soltrac! Toda una buena ayuda! :)

I

Puedes probar de esta forma, si encuentra la row la pasara por referencia a delRw, asi podras meterle el .delete

Dim delRw As DataRow
delRw = DataSet11.Tables(0).Rows.Find(it.SubItems(8).Text)
if not delRw is nothing then
delRw.delete()
end if
...

PD: no estoy seguro de que funcione, pero por probar que no quede jeje

Usuarios habituales