在vb.NeT中更新数据库时出错

在vb.NeT中更新数据库时出错,vb.net,datagridview,Vb.net,Datagridview,我正在使用vb.NET和Database AS DATABASE1.SDF创建一个数据库更新程序。我想动态更新DATAGridview中的数据库。为了更新SQL命令,我使用了SQLCECOMMANDBUILDER,但是我在那里得到了一个错误:“DataAdapter.SelectCommand属性需要初始化。” 这是我的密码: Imports System.Data.OleDb Imports System.Data Imports System.Data.SqlServerCe Public

我正在使用vb.NET和Database AS DATABASE1.SDF创建一个数据库更新程序。我想动态更新DATAGridview中的数据库。为了更新SQL命令,我使用了SQLCECOMMANDBUILDER,但是我在那里得到了一个错误:“DataAdapter.SelectCommand属性需要初始化。” 这是我的密码:

Imports System.Data.OleDb
Imports System.Data
Imports System.Data.SqlServerCe
Public Class Admin
    Dim update As New SqlCeDataAdapter
    ' sql connection strings 
    Dim SQLCon As String = "Data Source=Database1.sdf"

    Dim sqlstr As String = "Select * from Base_Plate "
    Dim sqlstr1 As String = "Select * from Alloy "
    Dim sqlstr2 As String = "Select * from Bead_Factor "
    Dim sqlstr3 As String = "Select * from Difficulty_Factor "
    Dim sqlstr4 As String = "Select * from Price_Factor "

    ' sql variable of base
    Dim adapter As New SqlCeDataAdapter(sqlstr, SQLCon)
    Dim ds As New DataSet()

    ' sql variable of alloy
    Dim adapter1 As New SqlCeDataAdapter(sqlstr1, SQLCon)
    Dim ds1 As New DataSet()

    ' sql  variable of bead
    Dim adapter2 As New SqlCeDataAdapter(sqlstr2, SQLCon)
    Dim ds2 As New DataSet()

    'sql variable of difficulty
    Dim adapter3 As New SqlCeDataAdapter(sqlstr3, SQLCon)
    Dim ds3 As New DataSet()

    'sql variable of price
    Dim adapter4 As New SqlCeDataAdapter(sqlstr4, SQLCon)
    Dim ds4 As New DataSet()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        update.Update(ds)
        LoadGrid()

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Me.Visible = False
        LoginForm1.Visible = True
    End Sub

    Private Sub Admin_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        LoadGrid()
        Button2.Enabled = False

    End Sub
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    End Sub
    Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        Button2.Enabled = True
    End Sub

    Private Sub LoadGrid()


        '************** base datagrid ********************

        adapter.Fill(ds, "Base_Plate")
        DataGridView1.DataSource = ds.Tables(0)
        DataGridView1.Rows(0).Selected = True

        '***************** alloy datagrid *********************

        adapter1.Fill(ds1, "Alloy")
        DataGridView2.DataSource = ds1.Tables(0)
        DataGridView2.Rows(0).Selected = True

        '***************** bead datagrid *********************

        adapter2.Fill(ds2, "Bead_Factor")
        DataGridView3.DataSource = ds2.Tables(0)
        DataGridView3.Rows(0).Selected = True

        '***************** difficulty datagrid *********************

        adapter3.Fill(ds3, "Difficulty_Factor")
        DataGridView4.DataSource = ds3.Tables(0)
        DataGridView4.Rows(0).Selected = True

        '***************** Price datagrid *********************

        adapter4.Fill(ds4, "Price_Factor")
        DataGridView5.DataSource = ds4.Tables(0)
        DataGridView5.Rows(0).Selected = True

        update.UpdateCommand = New SqlServerCe.SqlCeCommandBuilder(update).GetUpdateCommand
    End Sub 

你做错了。首先,正如错误消息所述,您尚未设置要传递给command builder构造函数的数据适配器的
SelectCommand
。以下是代码中的相关片段:

Dim update As New SqlCeDataAdapter

update.UpdateCommand = New SqlServerCe.SqlCeCommandBuilder(update).GetUpdateCommand
如您所见,您没有提供SQL
SELECT
语句,那么命令生成器应该如何知道如何构建其他命令呢

其次,即使适配器配置正确,这也是错误的:

update.UpdateCommand = New SqlServerCe.SqlCeCommandBuilder(update).GetUpdateCommand
您不必从命令生成器获取命令并将其指定给数据适配器的属性。这样做的唯一原因是如果您想编辑它们,而您不想编辑它们。创建命令生成器的正确方法是在创建数据适配器后立即在线,例如

Dim myDataAdapter As New SqlCeDataAdapter(query, myConnection)
Dim myCommandBuilder As New SqlCeCommandBuilder(myDataAdapter)

就这样。您只创建了一次,然后当您调用
Update
时,数据适配器就会工作。每次保存时都不会创建一个新的,也不会获取和分配命令。

请不要用大写字母书写——首先,它很难阅读,其次,它被认为是对观众大喊大叫,这是非常粗鲁和无礼的。谢谢。我已经解决了这个问题。但是谢谢你的解决方案。对不起,我的帽子坏了。