通过 vb.net 中的 oledbcommand 进行 SELECT 未获取最近的更改

发布于 2024-08-06 13:44:12 字数 1252 浏览 14 评论 0原文

我使用以下代码计算出访问数据库中的下一个唯一订单号。 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(使用不同的数据库连接),代码将不会选取新的“下一个订单号”。

例如

iFoo = NewOrderNo
CreateNewWorkOrderWithNumber(iFoo)
iFoo2 = NewOrderNo

将向 iFoo 和 iFoo2 返回相同的值。

如果我关闭然后重新打开 serverDB,作为“NewOrderNo”函数的一部分,那么它就可以工作。 iFoo 和 iFoo2 是正确的。

在这种情况下,有没有办法强制“System.Data.OleDb.OleDbConnection”刷新数据库,而无需关闭并重新打开连接。 例如,是否有与 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

I'm using the following code to work out the next unique Order Number in an access database. ServerDB is a "System.Data.OleDb.OleDbConnection"

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

If I subsequently create a WORKORDR (using a different DB connection), the code will not pick up the new "next order number."

e.g.

iFoo = NewOrderNo
CreateNewWorkOrderWithNumber(iFoo)
iFoo2 = NewOrderNo

will return the same value to both iFoo and iFoo2.

If I Close and then reopen serverDB, as part of the "NewOrderNo" function, then it works. iFoo and iFoo2 will be correct.

Is there any way to force a "System.Data.OleDb.OleDbConnection" to refresh the database in this situation without closing and reopening the connection.
e.g. Is there anything equivalent to serverdb.refresh or serverdb.FlushCache

How I create the order.
I wondered if this could be caused by not updating my transactions after creating the order. I'm using an XSD for the order creation, and the code I use to create the record is ...

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

对风讲故事 2024-08-13 13:44:12

来自 MSDN

Microsoft Jet 有一个读取缓存
每 PageTimeout 毫秒更新一次
(默认值为 5000 毫秒 = 5 秒)。它
还有一个惰性写入机制
在与主线程不同的线程上运行
处理,从而将更改写入
异步磁盘。这两个
机制有助于提高绩效,但是
在某些需要的情况下
高并发,他们可能会创建
问题。

  • 如果可以的话,只使用一个连接。
  • 回到 VB6,您可以使用 ADO 强制连接自行刷新。我不知道VB.NET是否可以实现。我的 Google-fu 今天似乎很弱。
  • 您可以更改注册表中的 PageTimeout 值,但这会影响计算机上使用Jet 引擎(即 Access 数据库的编程使用)

From MSDN

Microsoft Jet has a read-cache that is
updated every PageTimeout milliseconds
(default is 5000ms = 5 seconds). It
also has a lazy-write mechanism that
operates on a separate thread to main
processing and thus writes changes to
disk asynchronously. These two
mechanisms help boost performance, but
in certain situations that require
high concurrency, they may create
problems.

  • If you possibly can, just use one connection.
  • Back in VB6 you could force the connection to refresh itself using ADO. I don't know whether it's possible with VB.NET. My Google-fu seems to be weak today.
  • You can change the PageTimeout value in the registry but that will affect all programs on the computer that use the Jet engine (i.e. programmatic use of Access databases)
提笔落墨 2024-08-13 13:44:12

我总是在使用连接对象后将其丢弃。由于连接池,获得新连接的成本很低。

I always throw away a Connection Object after I used it. Due to Connection Pooling getting a new Connection is cheap.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文