2016-10-27 4 views
0

Datagrid to dbf database update тип решения не мог найти нигде, если кто-нибудь решит эту проблему, ответьте мне. Ошибка - Динамическая генерация SQL для UpdateCommand не поддерживается с помощью SelectCommand, которая не возвращает никакой информации о столбцах. Мой кодDatagrid to dbf database using vb.net

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 area.dbf", con) 
    Dim cb = New OleDbCommandBuilder(da) 
    cb.QuotePrefix = "[" 
    cb.QuoteSuffix = "]" 
    da.Fill(dt) 
    dt.Merge(dt1) 
    dbfdatagrid.DataSource = dt.DefaultView 
    con.Close() 
End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    con1.Close() 
    con1.ConnectionString = "Provider=vfpoledb.1;Data Source=C:\dbf_folder1;Collating Sequence=machine;" 
    con1.Open() 
    da1 = New OleDbDataAdapter("Select * from area.dbf", con1) 
    Dim cb = New OleDbCommandBuilder(da1) 
    cb.QuotePrefix = "[" 
    cb.QuoteSuffix = "]" 
    Dim columns(5) As DataColumn 
    columns(4) = dt.Columns("NAME") 
    dt.PrimaryKey = columns 

    da1.Fill(dt1) 
    da1.Update(dt) 

ответ

0

Глядя на ваш код (я не знаю, VB, я больше # парне C), это не вопрос VFP, ваш код странно для любой базы данных.

Когда база данных является VFP, вы не должны использовать те QuotePrefix и QuoteSuffix. Это само по себе создает ошибку для команды обновления. Вы также можете написать команду обновления вручную.

Хотя я не знаю VB, не создает ли ваш код 6 элементов массива DataColumn и устанавливает только 5-е, оставив другие как NULL для первичного ключа? Что может быть целью? На самом деле вам не нужно указывать первичный ключ, если у вас нет действительного (тогда вам нужно написать команду обновления вручную - также это будет вашей проблемой, если вы можете создать правильную команду обновления для правильного обновления строк тебе нужно). Предположим, вы идете с хорошими принципами базы данных и имеете первичный ключ в своей таблице. Тогда вам не нужно писать обновление вручную, просто создайте CommandBuilder для него. то есть:

Sub Main() 
    Dim tbl As New DataTable() 

    Dim adapter = New OleDbDataAdapter("select * from Customer", "Provider=VFPOLEDB;Data Source=C:\PROGRAM FILES (X86)\MICROSOFT VISUAL FOXPRO 9\SAMPLES\data") 

    adapter.Fill(tbl) 

    Dim cb = New OleDbCommandBuilder(adapter) 
    adapter.UpdateCommand = cb.GetUpdateCommand() 

    Dim f = New Form() 
    Dim btn = New Button With { 
     .Top = 10, 
     .Text = "Update" 
    } 
    Dim dgv = New DataGridView With { 
     .Top = 50, 
     .DataSource = tbl 
    } 
    f.Controls.AddRange(New Control() {btn, dgv}) 
    AddHandler btn.Click, Sub(sender, args) 
           adapter.Update(tbl) 
          End Sub 

    f.Show() 
End Sub 

Если у вас есть таблица без первичного ключа, что строитель может извлечь из схемы, то вы можете так же написать свой собственный ручной код обновления. Предположим, что у вас есть таблица в c: \ Temp с именем NoPK (v1 i, v2 c (10)). Несмотря на то, что не имеет никакой информации индекса, и это бесплатный стол (строитель не может определить PK), мы знаем, что v1 наш ключ, и мы хотим обновить только v2, могли бы сделать это:

Sub Main() 
    Dim tbl As New DataTable() 

    Dim adapter = New OleDbDataAdapter("select * from NoPK", "Provider=VFPOLEDB;Data Source=c:\Temp") 

    adapter.Fill(tbl) 

    adapter.UpdateCommand = New OleDbCommand("update NoPK set v2=? where v1=?", adapter.SelectCommand.Connection) 
    adapter.UpdateCommand.Parameters.AddWithValue("p1", "").SourceColumn = "v2" 
    adapter.UpdateCommand.Parameters.AddWithValue("p2", 0).SourceColumn = "v1" 


    Dim f = New Form() 
    Dim btn = New Button With { 
     .Top = 10, 
     .Text = "Update" 
    } 
    Dim dgv = New DataGridView With { 
     .Top = 50, 
     .DataSource = tbl 
    } 
    f.Controls.AddRange(New Control() {btn, dgv}) 
    AddHandler btn.Click, Sub(sender, args) 
           adapter.Update(tbl) 
          End Sub 

    f.Show() 
End Sub 

Обратите внимание, что с OleDb , параметры должны быть добавлены в коллекцию в том же порядке со своим соответствующим заполнителем (?) в тексте команды (IOW вы не добавили бы p2 в первую очередь).