ADO.NET操作数据库小问题
我要修改TreeInfo.accdb数据库中的TreesList数据表中的“details”字段,有错误,请帮忙指出错误ImportsSystem.Data.OleDbP...
我要修改TreeInfo.accdb数据库中的TreesList数据表中的“details”字段,
有错误,请帮忙指出错误
Imports System.Data.OleDb
Public Class Form1
Public p_DBName As String '数据库文件名(包括路径)
Public p_DBcnn1 As New OleDbConnection '定义数据库链接
Public p_DBAdapter1 As New OleDbDataAdapter
Public p_DBcmd1 As New OleDbCommand
Public p_DBset1 As New DataSet
Public p_DBtable1 As New DataTable
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
p_DBName = Application.StartupPath & "\TreesInfo.accdb" '数据库路径
p_DBcnn1.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & p_DBName & ";" '数据库连接字符串
If p_DBcnn1.State = ConnectionState.Closed Then '如果是关闭状态,就打开之
p_DBcnn1.Open()
End If
p_DBcmd1.Connection = p_DBcnn1 '数据库连接
p_DBcmd1.CommandType = CommandType.Text '命令类型
Dim s_SQLstr As String = "select * from TreesList " 'SQL语句
p_DBcmd1.CommandText = s_SQLstr
p_DBAdapter1.SelectCommand = p_DBcmd1
p_DBAdapter1.Fill(p_DBset1, "TreesList")
Dim DBrow1 As DataRow
For Each DBrow1 In p_DBset1.Tables("TreesList").Rows
'dbrow1.BeginEdit()
DBrow1("details") = "aaaaa"
'dbrow1.EndEdit()
Next
p_DBAdapter1.Update(p_DBset1, "treeslist") '在这里提示错误:当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand
p_DBset1.AcceptChanges()
MessageBox.Show("OK")
End Sub
End Class
提示错误:当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand
我已经用注释标在代码里了 展开
有错误,请帮忙指出错误
Imports System.Data.OleDb
Public Class Form1
Public p_DBName As String '数据库文件名(包括路径)
Public p_DBcnn1 As New OleDbConnection '定义数据库链接
Public p_DBAdapter1 As New OleDbDataAdapter
Public p_DBcmd1 As New OleDbCommand
Public p_DBset1 As New DataSet
Public p_DBtable1 As New DataTable
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
p_DBName = Application.StartupPath & "\TreesInfo.accdb" '数据库路径
p_DBcnn1.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & p_DBName & ";" '数据库连接字符串
If p_DBcnn1.State = ConnectionState.Closed Then '如果是关闭状态,就打开之
p_DBcnn1.Open()
End If
p_DBcmd1.Connection = p_DBcnn1 '数据库连接
p_DBcmd1.CommandType = CommandType.Text '命令类型
Dim s_SQLstr As String = "select * from TreesList " 'SQL语句
p_DBcmd1.CommandText = s_SQLstr
p_DBAdapter1.SelectCommand = p_DBcmd1
p_DBAdapter1.Fill(p_DBset1, "TreesList")
Dim DBrow1 As DataRow
For Each DBrow1 In p_DBset1.Tables("TreesList").Rows
'dbrow1.BeginEdit()
DBrow1("details") = "aaaaa"
'dbrow1.EndEdit()
Next
p_DBAdapter1.Update(p_DBset1, "treeslist") '在这里提示错误:当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand
p_DBset1.AcceptChanges()
MessageBox.Show("OK")
End Sub
End Class
提示错误:当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand
我已经用注释标在代码里了 展开
3个回答
展开全部
晕了。
你不生成 updacommand 是不能直接用他的修改的。
少的东东了
-------
你在For Each DBrow1 In p_DBset1.Tables("TreesList").Rows
'dbrow1.BeginEdit()
DBrow1("details") = "aaaaa"
'dbrow1.EndEdit()
Next
---------
看你意思,你同时修改了多行,
只能用
下面的了
-------------
你在msdn中找下面的类。
注意 oracle 找oracle, sqlserver, 找对应的版本的。
《使用 CommandBuilder 生成命令 (ADO.NET)》
这个要求select语句的表 中有标识列。没有就做不到
----------------------
DbCommandBuilder 类
成员 请参见 发送反馈意见
自动生成用于协调 DataSet 的更改与关联数据库的单表命令。这是一个只能被继承的抽象类。
命名空间: System.Data.Common
程序集: System.Data(在 System.Data.dll 中)
语法
Visual Basic(声明)
Public MustInherit Class DbCommandBuilder _
Inherits Component
Visual Basic(用法)
Dim instance As DbCommandBuilder
C#
public abstract class DbCommandBuilder : Component
Visual C++
public ref class DbCommandBuilder abstract : public Component
J#
public abstract class DbCommandBuilder extends Component
JScript
public abstract class DbCommandBuilder extends Component
备注
提供 DbCommandBuilder 类是为了方便提供程序编写者创建自己的命令生成器。通过继承此类,开发人员可在自己的代码中实现提供程序特定的行为。
DbDataAdapter 不会自动生成为了使对 DataSet 所作的更改和相关联的数据源协调起来所必须的 SQL 语句。但是,如果设置了 DbDataAdapter 的 SelectCommand 属性,就可以创建 DbCommandBuilder 对象来自动生成 SQL 语句进行单表更新。然后,DbCommandBuilder 将生成其他任何未设置的 SQL 语句。
每当设置了 DataAdapter 属性,DbCommandBuilder 就将其本身注册为 RowUpdating 事件的侦听器。一次只能将一个 DbDataAdapter 与一个 DbCommandBuilder 对象(或相反)互相关联。
为了生成 INSERT、UPDATE 或 DELETE 语句,DbCommandBuilder 会自动使用 SelectCommand 属性来检索所需的元数据集。如果在检索元数据后(例如在第一次更新后)更改 SelectCommand,则应调用 RefreshSchema 方法来更新元数据。
SelectCommand 还必须至少返回一个主键列或唯一的列。如果什么都没有返回,就会产生 InvalidOperationException 异常,不生成命令。
DbCommandBuilder 还使用由 SelectCommand 引用的 Connection、CommandTimeout 和 Transaction 属性。如果修改了任何这些属性或者替换了 SelectCommand 本身,用户则应调用 RefreshSchema。否则,InsertCommand、UpdateCommand 和 DeleteCommand 属性都保留它们以前的值。
如果调用 Dispose,则会解除 DbCommandBuilder 与 DbDataAdapter 的关联,并且不再使用生成的命令。
你不生成 updacommand 是不能直接用他的修改的。
少的东东了
-------
你在For Each DBrow1 In p_DBset1.Tables("TreesList").Rows
'dbrow1.BeginEdit()
DBrow1("details") = "aaaaa"
'dbrow1.EndEdit()
Next
---------
看你意思,你同时修改了多行,
只能用
下面的了
-------------
你在msdn中找下面的类。
注意 oracle 找oracle, sqlserver, 找对应的版本的。
《使用 CommandBuilder 生成命令 (ADO.NET)》
这个要求select语句的表 中有标识列。没有就做不到
----------------------
DbCommandBuilder 类
成员 请参见 发送反馈意见
自动生成用于协调 DataSet 的更改与关联数据库的单表命令。这是一个只能被继承的抽象类。
命名空间: System.Data.Common
程序集: System.Data(在 System.Data.dll 中)
语法
Visual Basic(声明)
Public MustInherit Class DbCommandBuilder _
Inherits Component
Visual Basic(用法)
Dim instance As DbCommandBuilder
C#
public abstract class DbCommandBuilder : Component
Visual C++
public ref class DbCommandBuilder abstract : public Component
J#
public abstract class DbCommandBuilder extends Component
JScript
public abstract class DbCommandBuilder extends Component
备注
提供 DbCommandBuilder 类是为了方便提供程序编写者创建自己的命令生成器。通过继承此类,开发人员可在自己的代码中实现提供程序特定的行为。
DbDataAdapter 不会自动生成为了使对 DataSet 所作的更改和相关联的数据源协调起来所必须的 SQL 语句。但是,如果设置了 DbDataAdapter 的 SelectCommand 属性,就可以创建 DbCommandBuilder 对象来自动生成 SQL 语句进行单表更新。然后,DbCommandBuilder 将生成其他任何未设置的 SQL 语句。
每当设置了 DataAdapter 属性,DbCommandBuilder 就将其本身注册为 RowUpdating 事件的侦听器。一次只能将一个 DbDataAdapter 与一个 DbCommandBuilder 对象(或相反)互相关联。
为了生成 INSERT、UPDATE 或 DELETE 语句,DbCommandBuilder 会自动使用 SelectCommand 属性来检索所需的元数据集。如果在检索元数据后(例如在第一次更新后)更改 SelectCommand,则应调用 RefreshSchema 方法来更新元数据。
SelectCommand 还必须至少返回一个主键列或唯一的列。如果什么都没有返回,就会产生 InvalidOperationException 异常,不生成命令。
DbCommandBuilder 还使用由 SelectCommand 引用的 Connection、CommandTimeout 和 Transaction 属性。如果修改了任何这些属性或者替换了 SelectCommand 本身,用户则应调用 RefreshSchema。否则,InsertCommand、UpdateCommand 和 DeleteCommand 属性都保留它们以前的值。
如果调用 Dispose,则会解除 DbCommandBuilder 与 DbDataAdapter 的关联,并且不再使用生成的命令。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询