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

質問編集履歴

4

追記3の追加

2020/01/07 07:40

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -168,4 +168,11 @@
168
168
  Call CMSG00_ORAErr("ORA000_DB_Connect")
169
169
 
170
170
  End Function
171
- ```
171
+ ```
172
+
173
+ ### 追記3
174
+
175
+ YAmaGNZさんの案を採用させていただきました。
176
+ データを1~10000行、10001~20000行…という感じに分割して出力する方法に変更しようと思います。
177
+ 早速ROWNUMを試しましたが、以下のようになってしまいます。
178
+ ![イメージ説明](b58c993fdcafc56d5f74e5eebb63054c.png)

3

追記を変更

2020/01/07 07:40

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -32,6 +32,7 @@
32
32
 
33
33
  .WriteLine strOut
34
34
 
35
+ 'ここでエラーが発生
35
36
  objData.movenext
36
37
  Loop
37
38
  End With
@@ -47,8 +48,124 @@
47
48
  今回は半分うまくいっているので、言語や手法を変えずにできる方法を探しています。
48
49
  よろしければご教授願います。
49
50
 
50
- ### 追記
51
+ ### 追記1
51
52
  エラー箇所にErr.Descriptionを仕込んでみたら
52
53
  「メモリ不足です」と表示されました。
53
54
  この場合、メモリを増築するなどで対処できますでしょうか?
54
- もしくは、SQL部分をチューニングしたり、分割出力(やり方はわからないです)などで回避できるものでしょうか?
55
+ もしくは、SQL部分をチューニングしたり、分割出力(やり方はわからないです)などで回避できるものでしょうか?
56
+
57
+ ### 追記2
58
+ エラーの発生個所は、上記コードに追記しています。
59
+ FieldValueは以下のようになっています。
60
+ ```VB6
61
+ Public Function CORA20_FieldsValue(ByRef Ho_DBObject As Object _
62
+ , Ho_Fields() As Object _
63
+ , Hn_Idx As Integer) As String
64
+
65
+ Dim Ls_Ret As String
66
+
67
+ On Error GoTo CORA20_FieldsValue_ERR
68
+
69
+ '/* 戻り値クリア
70
+ If Not Ho_Fields(Hn_Idx) Is Nothing Then
71
+ If Pb_ADO_ConnectFlg = True Then
72
+ Ls_Ret = CStr(IIf(Ho_Fields(Hn_Idx).Type = 202, vbNullString, 0))
73
+ Else
74
+ Ls_Ret = CStr(IIf(Ho_Fields(Hn_Idx).OraIDataType = 1, vbNullString, 0))
75
+ End If
76
+ Else
77
+ Ls_Ret = vbNullString
78
+ End If
79
+
80
+ 'Null値が存在する場合は必ず IsNullを使用する。
81
+ If Not IsNull(Ho_Fields(Hn_Idx).Value) Then
82
+ If Pb_ADO_ConnectFlg = True Then '/* ADO
83
+ Dim Ls_Value As String
84
+ Ls_Value = CStr(Ho_Fields(Hn_Idx).Value)
85
+ If Len(Trim(Ls_Value)) = 0 Then
86
+ Ls_Value = vbNullString
87
+ End If
88
+ Ls_Ret = Ls_Value
89
+ Else
90
+ Ls_Ret = CStr(Ho_Fields(Hn_Idx).Value)
91
+ End If
92
+ Else
93
+ If Pb_ADO_ConnectFlg = True Then '/* ADO
94
+ Ls_Ret = IIf(Ho_Fields(Hn_Idx).Type = 202, vbNullString, 0)
95
+
96
+ Else '/* Oracle Object for OLE
97
+ Ls_Ret = IIf(Ho_Fields(Hn_Idx).OraIDataType = 1, vbNullString, 0)
98
+ End If
99
+ End If
100
+
101
+ CORA20_FieldsValue = Ls_Ret
102
+
103
+ Exit Function
104
+
105
+ CORA20_FieldsValue_ERR:
106
+ If Err.Number <> 0 And Err.Number <> 3021 Then
107
+ Call CORA20_ORAErr(Po_DataBase, "CORA20_FieldsValue")
108
+ Call CMSG00_ORAErr("CORA20_FieldsValue")
109
+ End If
110
+
111
+ CORA20_FieldsValue = Ls_Ret
112
+ End Function
113
+ ```
114
+
115
+ 接続コードは以下のようになっています。
116
+ ```VB6
117
+ Function CORA00_DB_Connect(ByRef Ho_DBObject As Object _
118
+ , ByVal Hs_DatabaseName As String _
119
+ , ByVal Hs_UserName As String _
120
+ , ByVal Hs_Password As String) As Integer
121
+
122
+ Dim Ls_Connect As String
123
+
124
+ 'VBのエラーとして判断するためエラー処理を行う。
125
+ On Error GoTo CORA00_DB_Connect_Err
126
+
127
+ CORA00_DB_Connect = Ret_NG
128
+
129
+ '/* 接続形態チェック
130
+ Pb_ADO_ConnectFlg = CheckAdoConnection
131
+
132
+ If Pb_ADO_ConnectFlg = True Then '/* ADO
133
+ Set Ho_DBObject = New clsADO
134
+
135
+ 'ここを通っている
136
+ Ls_Connect = "Provider=OraOLEDB.Oracle; Data Source=" & Hs_DatabaseName & ";" _
137
+ & "User Id=" & Hs_UserName & ";" _
138
+ & "Password=" & Hs_Password & ";"
139
+ '/* クライアントカーソル使用
140
+ Ho_DBObject.CursorLocation = adUseClient
141
+
142
+ '/* 接続文字列セット
143
+ Ho_DBObject.ConnectionString = Ls_Connect
144
+
145
+ '/* DB接続
146
+ Ho_DBObject.ConnectDatabase Ho_DBObject.ConnectionString, Hs_UserName, Hs_Password
147
+ Else '/* Oracle Object for OLE
148
+
149
+ Ls_Connect = Trim$(Hs_UserName) & "/" & Hs_Password
150
+
151
+ 'Lo_OraSessionオブジェクトは、アプリケーション内で使われる
152
+ 'OraDatabaseおよびOraConnection、OraDynasetオブジェクト
153
+ 'の集合を管理します。
154
+ 'OralceをObjectとして認識します。
155
+ Dim Lo_OraSession As Object
156
+ Set Lo_OraSession = CreateObject("OracleInProcServer.XOraSession")
157
+
158
+ Set Ho_DBObject = Lo_OraSession.OpenDatabase(Hs_DatabaseName$, Ls_Connect$, ORADB_DEFAULT)
159
+ End If
160
+
161
+ CORA00_DB_Connect = Ret_OK
162
+
163
+ Exit Function
164
+
165
+ CORA00_DB_Connect_Err:
166
+
167
+ Call CORA20_ORAErr(Po_DataBase, "ORA000_DB_Connect")
168
+ Call CMSG00_ORAErr("ORA000_DB_Connect")
169
+
170
+ End Function
171
+ ```

2

タイトルと追記を変更

2020/01/07 00:56

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- VB6、ADOでOracleのデータをCSV化しようとすると、止まる
1
+ VB6、ADOでOracleのデータをCSV化しようとすると、メモリ不足で止まる
body CHANGED
@@ -50,4 +50,5 @@
50
50
  ### 追記
51
51
  エラー箇所にErr.Descriptionを仕込んでみたら
52
52
  「メモリ不足です」と表示されました。
53
- この場合、メモリを増築するなどで対処できますでしょうか?
53
+ この場合、メモリを増築するなどで対処できますでしょうか?
54
+ もしくは、SQL部分をチューニングしたり、分割出力(やり方はわからないです)などで回避できるものでしょうか?

1

エラーメッセージを更新

2020/01/06 08:28

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -45,4 +45,9 @@
45
45
 
46
46
  ### 要望
47
47
  今回は半分うまくいっているので、言語や手法を変えずにできる方法を探しています。
48
- よろしければご教授願います。
48
+ よろしければご教授願います。
49
+
50
+ ### 追記
51
+ エラー箇所にErr.Descriptionを仕込んでみたら
52
+ 「メモリ不足です」と表示されました。
53
+ この場合、メモリを増築するなどで対処できますでしょうか?