質問するログイン新規登録

回答編集履歴

3

サンプル追加

2020/01/07 08:58

投稿

KOZ6.0
KOZ6.0

スコア2740

answer CHANGED
@@ -36,4 +36,56 @@
36
36
 
37
37
  ### 追記2
38
38
  こうなっていますか?
39
- ![イメージ説明](bd7f3c51622172f1435c38de5fe4f565.png)
39
+ ![イメージ説明](bd7f3c51622172f1435c38de5fe4f565.png)
40
+
41
+ ### 追記3
42
+ サンプルです。(400 万件、460 MB の CSV 出力に成功)
43
+
44
+ ```VB
45
+ Sub OutputCSV(ByVal con As ADODB.Connection, ByVal strSchema As String, ByVal strTable As String, ByVal strOutput As String)
46
+ Dim strFileName As String
47
+ Dim FSO As Scripting.FileSystemObject
48
+ Dim TS As Scripting.TextStream
49
+
50
+ Dim strSQL As String
51
+ Dim objData As ADODB.Recordset
52
+ Dim objDataFld As ADODB.Field
53
+
54
+ Dim count As Long
55
+ Dim strOut As String
56
+
57
+ Set FSO = New Scripting.FileSystemObject
58
+ strFileName = FSO.BuildPath(strOutput, strTable & "_" & Format(Now, "yyyyMMdd") & ".csv")
59
+ Set TS = FSO.OpenTextFile(strFileName, ForWriting, True)
60
+
61
+ strSQL = "SELECT * FROM " & strSchema & "." & strTable
62
+ Set objData = con.Execute(strSQL)
63
+
64
+ Do Until objData.EOF
65
+ strOut = ""
66
+ For Each objDataFld In objData.Fields
67
+ strOut = strOut & "," & objDataFld.value
68
+ Next
69
+ TS.WriteLine Mid(strOut, 2)
70
+ count = count + 1
71
+ If (count Mod 100) = 0 Then
72
+ DoEvents
73
+ End If
74
+ objData.MoveNext
75
+ Loop
76
+ objData.Close
77
+ TS.Close
78
+ End Sub
79
+ ```
80
+
81
+ 使い方
82
+ ```VB
83
+ Dim con As ADODB.Connection
84
+ Set con = New ADODB.Connection
85
+ con.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(TNS名);User Id=(ユーザ名);Password=(パスワード);"
86
+ con.CursorLocation = adUseServer
87
+ con.Open
88
+
89
+ OutputCSV con, スキーマ名1, テーブル名1, 出力フォルダ名1
90
+ OutputCSV con, スキーマ名2, テーブル名2, 出力フォルダ名2
91
+ ```

2

objData のウォッチ結果を追記

2020/01/07 08:58

投稿

KOZ6.0
KOZ6.0

スコア2740

answer CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  DbCreateDynaset は oo4o でなく自前の Function なので、その中で CursorLocation を指定している箇所があれば、同様にしてください。
24
24
 
25
- 追記
25
+ ### 追記
26
26
  フォームを使用して進捗表示等を行っている場合は、フォームの Enabled プロパティを False にして操作不能にした上で、ループ中に適宜 DoEvents をいれてください。
27
27
  でないと固まります。
28
28
 
@@ -32,4 +32,8 @@
32
32
  DoEvents
33
33
  End If
34
34
  ```
35
- こんな感じです。
35
+ こんな感じです。
36
+
37
+ ### 追記2
38
+ こうなっていますか?
39
+ ![イメージ説明](bd7f3c51622172f1435c38de5fe4f565.png)

1

DoEvents を入れる

2020/01/07 08:19

投稿

KOZ6.0
KOZ6.0

スコア2740

answer CHANGED
@@ -20,4 +20,16 @@
20
20
 
21
21
  とします。
22
22
 
23
- DbCreateDynaset は oo4o でなく自前の Function なので、その中で CursorLocation を指定している箇所があれば、同様にしてください。
23
+ DbCreateDynaset は oo4o でなく自前の Function なので、その中で CursorLocation を指定している箇所があれば、同様にしてください。
24
+
25
+ #追記
26
+ フォームを使用して進捗表示等を行っている場合は、フォームの Enabled プロパティを False にして操作不能にした上で、ループ中に適宜 DoEvents をいれてください。
27
+ でないと固まります。
28
+
29
+ ```VB
30
+ count = count + 1
31
+ If (count Mod 100) = 0 Then
32
+ DoEvents
33
+ End If
34
+ ```
35
+ こんな感じです。