如何在 asp .NET 中将记录添加到数据库中
Posted
技术标签:
【中文标题】如何在 asp .NET 中将记录添加到数据库中【英文标题】:How to add a record to a database in asp .NET 【发布时间】:2012-01-31 12:19:58 【问题描述】:我目前有一个通过 ASP .NET 前端访问的 Microsoft Access 数据库。我正在尝试向表中添加一行,但这似乎不起作用,我正在使用的代码如下所示。
Sub prcChoose()
Dim sql As String
Dim da As New OleDbDataAdapter
Dim conn As New OleDbConnection
Dim comm As New OleDbCommand
Dim cb As New OleDbCommandBuilder(da)
ds = New DataSet
conn = New OleDbConnection(ConfigurationManager.ConnectionStrings("dbConnection").ConnectionString)
sql = "SELECT * FROM ParentPreference"
conn.Open()
da = New OleDbDataAdapter(sql, conn)
da.Fill(ds, "Choice")
Dim NewRow As Data.DataRow = ds.Tables("Choice").NewRow()
NewRow.Item(0) = txtUser.Text
NewRow.Item(1) = dropdown.SelectedValue
ds.Tables("Choice").Rows.Add(NewRow)
***da.UpdateCommand = cb.GetUpdateCommand()***
da.Update(ds, "Choice")
End Sub
根据是否包含由 3 个星号括起来的行,我会收到不同的错误消息。没有它,我会收到“Update requires a valid InsertCommand when passed DataRow collection with new rows.”并收到“DataAdapter.SelectCommand 属性需要初始化。”我花了几个小时试图找出哪里出错了,但我没有成功。
提前致谢!
编辑:根据下面凯西的建议,我添加了以下代码行:
da.InsertCommand = cb.GetInsertCommand
da.DeleteCommand = cb.GetDeleteCommand
我在上面用星号括起来的代码下方添加了这些行。但我仍然收到相同的错误消息。 DataAdapter.SelectCommand 属性需要初始化。下面一行会出现这个错误
da.InsertCommand = cb.GetInsertCommand
【问题讨论】:
【参考方案1】:由于我目前无法访问 Visual Studio 来检查您的代码,因此从内存中拍摄,但是..
数据适配器需要几个命令来更新/删除/插入您的 Access 表。看起来您已经使用命令生成器来构建更新命令,数据适配器将用于需要更新的行。此外,您还需要使用命令生成器来构建插入和删除命令:
da.InsertCommand = cb.GetInsertCommand
da.DeleteCommand = cb.GetDeleteCommand
“更新需要有效的插入命令”错误告诉您数据适配器不知道如何将您在数据表中创建的新行插入到 Access DB,因为您没有告诉它使用什么插入命令。插入上面的两行应该可以解决这个问题。
数据适配器上的 InsertCommand、DeleteCommand 和 UpdateCommand 只是数据适配器用来更新基础数据源(在本例中为 Access)的 SQL 语句。您可以手动提供这些命令,也可以将 CommandBuilder 用于像这样的简单案例。
当您告诉 DataAdapter 进行更新时,它会循环遍历数据表并针对每一行确定该行是否已添加、删除或更新。然后它寻找适当的命令来执行插入、删除或更新的 SQL 语句。如果您没有提供命令,则会收到您所看到的错误。
编辑:这是您的代码更新以修复“SelectCommand 未初始化”错误和其他一些问题:
Sub prcChoose()
'Always create disposable objects with a Using statement.
'This ensures that the objects will be disposed properly.
Using conn As New OleDbConnection(ConfigurationManager.ConnectionStrings("dbConnection").ConnectionString), _
da As New OleDbDataAdapter("SELECT * FROM ParentPreference", conn), _
cb As New OleDbCommandBuilder(da)
'Open connection.
conn.Open()
'Create new dataset.
Dim ds As New DataSet
'Fill dataset.
da.Fill(ds, "Choice")
'Create new row and populate it.
Dim NewRow As Data.DataRow = ds.Tables("Choice").NewRow()
NewRow.Item(0) = txtUser.Text
NewRow.Item(1) = dropdown.SelectedValue
'Add row to Choice table.
ds.Tables("Choice").Rows.Add(NewRow)
'Use command builder to generate Update, Insert, Delete commands for DataAdapter.
da.UpdateCommand = cb.GetUpdateCommand
da.InsertCommand = cb.GetInsertCommand
da.DeleteCommand = cb.GetDeleteCommand
'Use dataadapter to update datasource.
da.Update(ds, "Choice")
End Using
End Sub
【讨论】:
非常感谢您的回复,我想我现在明白了。我插入了您推荐的代码,但正如我在编辑中所说,我收到了相同的错误消息。我不知道这意味着什么,也不知道如何初始化 DataAdapter.SelectCommand。 错误是由 DataAdapter 还是 CommandBuilder 抛出的? CommandBuilder 使用 SelectCommand 生成插入/更新/删除命令。在调用 CommandBuilder 之前,使用调试器查看 DataAdapter 是否具有有效的 SelectCommand。 我认为它是由 DataAdaptor 抛出的。它发生在da.InsertCommand = cb.GetInsertCommand
行上,并且数据适配器确实有一个有效的 SelectCommand,至少我相信它是有效的。这是"SELECT * FROM ParentPreference"
。
我想我明白了。您在代码顶部创建一个新的 OleDataAdapter,然后将该特定适配器提供给 CommandBuilder。但稍后您创建另一个新的 DataAdapter,这就是使用您的 SelectCommand 初始化的那个。我会在回复中更新您的代码。
谢谢!我终于明白了!这解决了困扰我多年的问题!我没有意识到数据适配器的第二个赋值语句正在擦除它。再次感谢!以上是关于如何在 asp .NET 中将记录添加到数据库中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Forms 中将 Bootstrap 的关闭按钮添加到 ValidationSummary?
在 Razor (chtml) 中渲染动态视图,如何在 asp.net core 3.0 中将 FileProvider 添加到 razor?
在 ASP.NET Core MVC 中将自定义查询参数添加到操作 URL
防止 AddRedirectToWwwPermanent() 在 ASP.NET Core 2.1 中将“www”添加到 *.azurewebsites.net 的前面