tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルCSVデータをMDBに全件出力
記事No4687
投稿日: 2006/12/15(Fri) 15:51
投稿者やま
お世話になっております。
CSVデータ全件をMDBのテーブルに格納する処理があるのですが、
データが、3万件あると、3万回のインサート処理が走ってしまう
コーディングになっています。
処理の度に、MDBのテーブルのデータは全て削除し、
CSVデータを1件1件追加する処理になっています。
もっと効率のよい方法はないでしょうか?
ご教授お願い致します。

  'ODBC Driver用宣言
  Dim lConnection As OdbcConnection
  Dim lDataAdapter As New OdbcDataAdapter
  Dim lSQLCommand As New OdbcCommand
  Dim lTransaction As OdbcTransaction

  lConnectStr = "DSN=" & "MDB" & ";UID=" & "" & ";PWD=" & ""
  lConnection = New OdbcConnection(lConnectStr)

  lConnection.Open()

  'テーブルデータを全件削除
  〜 省略 〜

  lSQLCommand.Connection = lConnection        '作成された接続をセット
  lSQLCommand.CommandType = CommandType.Text  'CommandTextをテキストとして解釈
  lDataAdapter.SelectCommand = lSQLCommand

  i = 0
  Do
      i = i + 1

      StrSQL = ""
      StrSQL = StrSQL & " INSERT INTO テーブル1 " & vbNewLine
      StrSQL = StrSQL & " " & vbNewLine
      StrSQL = StrSQL & " (" & vbNewLine
      StrSQL = StrSQL & " キー," & vbNewLine
      〜 省略 〜

      lSQLCommand.CommandText = StrSQL
      lSQLCommand.ExecuteNonQuery()

  Loop

[ツリー表示へ]
タイトルRe: CSVデータをMDBに全件出力
記事No4688
投稿日: 2006/12/15(Fri) 16:04
投稿者魔界の仮面弁士
> もっと効率のよい方法はないでしょうか?

INSERT クエリをデータごとに作成するのではなく、パラメタクエリとして実行しましょう。
SQLの再解析にかかる時間を省略できますし、SQL Injection 対策にもなります。

また、CSV の形式によっては、Jet の異種DB間クエリ(IN句など)を用いた
 INSER INTO [mdbTable1] SELECT * FROM [Text;Database=C:\foo].[foo.csv]
が有効な場合もあります。(この場合は、Odbc* ではなく OleDb* を使ってください)

もし、さらなる高速化を望むのであれば、DAO のテーブルタイプRecordset を使うのも
有効な方法かと思います。
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200611/06110042.txt

[ツリー表示へ]
タイトルRe^2: CSVデータをMDBに全件出力
記事No4704
投稿日: 2006/12/19(Tue) 17:53
投稿者やま
DAO のテーブルタイプRecordset で処理を行いたいと思います。
ありがとうございました。

[ツリー表示へ]