source: trunk/Include/Classes/System/Data/Odbc/Odbc.ab@ 497

Last change on this file since 497 was 497, checked in by イグトランス (egtra), 16 years ago

インクルードガードとその他不要な前処理定義などの削除

File size: 7.4 KB
Line 
1' odbc.sbp
2
3#require <api_sqlext.sbp>
4
5'===========================================================
6' IOdbcConnection インターフェイス
7
8Dim IID_IOdbcConnection = [&HE0FC6F3C,&HDD4C,&H40f6,[&H82,&H8F,&H42,&H90,&H67,&H27,&H9C,&HDC]] As GUID
9Interface IOdbcConnection
10 Inherits IUnknown
11 Function Connect(lpszDataSource As LPSTR) As SQLRETURN
12 Function Disconnect() As SQLRETURN
13 Function CreateCommand() As *COdbcCommand
14End Interface
15
16Function OdbcConnection_CreateInstance() As *IOdbcConnection
17 Dim pobj_OdbcConnection As *COdbcConnection
18 pobj_OdbcConnection=New COdbcConnection()
19
20 pobj_OdbcConnection->QueryInterface(IID_IOdbcConnection,VarPtr(OdbcConnection_CreateInstance))
21End Function
22
23' ここまで
24'===========================================================
25
26
27
28Class COdbcConnection
29 m_ref As Long '参照カウンタ
30
31 hEnv As SQLHENV '環境ハンドル
32 hDbc As SQLHDBC '接続ハンドル
33
34Public
35 Sub COdbcConnection()
36 '環境ハンドルを取得
37 SQLAllocHandle( SQL_HANDLE_ENV, 0 , hEnv )
38 SQLSetEnvAttr ( hEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3 As SQLPOINTER, 0 )
39
40 '接続ハンドルを取得
41 SQLAllocHandle( SQL_HANDLE_DBC, hEnv, hDbc )
42 End Sub
43 Sub ~COdbcConnection()
44 '切断
45 Disconnect()
46
47 '接続ハンドルを解放
48 SQLFreeHandle( SQL_HANDLE_DBC, hDbc )
49
50 '環境ハンドルを解放
51 SQLFreeHandle( SQL_HANDLE_ENV, hEnv )
52 End Sub
53
54
55 Function GetEnvHandle() As SQLHENV
56 GetEnvHandle = hEnv
57 End Function
58 Function GetDbcHandle() As SQLHDBC
59 GetDbcHandle = hDbc
60 End Function
61
62
63
64 '-------------------------------------------------------
65 ' COMインターフェイス用IUnknownメソッド
66
67 Virtual Function QueryInterface(ByRef riid As IID, ppvObj As *VoidPtr) As HRESULT
68 If IsEqualIID(riid,IID_IOdbcConnection)<>0 or IsEqualIID(riid,IID_IUnknown)<>0 Then
69 Set_LONG_PTR(ppvObj,VarPtr(This) As LONG_PTR)
70 AddRef()
71 QueryInterface=S_OK
72 Else
73 Set_LONG_PTR(ppvObj,0)
74 QueryInterface=E_NOINTERFACE
75 End If
76 End Function
77
78 Virtual Function AddRef() As DWord
79 m_ref++
80 AddRef=m_ref
81 End Function
82 Virtual Function Release() As DWord
83 m_ref--
84 If m_ref=0 Then
85 Delete VarPtr(This)
86 End If
87 Release=m_ref
88 End Function
89
90 ' ここまで
91 '-------------------------------------------------------
92
93
94 '-------------------------------------------------------
95 ' 接続を確立
96 '-------------------------------------------------------
97 Virtual Function Connect(lpszDataSource As LPSTR) As SQLRETURN
98 Dim szConnStrOut[ELM(1024)] As Byte
99 Dim cbConnStrOut As SQLSMALLINT
100
101 'データベースへ接続する
102 Dim ret As SQLRETURN
103 ret=SQLDriverConnect(hDbc,
104 0,
105 lpszDataSource,
106 SQL_NTS,
107 szConnStrOut,
108 1024,
109 cbConnStrOut,
110 SQL_DRIVER_COMPLETE_REQUIRED)
111
112 Connect=ret
113 End Function
114
115
116 '-------------------------------------------------------
117 ' 切断
118 '-------------------------------------------------------
119 Virtual Function Disconnect() As SQLRETURN
120 Disconnect = SQLDisconnect(hDbc)
121 End Function
122
123
124 '--------------------------------
125 ' コマンド インスタンスを生成
126 '--------------------------------
127
128 Virtual Function CreateCommand() As *COdbcCommand
129 Dim pobj_Command As *COdbcCommand
130 pobj_Command=New COdbcCommand(VarPtr(This))
131
132 Return pobj_Command
133 End Function
134
135/*
136 Function ExecDirect(lpszSQL As LPSTR) As SQLRETURN
137 '前回のステートメントハンドルを解放
138 StmtFreeHandle()
139
140 'ステートメントハンドルを取得する
141 SQLAllocHandle( SQL_HANDLE_STMT, hDbc, hStmt )
142
143 'SQL文を発行
144 ExecDirect = SQLExecDirect( hStmt, lpszSQL, SQL_NTS )
145 End Function
146
147 Function Prepare(lpszSQL As LPSTR) As SQLRETURN
148 '前回のステートメントハンドルを解放
149 StmtFreeHandle()
150
151 'ステートメントハンドルを取得する
152 SQLAllocHandle( SQL_HANDLE_STMT, hDbc, hStmt )
153
154 Prepare = SQLPrepare( hStmt, lpszSQL, SQL_NTS ) 'SQL文を設定する
155 End Function
156
157 Function Execute() As SQLRETURN
158 Execute = SQLExecute( hStmt )
159 End Function*/
160End Class
161
162
163
164Class COdbcCommand
165Public
166 pobj_Connection As *COdbcConnection
167 hStmt As SQLHSTMT
168 CommandText As String
169
170 Sub COdbcCommand(pobj_Connection As *COdbcConnection)
171 This.pobj_Connection=pobj_Connection
172 End Sub
173 Sub ~COdbcCommand()
174 If hStmt Then
175 SQLFreeHandle( SQL_HANDLE_STMT, hStmt )
176 hStmt=0
177 End If
178 End Sub
179
180
181 Function ExecuteReader() As *COdbcDataReader
182 'DataReaderを構築
183 Dim pobj_DataReader As *COdbcDataReader
184 pobj_DataReader=New COdbcDataReader(VarPtr(This))
185
186 Return pobj_DataReader
187 End Function
188
189 Function Release() As DWord
190 Delete VarPtr(This)
191 End Function
192End Class
193
194
195Class COdbcData
196Public
197 lpszName As LPSTR
198 iType As SQLSMALLINT
199 iSize As SQLINTEGER
200
201 lpszValue As LPSTR
202
203 Sub COdbcData(lpszName As LPSTR, iType As SQLSMALLINT, iSize As SQLINTEGER)
204 This.lpszName=malloc(lstrlen(lpszName)+1)
205 lstrcpy(This.lpszName,lpszName)
206
207 This.iType=iType
208
209 This.iSize=iSize
210
211 lpszValue=malloc(iSize+1)
212 End Sub
213 Sub ~COdbcData()
214 free(lpszName)
215 lpszName=0
216
217 free(lpszValue)
218 lpszValue=0
219 End Sub
220End Class
221
222
223Class COdbcDataReader
224 pobj_Command As *COdbcCommand
225
226 Item As **COdbcData
227 iColNum As SQLSMALLINT
228
229 bFirstRead As BOOL
230
231 hStmt As SQLHSTMT
232
233Public
234
235 Sub COdbcDataReader(pobj_Command As *COdbcCommand)
236 This.pobj_Command=pobj_Command
237
238
239 'ステートメントハンドルを取得する
240 SQLAllocHandle( SQL_HANDLE_STMT,
241 pobj_Command->pobj_Connection->GetDbcHandle(),
242 hStmt )
243
244 'SQL文を発行
245 SQLExecDirect( hStmt, pobj_Command->CommandText, SQL_NTS )
246
247
248 '列数を取得
249 SQLNumResultCols(hStmt, iColNum)
250
251 '列データ格納領域を確保
252 Item=malloc(iColNum*SizeOf(*COdbcData))
253
254 Dim i As SQLSMALLINT
255 Dim szColName[255] As Byte
256 Dim acc_bytes As SQLSMALLINT
257 Dim iType As SQLSMALLINT, iSize As SQLINTEGER, scale As SQLSMALLINT, nullable As SQLSMALLINT
258 Dim displaysize As SQLINTEGER
259 For i=0 To ELM(iColNum)
260 '列属性を取得
261 SQLDescribeCol(hStmt,
262 i+1,
263 szColName,255,acc_bytes,
264 iType,
265 iSize,
266 scale,
267 nullable)
268
269 '文字列に換算したときの長さを取得
270 SQLColAttributes (hStmt,
271 i+1, SQL_COLUMN_DISPLAY_SIZE, NULL, 0,
272 ByVal NULL, displaysize)
273
274 If displaysize<lstrlen(szColName) Then
275 iSize=lstrlen(szColName)+1
276 Else
277 iSize=displaysize+1
278 End If
279
280 '単一データを生成
281 Item[i]=New COdbcData(szColName,iType,iSize)
282
283 'バインド
284 Dim idummy As SQLLEN
285 SQLBindCol(hStmt, i+1, SQL_CHAR, ByVal Item[i]->lpszValue, iSize, idummy)
286 Next
287
288 bFirstRead=1
289 End Sub
290 Sub ~COdbcDataReader()
291 Dim i As Long
292 For i=0 To ELM(iColNum)
293 Delete Item[i]
294 Next
295 free(Item)
296 Item=0
297
298 If hStmt Then
299 SQLFreeHandle( SQL_HANDLE_STMT, hStmt )
300 hStmt=0
301 End If
302 End Sub
303
304 Function GetFieldType(i As Long) As SQLSMALLINT
305 If i>=iColNum Then Return 0
306 Return Item[i]->iType
307 End Function
308
309 Function GetName(i As Long) As LPSTR
310 If i>=iColNum Then Return 0
311 Return Item[i]->lpszName
312 End Function
313
314 Function GetStrPtr(i As Long) As LPSTR
315 If i>=iColNum Then Return 0
316 Return Item[i]->lpszValue
317 End Function
318
319 Function Read() As BOOL
320 Dim ret As SQLRETURN
321 If bFirstRead Then
322 '先頭行へ移動する
323 SQLFetchScroll( hStmt, SQL_FETCH_FIRST, 0 )
324
325 ret = SQLFetch( hStmt )
326 If (ret = SQL_NO_DATA) Then Return 0
327
328 bFirstRead=0
329 Else
330 '次の行へ移動する
331 ret = SQLFetchScroll( hStmt, SQL_FETCH_NEXT, 0 )
332 If (ret = SQL_NO_DATA) Then Return 0
333 End If
334
335 Return 1
336 End Function
337
338 Virtual Function Release() As DWord
339 Delete VarPtr(This)
340 End Function
341End Class
Note: See TracBrowser for help on using the repository browser.