update后 mdb数据库不变,datagrideview2显示已经变了

SST_X 2019-04-16 12:04:19
如下代码,我用da.update 更新mdb数据库,数据库内容却没变,但是datagrideview显示变了。运行没有报错。不知道哪里出错了。
请大家指导一下,谢谢!

Private Sub sequencePlan()
Dim cn As OleDbConnection
Dim da As OleDbDataAdapter
Dim ds As DataSet = New DataSet
'On Error Resume Next


Dim cnStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=tmpDB.mdb; Persist Security Info=False"
cn = New OleDbConnection(cnStr)
cn.Open()

Dim strSql As String = "select * from DATAIO_PLAN order by Equipment ASC, SMT_TIME asc, DT DESC"

da = New OleDbDataAdapter(strSql, cn)

Dim Mybuilder As OleDbCommandBuilder = New OleDbCommandBuilder(da)
da.Fill(ds, "A")
da.FillSchema(ds, System.Data.SchemaType.Mapped)
datagrideview2.DataSource = ds.Tables("A")

cn.Close()


Dim Irow As Integer = ds.Tables("A").Rows.Count

Dim I1 As Integer
Dim lastTime As Date
Dim currentTime As Date
Dim calcTime As Date

Dim YN As Boolean = True '判定是否是倒数第一个(设备号)
Dim IsSameEquip As Boolean = True
Dim DTStr As Integer = 0
Dim EquipStr As String = ds.Tables("A").Rows(Irow - 1).Item(6).ToString()
Dim EquipStrCurrent As String

For I1 = Irow - 1 To 0 Step -1
EquipStrCurrent = ds.Tables("A").Rows(I1).Item(6).ToString()
currentTime = Format(CDate(ds.Tables("A").Rows(I1).Item(13).ToString()), "yyyy-MM-dd HH:mm")

DTStr = CInt(ds.Tables("A").Rows(I1).Item(12).ToString())

If EquipStrCurrent = EquipStr Then
IsSameEquip = True
If YN = False Then
Dim DTStrTemp As Integer = (DTStr / OE) + changeOverTime
calcTime = DateAdd("S", -DTStrTemp, lastTime)

If calcTime > currentTime Then
lastTime = currentTime
Else
calcTime = DateAdd("S", -DTStrTemp, lastTime)
ds.Tables("A").Rows(I1).BeginEdit()
ds.Tables("A").Rows(I1)("DATAIOTIME") = calcTime ' Format(calcTime, "yyyy-MM-dd HH:mm") '修改一行
ds.Tables("A").Rows(I1).EndEdit()
ds.AcceptChanges()

lastTime = calcTime
End If
Else
lastTime = currentTime
End If

YN = False
Else
IsSameEquip = False
EquipStr = ds.Tables("A").Rows(I1).Item(6).ToString()
lastTime = currentTime
YN = True
End If

Next

da.Update(ds, "A") '须将结果传回数据源时打开连接,update

da.Dispose()
ds.Dispose()


End Sub
...全文
351 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
SST_X 2019-04-22
  • 打赏
  • 举报
回复
@智者知已应修善业, 你说的是对的,现在已经搞定了。非常感谢!厉害!
  • 打赏
  • 举报
回复
从微软提供的VB文档例子测试: '在此处修改数据集中数据的代码()-------------------适用于新的AccEss数据库.accdb且不需要主键
  • 打赏
  • 举报
回复
无法更新到数据表问题已经找到原因,自适应更新中没有打开数据库和数据表,这个从调试中打开文件夹查看数据库修改时间可以得到证实,用合成语句的办法就可以打开并更新到数据表

    Sub AccEss数据库增删改(ByVal 数据源 As String, ByVal 语句 As List(Of String))
        Dim 数 = 0
        Dim 连接 As New OleDb.OleDbConnection(数据源)
        连接.Open()
        For Each 执行 As String In 语句
            Dim 操作 = New OleDb.OleDbCommand(执行, 连接)
            数 += 操作.ExecuteNonQuery()
        Next
        连接.Close()
        MessageBox.Show("数据保存成功!受影响数" + 数.ToString("〖00000〗"), "友情提醒", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
    End Sub
    Private Sub 自适应更新()
        Dim cnStr As String = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = 测试用例.mdb;"
        Dim strSql As String = "SELECT * FROM 测试表 order by Equipment ASC, SMT_TIME asc, DT DESC"
        Dim ds As DataSet = New DataSet

        Using cn As New OleDb.OleDbConnection(cnStr)
            Dim da As New OleDb.OleDbDataAdapter(strSql, cn)
            Dim Mybuilder As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(da)
            cn.Open() '自适应更新数据表必须有主键
            da.Fill(ds, "测试表")

            ds.Tables(0).Rows(0)(2) = "1111111111111"
            ds.Tables(0).AcceptChanges()
            Dim 执行 As New List(Of String)
            Dim 语句 As String = "UPDATE 测试表 SET "
            Dim xu = 0
            For Each 列 As DataColumn In ds.Tables(0).Columns
                语句 += 列.ColumnName + " = '" + ds.Tables(0).Rows(0)(xu) + "' ,"
                xu += 1
            Next
            语句 = 语句.TrimEnd(",") + "WHERE ID = '" + ds.Tables(0).Rows(0)(0) + "'"
            执行.Add(语句)
            AccEss数据库增删改(cnStr, 执行)'执行这个语句更新成功,也可以查看文件夹中数据库修改时间看到

            Mybuilder.GetUpdateCommand()
            Dim dd = Mybuilder.GetUpdateCommand.CommandText
            da.Update(ds.Tables(0))'之上数据库和数据表有打开并读取,就是没执行更新
        End Using
    End Sub
至于为何自适应更新无法打开数据库和数据表的原因尚未查清.
SST_X 2019-04-17
  • 打赏
  • 举报
回复
谢谢。你很耐心。我明天试试看。然后回复你。
  • 打赏
  • 举报
回复
经过多次测试证明问题:手动新建的ACCESS数据库和数据表无论后缀名是否改.mdb或.accdb都可以使用自协调,而使用New ADOX.Catalog()创建的数据库无法使用自协调。
SST_X 2019-04-16
  • 打赏
  • 举报
回复
你说的我之前都试过了。都不行。不然也不会又来麻烦大家。谢谢
  • 打赏
  • 举报
回复
Dim Mybuilder As OleDbCommandBuilder = New OleDbCommandBuilder(da) Mybuilder .GetUpdateCommand() da.Update(ds.Tables(0))试看
  • 打赏
  • 举报
回复
仔细看了一下 da.Update(ds.Tables(0), "A") '须将结果传回数据源时打开连接,update
  • 打赏
  • 举报
回复
注释不是写了?要重新连接 Dim cnStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=tmpDB.mdb; Persist Security Info=False" cn = New OleDbConnection(cnStr) cn.Open() Dim strSql As String = "select * from DATAIO_PLAN order by Equipment ASC, SMT_TIME asc, DT DESC" da = New OleDbDataAdapter(strSql, cn) da.Update(ds) cn.Close()
SST_X 2019-04-16
  • 打赏
  • 举报
回复
不行的,我试过了。很奇怪。这两张图,1是datagrideviewer, 2 是mdb表
SST_X 2019-04-16
  • 打赏
  • 举报
回复
我用ds.HasChanges()来测试,竟然是false,数据集没有更改。
可是dategridviewer里却是改过的
  • 打赏
  • 举报
回复
把 cn.Close() 移动到da.Update(ds, "A") 之后试看
  • 打赏
  • 举报
回复
实在不行的话用别的方式了
SST_X 2019-04-16
  • 打赏
  • 举报
回复
如果在endedit 之后把ds.AcceptChanges() 去掉,就会报影响并发性。这个图

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧