Database VB.NET:将数据插入连接到MS Access数据库的DataGridView

Database VB.NET:将数据插入连接到MS Access数据库的DataGridView,database,vb.net,ms-access,datagridview,visual-studio-2019,Database,Vb.net,Ms Access,Datagridview,Visual Studio 2019,我正在创建一个系统,用户可以选择他需要的书籍。在我开发我的系统时,创建管理模块对系统同样重要 这里我有自己的问题,我想从已经连接到数据库MS Access的DataGridView中插入数据。它不会给我错误,但当我运行它并测试它时,似乎程序中没有写入处理。错误是 System.InvalidOperationException:“当控件为数据绑定时,无法以编程方式将行添加到DataGridView的行集合。” 我真正想要的是,DataGridView可以与连接到的MS Access同时更新 Im

我正在创建一个系统,用户可以选择他需要的书籍。在我开发我的系统时,创建管理模块对系统同样重要

这里我有自己的问题,我想从已经连接到数据库MS Access的DataGridView中插入数据。它不会给我错误,但当我运行它并测试它时,似乎程序中没有写入处理。错误是

System.InvalidOperationException:“当控件为数据绑定时,无法以编程方式将行添加到DataGridView的行集合。”

我真正想要的是,DataGridView可以与连接到的MS Access同时更新

Imports System.Data.OleDb

Public Class Register
    Dim provider As String
    Dim datafile As String
    Dim connString As String
    Dim myConnection As OleDbConnection = New OleDbConnection
    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        If ComboBox1.Text.Equals("TVL12") Then
            TVL12.Show()
        End If
    End Sub

    Private Sub addBtn_Click(sender As Object, e As EventArgs) Handles addBtn.Click
        Admin.table.Rows.Add(booknameReg.Text, authorReg.Text, publisherReg.Text, subjectcodeReg.Text, priceReg.Text, discountamountReg.Text)
        'TVL12.BookListTVL.Rows.Add(booknameReg.Text, authorReg.Text, publisherReg.Text, subjectcodeReg.Text, priceReg.Text, discountamountReg.Text)'
        provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
        datafile = "C:\Users\acjfc\OneDrive\Desktop\thesis\DATABASE\BookLists.accdb"
        connString = provider & datafile
        myConnection.ConnectionString = connString
        myConnection.Open()
        Dim str As String
        str = "Insert into TVL12([Book Name],[Author],[Publisher],[Subject Code],[Price],[DiscountAmount]) Values (?,?,?,?,?,?)"
        Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
        cmd.Parameters.Add(New OleDbParameter("Book Name", CType(booknameReg.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Author", CType(authorReg.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Publisher", CType(publisherReg.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Subject Code", CType(subjectcodeReg.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Price", CType(priceReg.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("DiscountAmount", CType(discountamountReg.Text, String)))
        Try
            cmd.ExecuteNonQuery()
            cmd.Dispose()
            myConnection.Close()
            booknameReg.Clear()
            authorReg.Clear()
            publisherReg.Clear()
            subjectcodeReg.Clear()
            priceReg.Clear()
            discountamountReg.Clear()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        Admin.MainData.DataSource = Admin.table
    End Sub
End Class

如您所见,代码“TVL12.BookListVL.Rows.Add(booknameReg.Text、authorReg.Text、publisherReg.Text、subjectcodeReg.Text、priceReg.Text、discountamountReg.Text)”已转换为注释,因为如果删除“”的话,它将无法工作。虽然我已经用另一个并没有真正连接到数据库的程序完成了。有人能帮我这里有什么问题吗?

根据您的描述,您想在向数据库添加数据时更新datagridview

您可以参考我编写的修改后的代码

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim newtable = New DataTable()
    provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
    datafile = "C:\Users\testuser\Documents\BookLists.accdb"
    connString = provider & datafile
    myConnection.ConnectionString = connString
    myConnection.Open()
    Dim str As String
    'str = "Insert into TVL12([Name],[Age],[StuId]) Values (?,?,?)"
    'Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
    'cmd.Parameters.Add(New OleDbParameter("Name", CType("test4", String)))
    'cmd.Parameters.Add(New OleDbParameter("Age", CType(26, Int32)))
    'cmd.Parameters.Add(New OleDbParameter("StuId", CType(1004, Int32)))

    Try
        'cmd.ExecuteNonQuery()
        str = "Select * from TVL12"
        Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
        Dim da As OleDbDataAdapter = New OleDbDataAdapter()
        da.SelectCommand = cmd
        da.Fill(newtable)
        cmd.Dispose()
        myConnection.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
    DataGridView1.DataSource = newtable
End Sub

您有一个add按钮,可以在数据库表中插入新记录。试着让你的潜艇和功能只做一件事。您可以在插入后调用
DisplayData
,也可以在Form.Load中调用

我质疑表中某些字段的数据类型。如果主题代码是一个数字,它应该是一个整数。价格和折扣金额应为十进制

我得猜你的参数是什么类型的。检查数据库中的真实类型。.Add方法的最后一个参数是字段的大小。无需对
.Text
属性调用
.ToString
。它已经是一个字符串了

使用…结束使用块关闭并处置数据库对象,即使出现错误

Private Sub addBtn\u单击(发送者作为对象,e作为事件参数)处理addBtn。单击
尝试
使用myConnection作为新的OleDbConnection(“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\acjfc\OneDrive\Desktop\thesis\DATABASE\BookLists.accdb”),
cmd作为新的OleDbCommand(“插入TVL12([书名],[作者],[出版商],[主题代码],[价格],[折扣量])值(?,,,,,,,,,,,?)”,myConnection)
cmd.Parameters.Add(“BookName”,OleDbType.VarChar,200)。Value=booknameReg.Text
cmd.Parameters.Add(“Author”,OleDbType.VarChar,200)。Value=authorReg.Text
cmd.Parameters.Add(“Publisher”,OleDbType.VarChar,200)。Value=publisherReg.Text
cmd.Parameters.Add(“SubjectCode”,OleDbType.VarChar,200)。Value=subjectcodeReg.Text
cmd.Parameters.Add(“Price”,OleDbType.VarChar,100)。Value=priceReg.Text
cmd.Parameters.Add(“DiscountAmount”,OleDbType.VarChar,50)。Value=discountamountReg.Text
myConnection.Open()
cmd.ExecuteNonQuery()
终端使用
特例
MessageBox.Show(例如Message)
结束尝试
ClearTextBox()
DisplayData()
端接头
专用子ClearTextBox()
booknameReg.Clear()
authorReg.Clear()
publisherReg.Clear()
subjectcodeReg.Clear()
priceReg.Clear()
discountamountReg.Clear()
端接头
私有子显示数据()
Dim dt作为新数据表
使用myConnection作为新的OleDbConnection(“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\acjfc\OneDrive\Desktop\thesis\DATABASE\BookLists.accdb”),
cmd作为新的OleDbCommand(“从TVL12中选择*,myConnection)
myConnection.Open()
dt.Load(命令执行器读取程序)
终端使用
DataGridView1.DataSource=dt
端接头

显示的错误看起来相当清楚。当网格是数据绑定的(具有数据源)时,不能通过编程将行直接“添加”到
DataGridView
。正如代码所示,您可以通过编程方式向“数据源”添加行,而“数据源”将更新网格行。我不知道这里有什么神秘之处?你的网格没有连接到你的数据库。ADO.NET不是这样工作的。网格已绑定到
数据表
,该表是数据库中数据的断开连接的副本。用户可以直接通过网格添加数据,但如果您想在代码中添加数据,则需要使用
DataTable
或位于两者之间的
BindingSource
。你应该做的是在数据适配器上调用
Fill
,从数据库中填充
DataTable
,对
DataTable
进行更改,然后在同一个数据适配器上调用
Update
,将这些更改保存回数据库。是的,我真的在考虑这个问题。我只是认为我的DataGridView已连接到数据库,但事实并非如此。现在,我基本上如何将我的DataGridView连接到数据库?我现在实际做的是使用BindingSource在数据库中同时向datagridview添加新行,就像它会同时更新一样。我认为,如果您从数据库中输入了数据,它是否可以更新datagridview,只需将您的代码用于UpdateButton,这样一旦我单击UpdateButton,datagridview就会立即更新?变量“newtable”在哪里来自?如果要在从数据库输入数据时更新datagridview,可以删除注释代码。newtable来自第一行代码,创建newtable的目的是设置datasource。那么变量“newtable”就是我将使用的变量,以便我可以从datagridview输入数据?但一旦我试着做你的代码。。。OleDbDataAdapter是“da”,它使我的代码没有从数据库中插入数据