1

データベースに複数の行を次々に挿入しようとしています。関連するコードは次のとおりです。

Private ConnectionString As String = "Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx)(PORT=xxx)))(CONNECT_DATA=(SID=xxx)(SERVER=DEDICATED)));User Id=xxx;Password=xxx;"
Private SQL As String = "INSERT INTO XXX.BU_LOG (PROGRAM, LOCATION, MESSAGE, TIMESTAMP, ""LEVEL"", COMPUTER, ""USER"") "
Dim Connection As New OleDbConnection(ConnectionString)
Dim Command As OleDbCommand

'The SQL variable is the first part of an insert statement
SQLValues = "VALUES ('" & Program & "','" & Location & "','" & Message & "','" & Timestamp & "','" & LevelName & "','" & Computer & "','" & User & "')"

Dim Command As New OleDbCommand(SQL & SQLValues, Connection)

Connection.Open()
Command.ExecuteNonQuery()
Connection.Close()

今、私が一度それを呼ぶならば、それはうまくいきます。異なるボタン(ボタンごとに異なる値を挿入する)から2回呼び出すと、うまく機能します。ただし、同じボタンでコードを2回、次々に呼び出すと、2つの行が挿入されますが、2番目の行は最初の行と同じです。コマンドテキストを確認しましたが、クエリを実行すると正しいのですが、行が重複しています。

2番目のインサートを呼び出す前にスレッドを500ミリ秒間スリープすると、正常に動作します。しかし、私がそれを100msだけ眠ると、それは複製されます。何か案は?


編集:不明な点がある場合は申し訳ありません。問題は、特にタイムスタンプ列ではありません。実際、Timestamp列に重複があっても問題ありません。これが私がそれを呼んでいる方法です。

log.Write(My.Application.Info.AssemblyName, System.Reflection.MethodBase.GetCurrentMethod.Name, "Hello World!")
log.Write(My.Application.Info.AssemblyName, System.Reflection.MethodBase.GetCurrentMethod.Name, "Testing", , VB2008_Log_Dll.Log.mLevel.Fatal)

ご覧のとおり、最初のものは「HelloWorld!」とだけ書いています。2番目は「テスト」と書きます。プログラムを実行すると、「HelloWorld!」の2つの行が表示されます。これがより明確になることを願っています。

4

1 に答える 1

2

列 TIMESTAMP のデータ型は何ですか? DATE の場合、Oracle の DATE 値は 1 秒までしか正確ではないため、0.5 秒以内に 2 回挿入すると、列の同じ値になる可能性があります。

TIMESTAMP と呼ばれる新しいデータ型があり、必要に応じて代わりに使用できる秒単位まで正確です。

于 2008-11-19T21:32:40.040 に答える