не удалось обновить сетку данных до dbf с помощью vb.net

Я новичок в программировании, но учусь и исследую много раз без какого-либо курса, поэтому я часто сталкивался с проблемой. Stack Overflow - это правильное место для решения моей проблемы.

На этот раз я обновил datagridview до файла .dbf для другого приложения, в котором используется база данных .dbf. Поэтому, пожалуйста, дайте мне лучшее решение для подготовки моего приложения.

Моя ошибка: "Динамическое создание SQL для UpdateCommand не поддерживается для SelectCommand, который не возвращает никакой информации о ключевом столбце".

‹ Мой код приведен ниже.

Dim con As New OleDbConnection
Dim ds As New DataSet
Dim dt As New DataTable
Dim da As New OleDbDataAdapter
Dim con1 As New OleDbConnection
Dim ds1 As New DataSet
Dim dt1 As New DataTable
Dim da1 As New OleDbDataAdapter
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       con.ConnectionString = "Provider=vfpoledb.1;Data Source=C:\dbf_folder;Collating Sequence=machine;"
    con.Open()
    ds.Tables.Add(dt)
    da = New OleDbDataAdapter("Select * from voterlist.dbf", con)
    da.Fill(dt)
    dbfdatagrid.DataSource = dt.DefaultView
    con.Close()
End Sub
Private Sub btnupdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnupdate.Click
    con1.Close()
    con1.ConnectionString = "Provider=vfpoledb.1;Data Source=C:\dbf_folder1;Collating Sequence=machine;"
    con1.Open()
    da1 = New OleDbDataAdapter("Select * from voterlist.dbf", con1)
    Dim cb = New OleDbCommandBuilder(da1)
    Dim primaryKey(1) As DataColumn
    primaryKey(1) = dt1.Columns("areaid")
    dt1.PrimaryKey = primaryKey
    da1.Fill(dt)
    dt.Merge(dt1)
    da1.Update(dt)
End Sub

person Mantu Swain    schedule 04.05.2018    source источник
comment
Есть ли в вашей таблице базы данных первичный ключ? В противном случае построитель команд не сможет однозначно идентифицировать запись для обновления или удаления. Кроме того, перед вызовом Fill установите для MissingSchemaAction адаптера данных значение AddWithKey.   -  person jmcilhinney    schedule 04.05.2018
comment
Кстати, подумайте, что на самом деле делает ключевое слово New. Это НЕ часть декларации. Он фактически создает новый объект. Почему вы создаете два адаптера данных при создании формы, затем еще один при извлечении данных и еще один при сохранении? Вам нужен только один адаптер данных, поэтому избавьтесь от одной из переменных и используйте ключевое слово New только один раз. Вам также не нужны два разных объекта соединения. Если вы собираетесь создавать объекты по мере их использования, не используйте переменные-члены.   -  person jmcilhinney    schedule 04.05.2018
comment
Почему вы также используете два разных DataSets? Все, что вам нужно, это один DataTable. Избавьтесь от всех DataSets и одного из DataTables. Создайте один DataTable и передайте его вызову Fill при запуске, а затем передайте тот же DataTable вызову Update при сохранении.   -  person jmcilhinney    schedule 04.05.2018


Ответы (1)


Вам нужно сообщить DataSet/DataTable, что такое первичный ключ:

' For dataset DS, assumed there is one table
Dim PrimaryKey(1) As DataColumn
PrimaryKey(1) = ds.Tables(0).Columns("ID")
DS.Tables(0).PrimaryKey = PrimaryKey

' For DataTable DT
Dim PrimaryKey(1) As DataColumn
PrimaryKey(1) = dt.Columns("ID")
dt.PrimaryKey = PrimaryKey

Обновить

Вы используете правильный драйвер, вам нужно создать уникальный столбец в DBF. Для этого выполните этот SQL в DBF перед его использованием:

ALTER TABLE voterlist ALTER COLUMN areaid INT UNIQUE (I assume an integer column, if character, areaid C(somenumber) where somenumber is the size of the column)

Это создаст индекс для столбца areaid, который будет (должен) использоваться в качестве первичного ключа.

person Prescott Chartier    schedule 04.05.2018
comment
ваш код работает в наборе данных, но пока я обновлю da.update(dt) после отображения ошибки. Спасибо - person Mantu Swain; 06.05.2018
comment
Хорошо ... прошло некоторое время с тех пор, как мне приходилось иметь дело с DBF, вам нужно определить первичный ключ в DBF. Знаете ли вы, как был создан DBF (Dbase, FoxPro и т. д.)? Я вижу, вы используете OLEDB. У вас есть доступ к продукту, который создал DBF? Если вы это сделаете, вы сможете определить ключ, не уничтожая данные. В противном случае вам придется создать DBF, в котором столбец идентификатора определен как первичный ключ, скопировать данные в новый DBF, а затем продолжить оттуда, предполагая, что это вариант. - person Prescott Chartier; 06.05.2018
comment
Большое спасибо за ответ, этот DBF создан FoxPro, и, пожалуйста, поделитесь со мной любым кодом, который был обновлен до dbf, после того, как я попробую - person Mantu Swain; 06.05.2018