2012-09-17 68 views
0

我有一個代碼從選擇的SQL語句中創建一個數據表(在內存中)。然而,我意識到這個數據表在填寫過程中,而不是由於交易記錄的結果,它完成了這項工作,但它的速度很慢。我究竟做錯了什麼 ?SQLite事務填寫提交事務之前的表

Inalready.Clear() 'clears a dictionary 
     Using connection As New SQLite.SQLiteConnection(conectionString) 
      connection.Open() 
      Dim sqliteTran As SQLite.SQLiteTransaction = connection.BeginTransaction() 
      Try 
       oMainQueryR = "SELECT * FROM detailstable Where name= :name AND Breed= :Breed" 
       Dim cmdSQLite As SQLite.SQLiteCommand = connection.CreateCommand() 

       Dim oAdapter As New SQLite.SQLiteDataAdapter(cmdSQLite) 

       With cmdSQLite 
        .CommandType = CommandType.Text 
        .CommandText = oMainQueryR 
        .Parameters.Add(":name", SqlDbType.VarChar) 
        .Parameters.Add(":Breed", SqlDbType.VarChar) 
       End With 

       Dim c As Long = 0 
       For Each row As DataRow In list.Rows 'this is the list with 500 names 

        If Inalready.ContainsKey(row.Item("name")) Then 
        Else 
         c = c + 1 
         Form1.TextBox1.Text = " Fill .... " & c 
         Application.DoEvents() 

         Inalready.Add(row.Item("name"), row.Item("Breed")) 

         cmdSQLite.Parameters(":name").Value = row.Item("name") 
         cmdSQLite.Parameters(":Breed").Value = row.Item("Breed") 
         oAdapter.Fill(newdetailstable) 
        End If 

       Next 

       oAdapter.FillSchema(newdetailstable, SchemaType.Source) 


       Dim z = newdetailstable.Rows.Count 

「在這一點上newdetailstable已經填滿了,我甚至還沒有提交的事務

   ' sqliteTran.Commit() 

      Catch ex As Exception 
      End Try 
     End Using 

回答

1

交易防止其他用戶(即連接)所做的更改;您自己的應用程序所做的任何更改都會立即顯示。

因此,對於內存數據庫,除非需要回滾,否則事務並不有用。

+0

這太糟糕了,我不知道有關SQLite事務。如果整個批次不能成功,您需要傳統的回滾行爲來完成大量工作的大量用例。 – tcarvin

+0

對不起,回滾工作得很好。 –

+0

數據表是一個不是數據庫的vb.datatable,只是上面的代碼被忽略了事務,並且正在將每個循環作爲一個單獨的事務立即處理。無論如何,我來這裏刪除問題,因爲我使用了一個非常快速的不同解決方案。簡單地說,我使用插入事務將名稱保存到臨時表中,然後調用通過使用SQL語句返回所需信息的查詢。選擇* FROM DetailsTable WHERE DetailsTable.name IN(從TempIDs中選擇TempIDs.Names)它的速度很快並且解決了問題。感謝您花時間回答。 – user1500403