代码之家  ›  专栏  ›  技术社区  ›  seanyboy

通过vb.net中的oledbcommand进行选择,不接受最近的更改

  •  1
  • seanyboy  · 技术社区  · 15 年前

    我正在使用以下代码计算Access数据库中的下一个唯一订单号。serverDB是一个“system.data.oledb.oledbconnection”

    Dim command As New OleDb.OleDbCommand("", serverDB)
    command.CommandText = "SELECT max (ORDERNO) FROM WORKORDR"
    iOrder = command.ExecuteScalar()
    NewOrderNo = (iOrder + 1)
    

    如果我随后创建一个workordr(使用不同的db连接),代码将不会获取新的“下一个订单号”。

    例如

    iFoo = NewOrderNo
    CreateNewWorkOrderWithNumber(iFoo)
    iFoo2 = NewOrderNo
    

    将向ifoo和ifoo2返回相同的值。

    如果我关闭然后重新打开serverdb,作为“neworderno”函数的一部分,那么它就会工作。ifoo和ifoo2是正确的。

    是否有任何方法可以强制“system.data.oledb.oledb connection”在这种情况下刷新数据库,而不关闭并重新打开连接。 例如,是否有与serverdb.refresh或serverdb.flushcache等效的内容?

    如何创建订单。 我想知道这是否是由于创建订单后没有更新我的交易造成的。我正在使用XSD创建订单,用于创建记录的代码是…

    Sub CreateNewWorkOrderWithNumber(ByVal iNewOrder As Integer)
        Dim OrderDS As New CNC
        Dim OrderAdapter As New CNCTableAdapters.WORKORDRTableAdapter
    
        Dim NewWorkOrder As CNC.WORKORDRRow = OrderDS.WORKORDR.NewWORKORDRRow
    
        NewWorkOrder.ORDERNO = iNewOrder
        NewWorkOrder.name = "lots of fields filled in here."
    
        OrderDS.WORKORDR.AddWORKORDRRow(NewWorkOrder)
        OrderAdapter.Update(NewWorkOrder)
    
        OrderDS.AcceptChanges()
    End Sub
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   MarkJ    15 年前

    MSDN

    Microsoft Jet的读取缓存为 每pageTimeout毫秒更新一次 (默认值为5000ms=5秒)。它 还有一个懒惰的写机制, 在单独的线程上操作到主线程 处理并将更改写入 异步磁盘。这两个 机制有助于提高性能,但是 在某些情况下,需要 高并发性,它们可以创建 问题。

    • 如果可能,只需使用一个连接即可。
    • 回到vb6你可以 force the connection 使用ADO刷新自身。我不知道用vb.net是否可行。我的google fu今天似乎很弱。
    • 你可以 change the PageTimeout value in the registry 但这将影响使用Jet引擎的计算机上的所有程序(即对Access数据库的程序化使用)
        2
  •  1
  •   Arthur    15 年前

    我使用连接对象后总是扔掉它。由于连接池,获取新连接成本很低。