Visual Basic.NET - Uso DataSet

 
Vista:
Imágen de perfil de Cristian
Val: 97
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Uso DataSet

Publicado por Cristian (90 intervenciones) el 07/01/2019 19:59:19
Hola a todos..
Quisiera hacerles una consulta:
Donde usar o no el DataSet ? .. porque leo que muchos no lo usan y la verdad no me queda claro que es mujor y porque ??

Saludos y gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Uso DataSet

Publicado por Phil Rob (1554 intervenciones) el 07/01/2019 21:17:51
Hola,

Un DataSet es un coleccion de DataTable.
Ordinariamente, un DataTable es la copia de una table de la base de datos.
Pero, este puede ser también el resultado de una consulta en varias tablas.
El DataSet este puede la copia de la base de datos completa con sus ligaturas y restriccios.
Por ejemplo, un DB de personas con su localidad :
Hay una tabla TPers con los campos : NumeroPers, NombrePers, RefNumeroLocalidad
y una tabla TLoc con los campos : NumeroLocalidad, NombreLocalidad
Puedo :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Dim UnConexion As New OleDbConnection
Dim UnAdapter As OleDbDataAdapter
Dim LosDatos As New DataSet
Dim UnaTabla As DataTable
Dim NombreDB As String = "X:\BaseDatos\DBPersonas.mdb"
UnConexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NombreDB & ";"
 
' Lectura de TPers
 
UnAdapter = New OleDbDataAdapter("SELECT * FROM TPers", UnConexion)
 
UnaTabla = New DataTable
UnAdapter.Fill(UnaTabla)
LosDatos.Tables.Add(UnaTabla)  ' Tabla llamase TPers, o LosDatos.Tables(0)
 
' Lectura de TLoc
 
UnAdapter = New OleDbDataAdapter("SELECT * FROM TLoc", UnConexion)
 
UnaTabla = New DataTable
UnAdapter.Fill(UnaTabla)
LosDatos.Tables.Add(UnaTabla) ' Tabla llamase TLoc, o LosDatos.Tables(1)
 
' Lectura de TPers INNER JOIN TLoc
 
UnAdapter = New OleDbDataAdapter("SELECT NumeroPers, RefNumeroLocalidad, NombrePers, NombreLocalidad FROM (TLoc INNER JOIN TPers ON TLoc.NumeroLocalidad = TPers. RefNumeroLocalidad)"))
 
UnaTabla = New DataTable
UnAdapter.Fill(UnaTabla)
LosDatos.Tables.Add(UnaTabla) ' LosDatos.Tables(2) no llama 
LosDatos.Tables(2).TableName = "PersonasYLocalidad"
 
' Añade la ligatura si es necesario (es una protección contra errores del programador)
        Dim Domicilio As New DataRelation("Domicilio", _
          LosDatos.Tables ("TLoc").Columns("NumeroLocalidad "), _
          LosDatos.Tables ("PersonasYLocalidad").Columns("RefNumeroLocalidad"))
        LosDatos.Relations.Add(Domicilio)
Todavía hay muchas otras propiedades para el DataSet, DataTable de reinicio solo una tabla ...
Es posible administrar una base de datos completa en modo desconectado y actualizar la base de datos real cuando sea necesario (esto es útil cuando hay mucha consulta de datos en pantalla y poca modificación de la base de datos).

Salutas ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Cristian
Val: 97
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Uso DataSet

Publicado por Cristian (90 intervenciones) el 08/01/2019 03:14:35
Hola Phil Rob... Muchas gracias en responder. Muy clara tu explicación.

Mi pregunta es (y perdón mi ignorancia) si un dataset trabaja desconectado y hace una copia de la base de datos completa, como trabaja por ejemplo en una aplicación Cliente/servidor para no tener problemas en la actualización de registros, ya que cada terminal al hacer eso tiene una base en memoria y por ejemplo como controlar el stock de una tabla de artículos (por dar un ejemplo).

No se si soy claro en mi pregunta ?

Desde ya muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Uso DataSet

Publicado por Phil Rob (1554 intervenciones) el 08/01/2019 18:57:06
Hola,

Hay 2 formas de administrar las actualizaciones en modo desconectado.
Ya sea en cliente/servidor o local no cambia nada.

Manera 1 :
De vez en cuando, o cuando hemos hecho un trabajo "grande", examinamos todo el DataSet y hacemos las actualizaciones necesarias.
Cuidado :
Todo el trabajo se pierde si falla del hardware antes de las actualizaciones.
Las actualizaciones pueden rechazar muchos registros.

Maniera 2 (prefiero) :
Cuando hay una modificación que se debe registrar en la base de datos (INSERT, UPDATE y DELETE), el modo conectado se usa solo el tiempo necesario para esta trabajo.
Ventajas :
Si falla del hardware, solo un registro en afectado, el último.
En caso de rechazo de la actualización, solo un registro afectado, el último.

Herramientas de manera 1 (siguiendo mi código ayer, este extracto se limita a agregar localidades, debe completarse por modificar localidades, eliminar localidades, agregar personas, modificar personas y eliminar personas) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
' No se necesita actualización sino hubo cambio en Datos inicialmente leídos.
If LosDatos.GetChanges() Is Nothing Then
  MessageBox.Show("Ninguna modificacion")
Else
 
' La propiedad ContinueUpDateOnError del DataAdapter se establece en True para que la actualización no se interrumpa al primer rechazo.
  UnConexionTemporal.ContinueUpdateOnError = True
 
    Dim UnaCommand As OleDbCommand
    Dim Param As OleDbParameter
    Dim MisModifs As DataTable
    Dim RegistrasATratar As Integer
    Dim RegistrasTratadas As Integer
 
    ' Actualización: Agregar localidades (TLoc antes de TPers porque tabla "padre")
 
    ' Constitución de una tabla de datos que contiene todos los registros cuyo RowState es
    ' "Agregado". Este es el método GetChanges (DataRowState.Added) que llena este DataTable.
 
  MisModifs = LosDatos.Tables("TLoc").GetChanges(DataRowState.Added)
 
    ' Si el DataTable está vacío, no hay registro para agregar.
    ' De lo contrario, se almacena el número de líneas a procesar.
 
  If Not MisModifs Is Nothing Then
    RegistrasATratar = MisModifs.Rows.Count
 
    ' Escribiendo el comando add con ? para valores desconocidos.
 
    UnaCommand = New OleDbCommand("INSERT INTO TLoc (NumeroLocalidad, NombreLocalidad) VALUES (?, ?)", UnConexion)
 
    ' Un parámetro está definido por muchas propiedades, pero el único que se necesita aquí es el
    ' nombre del campo que representa. Un bucle For Each se puede utilizar cuando el orden y el
    ' número de incógnitas corresponden al orden y al número de columnas de la tabla de datos.
    ' Cada parámetro debe agregarse a la colección de parámetros del comando.
 
    For Each C As DataColumn In MisModifs.Columns
      Param = New OleDbParameter
      Param.SourceColumn = C.ColumnName
      UnaCommand.Parameters.Add(Param)
    Next
 
    ' Cuando se escribe el comando y se definen sus parámetros, debe asignarse a la propiedad
    ' apropiada (InsertCommand en este caso) del DataAdapter.
 
    UnConexionTemporal.InsertCommand = UnaCommand
 
    ' Todo lo que tiene que hacer es actualizar la actualización y guardar el número de líneas procesadas.
    RegistrasTratadas = UnConexionTemporal.Update(MisModifs)
 
    ' Tratamiento de los rechazos (Display)
 
    ' Si hay menos líneas tratadas de las que hay que tratar, es que hubo rechazos. 
    ' Tienes que pasar por el DataSet para encontrarlos y procesarlos.
 
    If RegistrasTratadas < RegistrasATratar Then
      For Each R As DataRow In MisModifs.Rows
 
    ' Cualquier línea que se actualice correctamente recibe el valor Sin cambios para su propiedad RowState.
 
        If R.RowState <> DataRowState.Unchanged Then
          MessageBox.Show(R.Item(0) & "   " & R.Item(1) & " no agregado")
        End If
      Next
    End If
    MisModifs.Reset()
  End If
 
    ' ... ... ... 

Herramientas de manera 2 (codigo par Agregar y Modificar TLoc) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
' Cuando tenemos que procesar físicamente un registro, tenemos que abrir una conexión y procesar el registro con su identificador
' Actualización: Agregar localidades : El programa ha leído o calculado el identificador necesario.
Private Sub AgregarLocalidade(ByVal Identificador As Integer)
    Dim UnaCommand As OleDbCommand = Nothing
    Dim UnConexionTemporal As New OleDbConnection
    UnConexionTemporal.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NombreDB & ";"
    UnConexionTemporal.Open()
    Dim R As DataRow
    R = LosDatos.Tables("TLoc").Select("NumeroLocalidad = '" & Identificador & "'")(0)
    UnaCommand = UnConexionTemporal.CreateCommand
    UnaCommand.CommandType = CommandType.Text
    UnaCommand.CommandText = "INSERT INTO TLoc (NumeroLocalidad, NombreLocalidad) " & "VALUES ('" & R.Item("NumeroLocalidad") & "', '" & R.Item("NombreLocalidad") & "' )"
    ' Puede haber rechazo ...
    Try
        ' En INSERT, el problema del identificador no encontrado no existe.. 
        UnaCommand.ExecuteNonQuery()
        ' Pero puede haber rechazo por otras razones.
    Catch Ex As Exception
        ' A tartar …
        MessageBox.Show(Ex.Message & " no agregado")
    Finally
        LosDatos.AcceptChanges()
    End Try
    UnConexionTemporal.Close()
End Sub
 
' Actualización: Modificar localidades : El programa conoce el identificador necesario.
Private Sub ModificarLocalidade(ByVal Identificador As Integer)
    Dim UnaCommand As OleDbCommand = Nothing
    Dim UnConexionTemporal As New OleDbConnection
    UnConexionTemporal.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NombreDB & ";"
    UnConexionTemporal.Open()
    Dim R As DataRow
    R = LosDatos.Tables("TLoc").Select("NumeroLocalidad = '" & Identificador & "'")(0)
    UnaCommand = UnConexionTemporal.CreateCommand
    UnaCommand.CommandType = CommandType.Text
    UnaCommand.CommandText = "UPDATE TLoc SET NombreLocalidad = '" & R.Item("NombreLocalidad") & "' WHERE (NumeroLocalidad = " & Identificador.ToString & ")"
    ' Puede haber rechazo ...
    Try
        If UnaCommand.ExecuteNonQuery() < 1 Then Throw New Exception("Identificador no encontrado")
    Catch Ex As Exception
        ' A tartar …
        MessageBox.Show(Ex.Message & "no modificar")
    Finally
        LosDatos.AcceptChanges()
    End Try
    UnConexionTemporal.Close()
End Sub

Saludos ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Cristian
Val: 97
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Uso DataSet

Publicado por Cristian (90 intervenciones) el 09/01/2019 12:15:06
Estimado Phil Rob...
Muchas gracias en responder y tan claro...

Saludos y otra vez gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 135
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Uso DataSet

Publicado por Agustin (39 intervenciones) el 11/01/2019 16:41:05
El DataSet no se usa mas capo. De hecho no debio haberse usado NUNCA.

En .NET Core ni siquiera está soportado.

Armate un modelo de datos estáticamente tipado y usa un ORM, o un Micro ORM si queres, pero por Dios no uses nunca mas un modelo stringly-typed.

El DataSet es basicamente un Dictionary<string, object> y eso apesta. Mal.

Encima de todo, tirar SQL como strings es tan 1999, en 2019 usamos LINQ to EF o LINQ to NH.
Si tenes que usar SQL obligatoriamente, usa una herramienta decente como Rezoom.SQL
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-2
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Uso DataSet

Publicado por Phil Rob (1554 intervenciones) el 11/01/2019 17:50:08
Palabras, palabras ... y estupidez: un DatSet es mucho más que un Dictionary y no tiene el mismo uso.
Además, no tirar demasiado rápido las tecnologías "antiguas"!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Cristian
Val: 97
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Uso DataSet

Publicado por Cristian (90 intervenciones) el 12/01/2019 16:17:14
Agustin .... Mira te agradezco los datos.. solo que no es necesario ser agresivo. Da tu opinión, punto de vista, tu consejo (que es valido e importante) pero no menosprecies.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar