Оказалось, проблема крылась в нехватке - SqlCommandBuilder(), который формирует SQL запросы на INSERT, DELETE, UPDATE, которые возвращают измененные данные DataSet обратно в базу данных.
Кроме того, DataAdapter.Update() ругается, если в загруженной в DataSet таблице отсутствует PrimaryKey, то есть идентификатор каждой строки таблицы.
- Код: Выделить всё
Imports System.Data.SqlClient
Public Class Form1
Dim SqlCon As New SqlConnection
Dim Command As New SqlCommand
Dim DA As New SqlDataAdapter
Dim DS As New DataSet
'Создаем SqlCommandBuilder для преобразования действия метода DA.Update() в SQL-команду, которая вносит соответствующие изменения в базу данных
Dim SqlBuilder As New SqlCommandBuilder(DA)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim strSQLServerName As String
Dim strPathToDB As String
'Изменяем значение строки на ИМЯ SQL SERVER к которому коннектимся
strSQLServerName = ".\SQLEXPRESS"
'Изменяем значение строки на полный путь к файлу базы данных, или используем Application.StartupPath с указанием файла если необхожимо открыть БД из папки приложения
strPathToDB = "C:\ExampleDB\ExampleDBFile.mdf"
SqlCon.ConnectionString = "Data Source=" & strSQLServerName & ";AttachDbFilename=" & strPathToDB & ";Integrated Security=True;Connect Timeout=30;User Instance=True"
'Открываем соединение, создаем запрос и заполняем DataAdapter и DataGridView данными таблицы "tblTable" (не забываем заменить имя таблицы на имя своей)
SqlCon.Open()
Command = SqlCon.CreateCommand
Command.CommandText = "SELECT * FROM tblTable"
DA.SelectCommand = Command
DA.Fill(DS, "tblTable")
DGView.DataSource = DS
DGView.DataMember = "tblTable"
End Sub
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
'Сохраяем измения, произведенные в DataGridView, в базу данных
DA.Update(DS, "tblTable")
End Sub
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
'Закрываем соединение и очищаем память
Command = Nothing
DA = Nothing
SqlCon.Close()
SqlCon.Dispose()
End
End Sub
End Class
Данный способ также в точности подходит к SQLite, только свойству ConnectionString присваевается применимое к SQLite значение.