VB.NET 2008 DataGridView не обновляет базу данных Visual Foxpro - PullRequest
0 голосов
/ 19 февраля 2011

Я использую VB.NET 2008 с DataGridView и взаимодействую с базой данных Visual Foxpro 6 с помощью драйвера vfpoledb.1.Когда я изменяю значение в поле описания, оно изменяется в DataGridView, но база данных никогда не обновляется.Нужно ли использовать код, чтобы изменения вступили в силу?

Вот код, который я использую:

Imports System.Data.OleDb

Public Class Form1
    Dim sConString As String = "Provider=vfpoledb.1;Data Source=C:\MyDatabase.dbc;Mode=3;"
    Dim con As OleDbConnection = New OleDbConnection(sConString)

    Private Function FetchData()

        con.Open()
        Dim ds As DataSet = New DataSet()
        Dim sSQL As String
        sSQL = "SELECT item_cd, item_desc FROM invent;"

        Dim cmd As OleDbCommand = New OleDbCommand(sSQL, con)
        Dim daInv As OleDbDataAdapter = New OleDbDataAdapter(cmd)
        Dim iRecCount As Integer
        iRecCount = daInv.Fill(ds, "invent")
        Me.DataGridView1.DataSource = ds.Tables("invent").DefaultView
    End Function

    Private Sub btnFetchData_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFetchData.Click
        Call FetchData()
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        con.Close()
        con = Nothing
    End Sub
End Class

Ответы [ 2 ]

0 голосов
/ 21 февраля 2011

Я нашел проблему с underyling и решил ее. К таблице VFP, к которой я обращаюсь, не определен первичный ключ. У него есть индексы, но они просто помечаются как «обычные» индексы (используя терминологию VFP).

Мне удалось использовать инструмент VFP vRunFox (Visual Run Fox) с веб-сайта Эда Лифа для изменения структуры таблицы. Мне пришлось использовать некоторые команды VFP, чтобы открыть окно Table Designer.

Мне также пришлось добавить некоторый код в событие FormClosing. Вот как выглядит мое событие FormClosing:

    Dim myBuilder As OleDbCommandBuilder = New OleDbCommandBuilder(daInv)
    myBuilder.GetUpdateCommand()
    daInv.UpdateCommand = myBuilder.GetUpdateCommand
    daInv.Update(ds.Tables("invent"))
    con.Close()
    con = Nothing
0 голосов
/ 19 февраля 2011

Этот код обновит таблицу и вернет изменения обратно в базу данных?Я так не думаю.Я попробовал тот же код с SQL Server 2005, и он не работает (у меня нет базы данных FoxPro).Поэтому я изменил код, и теперь он работает нормально.

Imports System.Data.OleDb

Public Class Form1
    Dim sConString As String = "Provider=vfpoledb.1;Data Source=C:\MyDatabase.dbc;Mode=3;"
    Dim con As OleDbConnection = New OleDbConnection(sConString)
    Dim daInv As OleDbDataAdapter
    Dim ds As DataSet = New DataSet()
    Private Sub FetchData()
        con.Open()
        Dim sSQL As String
        sSQL = "SELECT item_cd, item_desc FROM invent;"
        Dim cmd As OleDbCommand = New OleDbCommand(sSQL, con)
        daInv = New OleDbDataAdapter(cmd)
        Dim builder As New OleDbCommandBuilder(daInv)
        Dim iRecCount As Integer
        iRecCount = daInv.Fill(ds, "invent")
        Me.DataGridView1.DataSource = ds.Tables("invent").DefaultView
    End Sub

    Private Sub btnFetchData_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFetchData.Click
        Call FetchData()
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs)
        daInv.Update(ds.Tables("invent"))
        con.Close()
        con = Nothing
    End Sub
End Class

Надеюсь, что это работает:)

...