none
直接insert dataset的語法 RRS feed

  • 問題

  • 小弟現在有面臨到需一次大量insert多次資料
    現在用的方法是將dataset的資料用迴圈一筆一筆的塞入資料
    但是這樣真的有點慢,所以請一下有可以一次塞入dataset的方法嗎?

     

    Dim i As Integer
    Dim daTemp As New OleDb.OleDbDataAdapter
    Dim dsTemp As New DataSet
    Dim drTemp As OleDb.OleDbDataReader
    Dim cmmKernal As OleDb.OleDbCommand
    Dim oTran As OleDb.OleDbTransaction


    dim sql string="select * from customerbasis "

     

     cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp)
     daTemp = New OleDb.OleDbDataAdapter(cmmTemp)
     daTemp.Fill(dsTemp, "customerbasis")
     cmmTemp.Dispose()

     

    for i=o to dsTemp.Tables("customerbasis").Rows.Count -1


      sql="insert into customerbasis "
      sql+=" (customerno,customername,tal,address,phone,age) value "
      sql+=" '" & dsTemp.Tables("customerbasis").Rows(i)("customerno") & "',"
      sql+=" '" & dsTemp.Tables("customerbasis").Rows(i)("customername") & "',"
      sql+=" '" & dsTemp.Tables("customerbasis").Rows(i)("tal") & "',"
      sql+=" '" & dsTemp.Tables("customerbasis").Rows(i)("address") & "',"
      sql+=" '" & dsTemp.Tables("customerbasis").Rows(i)("phone") & "',"
      sql+=" '" & dsTemp.Tables("customerbasis").Rows(i)("age") & "'"
      sql+=" )"


      cmmKernal.CommandText = sql
      cmmKernal.ExecuteNonQuery()


      oTran.Commit()


    next


     

    發現這樣如果dataset有二萬筆這回圈就要跑二萬次,所以請問
    vb.net有語法可以直接將dataset塞到目的Table的語法嗎?

     

    2008年11月7日 上午 06:45

解答

  • Oracle 一樣有參數化查詢的方法吧。

    不過因為我對 Oracle 不熟,所以沒辦法教你怎麼寫 Oracle 的參數化 SQL 指令。

     

    但 System.Data.OracleClient 也有 OracleParameter 這樣的物件,MSDN 中有說明,用這個當關鍵字去找 google 也有吧 ...。

     

    • 已標示為解答 Lolota Lee 2009年2月13日 上午 06:48
    2008年11月7日 上午 09:07
    版主

所有回覆

  • 改用參數吧,這樣 Access 只需要處理一次 SQL 指令,其他套參數即可執行,速度應該會快一點。

    不過你也無法要求它能有多快,畢竟它不是 Server 級的 database,資料管理方法不如 SQL Server 那樣快。

     

    2008年11月7日 上午 06:49
    版主
  •  小朱 寫信:

    改用參數吧,這樣 Access 只需要處理一次 SQL 指令,其他套參數即可執行,速度應該會快一點。

    不過你也無法要求它能有多快,畢竟它不是 Server 級的 database,資料管理方法不如 SQL Server 那樣快。

     

     

    謝謝小朱的回應!

    其實我使用的是Oracle,所以在想不知VB有沒有方法可以直接將資料塞入Table

    不過我該怎麼使用參數來改寫呢…

    可以請小朱提示一下嗎? 

    麻煩你了

     

    2008年11月7日 上午 08:50
  • Oracle 一樣有參數化查詢的方法吧。

    不過因為我對 Oracle 不熟,所以沒辦法教你怎麼寫 Oracle 的參數化 SQL 指令。

     

    但 System.Data.OracleClient 也有 OracleParameter 這樣的物件,MSDN 中有說明,用這個當關鍵字去找 google 也有吧 ...。

     

    • 已標示為解答 Lolota Lee 2009年2月13日 上午 06:48
    2008年11月7日 上午 09:07
    版主
  • 你可以跟 xxxCommandBuilder 比比速度,這個雖然效能一般,但是卻是全自動,直接就可以把 DataSet 的資料灌回去。

     

    如果是兩個資料庫對傳,且其中一個資料庫為 Microsoft Jet 支援範圍的資料庫,可以使用 OleDb 跑 In 子句:

    In 子句的使用範例

     

    2008年11月8日 下午 06:20