¿Cómo resolver el problema con la conexión de DataSet y Database en Visual Studio?
Estoy usando VB.NET con una base de datos de MS Access. Hay dos tablas con una relación entre sí.
Seguí lo siguiente para hacer una conexión de base de datos con el conjunto de datos y la fuente de enlace.
- En Fuente de datos, agregue una nueva fuente de datos
- Base de datos como tipo de fuente de datos
- Conjunto de datos como modelo de base de datos >>
- Conexión de datos elegida
- Debajo del objeto de la base de datos , seleccioné las tablas que deseaban para el propósito, como la tabla del cliente, también hice clic en las vistas
- Entonces termina.
- Ahora en Fuente de datos , seleccione Conjunto de datos, luego Tabla de clientes y arrastre los detalles y la vista de cuadrícula de datos al formulario y agregue botones para agregar, eliminar y actualizar los registros.
- Ahora ejecuta la aplicación.
Después de ejecutar la aplicación, pero no está viendo , agregando , actualizando y eliminando registros de / a la base de datos.
Código para agregar un registro a la base de datos
CustomersBindingSource.AddNew()
Código para actualizar un registro a la base de datos
CustomersBindingSource.EndEdit()
CustomersTableAdapter.Update(SrsbdbDataSet.Customers)
Código para eliminar un registro de la base de datos
CustomersBindingSource.RemoveCurrent()
También edité una cadena de conexión del archivo app.config para verificar el problema de la cadena de conexión, pero no es útil para el problema.
Por favor, avíseme dónde estoy haciendo mal.
Respuestas
ClientesBindingSource.AddNew ()
Esto no agrega un registro a la base de datos de acceso , agrega un registro a la lista de BindingSource, que (cuando se llama a EndEdit en BindingSource) se inserta en el YourDataSetName.Customers
DataTable como un nuevo DataRow, si tuviera que mirar todas las filas en YourDataSetName.Customers
verías que hay algunos (probablemente descargados de la base de datos, cuando iniciaste la aplicación) y tienen un DataRowState de Sin cambios, y luego está el nuevo que agregaste, con un DataRowState de Agregado
Todavía no se ha guardado nada en la base de datos. Estos datos están solo en la tabla de datos del conjunto de datos, que es una representación del lado del cliente de una tabla de base de datos. Es no una tabla de base de datos en sí misma. Sin duda, puede tener más o menos columnas y de diferentes tipos que la tabla de la base de datos. Es solo un almacenamiento temporal para los datos de la base de datos; usted descarga algunos, agrega algunos, cambia algunos, borra algunos, tal vez los guarda, etc. El DataRow relevante rastrea todas estas cosas que hace con sus datos y toma nota de si están agregados / modificados / eliminados / sin cambios, etc.
El TableAdapter es lo que empuja los datos hacia adelante y hacia atrás entre el DataTable y la base de datos
Llamas CustomersTableAdapter.Update()
cuando quieres guardar los datos en la base de datos. Nombrarlo Update
fue una mala idea en nombre de Microsoft, porque lleva a la gente a pensar que solo realiza consultas SQL UPDATE; si hubiera sido llamado SaveChanges
(y luego lo fue; EF usa SaveChanges) sería más claro. Solo tienes que recordar que uno - "Actualizar significa Guardar"
Entonces llama Update(datatable or dataset here)
y pasa su DataTable con todas sus filas modificadas / eliminadas / agregadas. El TableAdapter escanea todo el DataTable fila por fila mirando el DataRowState de cada fila. Si se agrega, TableAdapter llamará a su consulta INSERT SQL incorporada para guardar la fila. Si está modificado, se realiza SQL UPDATE. El estado eliminado provoca un SQL DELETE. Una fila de datos conoce los datos originales que se descargaron y los datos tal como están ahora; Esto a veces es vital para determinar si alguien más guardó esta fila en el tiempo que la tuvimos, para que podamos evitar sobrescribir sus cambios con los nuestros.
Al final de este proceso, los datos se han guardado, los estados de las filas se han establecido desde lo que eran hasta Sin cambios (debido a que los datos en la base de datos ahora son los mismos, los datos de las filas ya no necesitan guardarse).
Piense en esa parte del proceso como en el pequeño * que aparece en una pestaña del editor de texto, cuando edita el archivo: una fila de datos en el estado Agregado / Modificado / Eliminado tiene cambios no guardados que deben guardarse. Después de guardar, el estado vuelve a Sin cambios. ¿Mencioné que TableAdapter.Update debería haberse llamado Guardar?
En resumen , el proceso para guardar sería pedirle al control de edición que EndEdit()
luego pregunte a la EndEdit
fuente de enlace relevante ; esto asegura que tengamos una tabla de datos con todos los cambios confirmados y listos para guardar, y luego llamar al archivo tableadapter.Update
. Probablemente el control en el que estaba escribiendo el usuario confirmará sus ediciones cuando pierda el foco, ya que el usuario hace clic en el botón Guardar. Pero la llamada finalizada se asegura. Si no está seguro, cree un nuevo formulario, suelte un DataGridView en él fuera de la ventana Fuentes de datos y observe cómo está conectado el botón Guardar: desde la memoria, hace un Validate, un par de EndEdits y un UpdateAll (TableAdapterManager, administra TableAdapters, llama a Update en ellos en el orden correcto para asegurarse de que las filas principales se guarden antes que las filas secundarias)
Si comenzara a hacer más modificaciones, los estados de las filas cambiarían nuevamente, pero al igual que antes, lo que confirma los cambios en la base de datos es TableAdapter.Update () independientemente del tipo de cambio que haya realizado
Lo último a tener en cuenta aquí es que Access es una base de datos basada en archivos. Probablemente tenga su proyecto en, por ejemplo:
C:\projects\accesswhatever\
Y tenía su base de datos de acceso en, por ejemplo, su escritorio:
c:\users\you\desktop\access.mdb
Cuando conectó la base de datos de acceso a las cosas, VS presentó un diálogo largo y prolijo (que nadie lee;)) donde básicamente dice "pondré la base de datos en su proyecto, y la copiaré en el carpeta bin al compilar " .
Así que haces clic en Aceptar sin tener en cuenta las ramificaciones y construyes. Su disco ahora se ve así:
C:\users\you\desktop\access.mdb 'call it DB X
C:\projects\accesswhatever\access.mdb 'call it DB Y
C:\projects\accesswhatever\bin\debug\access.mdb 'call it DB Z
Su programa en ejecución guardará datos en el último, DB Z. Cada vez que compile (lo que podría suceder cada vez que haga clic en reproducir, si realiza cambios de código), Visual Studio eliminará Z y copiará Y a Z.
Ahora estás realmente confundido; su código dice que está ahorrando. Está buscando en DB X en su escritorio o DB Y en la base de su proyecto, y se pregunta dónde diablos están estos datos.
Está en DB Z, en la bin\debug
carpeta, junto a su app.exe; solo recuerde que cada vez que compila, VS borra su base de datos modificada y la reemplaza por una limpia de cuando. Si desea cambiar esto, haga clic en la base de datos en el explorador de soluciones y configure "Copiar en salida" de "Copiar siempre" a "Copiar si es más reciente". Ahora solo se copiará cada vez que realice un cambio de esquema, así que ... Agregue una nueva tabla y luego VS borrará su base de datos de prueba bien curada con una nueva ... Pero es más bien porque la nueva base de datos vacía al menos tiene eso tabla adicional sin la que se bloqueará su programa :)
Una alternativa es agregar el nuevo registro directamente en DataGridView y usar el nuevo OleDbDataAdapter para la conexión.
Elimine 'ClientesBindingSource.AddNew ()' y edite el registro en DataGridView:

Código en el botón 'Actualizar registro'.
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim connstring = "your connection string"
Dim adapter As OleDbDataAdapter = New OleDbDataAdapter("select * from Customer", connstring)
Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(adapter)
builder.QuotePrefix = "["
builder.QuoteSuffix = "]"
adapter.Update(CustomerDataSet.Customer)
End Sub