2008-11-19 4 views
1

J'essaie d'insérer plusieurs lignes, l'une après l'autre, dans une base de données. Voici le code pertinent.Problème lors de l'insertion rapide de plusieurs lignes dans la base de données Oracle à partir de VB

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() 

Maintenant, si je l'appelle une fois que cela fonctionne très bien. Si je l'appelle deux fois de dire différents boutons (en insérant des valeurs différentes pour chaque bouton) cela fonctionne très bien. Toutefois, lorsque j'appelle le code deux fois dans le même bouton, l'un après l'autre, il insère deux lignes, mais la deuxième ligne est la même que la première ligne. J'ai vérifié le texte de la commande et il est correct quand il exécute la requête mais il duplique la ligne.

Si je dors le fil pendant 500ms avant que j'appelle le deuxième insert, cela fonctionne bien. Mais si je ne fais que dormir 100ms il va dupliquer. Des idées?


EDIT: Désolé si je n'étais pas clair. Le problème n'est pas spécifiquement la colonne Timestamp. En fait, il est normal que la colonne Timestamp ait des dupes. Voici comment je l'appelle. Comme vous pouvez le voir, le premier vient d'écrire "Bonjour tout le monde!"

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) 

et le second écrit "Testing". Quand je lance le programme, je reçois deux lignes avec "Hello World!". J'espère que cela le rendra plus clair.

Répondre

2

Quel est le type de données de la colonne TIMESTAMP? Si c'est DATE, les valeurs Oracle DATE ne sont précises qu'à 1 seconde, donc deux insertions dans une demi-seconde environ sont susceptibles de se retrouver avec la même valeur pour la colonne.

Il existe un type de données plus récent appelé TIMESTAMP qui est précis à des fractions de seconde que vous pouvez utiliser à la place, le cas échéant.

Questions connexes