C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: VB6クラスから.NETへの変換


(過去ログ 20 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■8668 / inTopicNo.1)  VB6クラスから.NETへの変換
  
□投稿者/ キラ (1回)-(2007/10/05(Fri) 16:32:01)

分類:[.NET 全般] 

VB6でORACLE接続に関する部分をクラス化してました。
それをVB.NET若しくはC#で同様なクラスを作成したいと思っているのですが、
参考になるサイトなどが無くどのように書き換えればいいのか
まったく判りません。

わかる方がいましたら教えて頂きたく宜しくお願い致します


VB6のクラス

Private G_OraSs As Object 'Oracleセクション
Private G_OraDb As Object 'Oracleデータベース
Private G_OraRs As Object 'Oracleダイナセット

'プロパティ(読み取り専用)
Private LFieldCount As Long 'SQLのフィールド数
Private LRecordCount As Long 'SQLのレコード数

'#######################[ property ]############################
Public Property Get FieldCount() As Long
FieldCount = LFieldCount
End Property

Public Property Get RecordCount() As Long
RecordCount = LRecordCount
End Property

'########################[ events ]############################

'{Oracleデータベースに接続}
Public Function DBOpen(OraDatabaseName As String, _
OraUserName As String, _
OraPassword As String) As Boolean

DBOpen = True '正常終了時の戻り値

On Error Resume Next 'Error無視

'Oracleセッション参照作成
Set G_OraSs = CreateObject("OracleInProcServer.XOraSession")

If Err <> 0 Then '接続失敗したら
DBOpen = False 'エラー戻り値セット
Else '接続成功したら
'指定OracleDBオープン
Set G_OraDb = G_OraSs.OpenDatabase(OraDatabaseName, OraUserName & "/" & OraPassword, 0&)

If Err <> 0 Then 'DBオープンが失敗したら
DBOpen = False 'エラー戻り値セット
End If
End If

On Error GoTo 0

End Function

'{SQL実行 update, add}
Public Function SQL_Updata(ByVal strSql As String) As Boolean

Dim Record As Variant
Dim flg As Boolean

On Error GoTo AddUpErr

flg = True '成功
G_OraSs.BeginTrans
Record = G_OraDb.dbexecutesql(strSql)
G_OraSs.CommitTrans 'コミット
'G_OraSs.Rollback 'ロールバック

exitExec:
SQL_Updata = flg
Exit Function

AddUpErr:
flg = False
Resume exitExec:

End Function

'{SQL実行 select}
Public Function SQL_Run(ByVal strSql As String) As Long

Dim i As Integer 'カウンタ
Dim f_count As Integer 'SQLのフィールド数
Dim line As String 'カンマ文字列
Dim edpno As String
Dim ItemNo As Integer
Dim tmp As String


On Error Resume Next

LRecordCount = 0

Set G_OraRs = G_OraDb.CreateDynaset(strSql, 0&) '参照クエリーを実行(レコードセットが帰る)

If Err <> 0 Then '実行失敗?
G_OraRs.Close 'レコードをクローズ
Else '実行成功
If G_OraRs.EOF = False Then 'データあり?
LFieldCount = G_OraRs.Fields.Count 'フィールド数
LRecordCount = G_OraRs.RecordCount 'レコード数
G_OraRs.MoveLast 'カーソル全移動して
G_OraRs.MoveFirst 'カーソルを確定
End If
End If

SQL_Run = LRecordCount '結果を返す

End Function

'ダイナセットクリア
Public Sub DynasetClear()
'G_OraRs.Clear
Set G_OraRs = Nothing
End Sub


■特にこの部分が知りたいです
 データの前後を取りたいときなどがあるため、このような方法は必須なんです
'指定されたレコードを返す
Public Function ItemCells(ARow As Long, acol As Long) As String

On Error GoTo ItemErr

G_OraRs.MoveTo (ARow)
ItemCells = CStr(G_OraRs.Fields(acol).Value)

Exit Function

ItemErr:
ItemCells = vbNullString

End Function

'指定されたフィールド名を取得
Public Function FieldName(ACool As Long) As String

On Error GoTo Err_Filed

FieldName = G_OraRs.FieldName(ACool)
Exit Function

Err_Filed:
FieldName = ""

End Function

'レコードセットクローズ
Public Sub RecordSetClose()

On Error Resume Next
G_OraRs.Close
Set G_OraRs = Nothing
End Sub

'{Oracle切断}
Public Sub DBClose()

On Error Resume Next

Call RecordSetClose

G_OraDb.Close
Set G_OraDb = Nothing

Set G_OraSs = Nothing

On Error GoTo 0

End Sub






引用返信 編集キー/
■8669 / inTopicNo.2)  Re[1]: VB6クラスから.NETへの変換
□投稿者/ エキサ (1回)-(2007/10/05(Fri) 16:51:02)
参考になるサイトはいくらでもあると思いますが。
http://www.atmarkit.co.jp/fdb/rensai/odpdotnet01/odpdotnet01.html

後は同じ処理をする関数に置き換えていけばいいだけ。
ODP.NETの仕様を見ながら元ソースと見比べてやればできるはず。

引用返信 編集キー/
■8670 / inTopicNo.3)  Re[2]: VB6クラスから.NETへの変換
□投稿者/ Jitta on the way (19回)-(2007/10/05(Fri) 19:06:37)
2007/10/05(Fri) 22:28:03 編集(投稿者)

No8669 (エキサ さん) に返信
> 後は同じ処理をする関数に置き換えていけばいいだけ。
> ODP.NETの仕様を見ながら元ソースと見比べてやればできるはず。
>

たぶん、無理
ADO.NETは、名前こそ同じだけど、ADOと技術が違うから。

特に「必要です」の箇所。DataSet.Fillなどで、メモリ上に展開してしまって下さい。そのため接続も、できるだけ、メソッドを抜ける前に閉じて下さい。


追加:::
> Private G_OraSs As Object 'Oracleセクション
> Private G_OraDb As Object 'Oracleデータベース
> Private G_OraRs As Object 'Oracleダイナセット
 この辺は、おそらく不要。ODP.NET をダウンロード&インストールして、リファレンスを読んでください。

> Private LFieldCount As Long 'SQLのフィールド数
> Private LRecordCount As Long 'SQLのレコード数
 Structured Query Language(構造化問い合わせ言語)にフィールド数やレコード数はありません。「問い合わせ結果の」ですね。

> Public Property Get FieldCount() As Long
> FieldCount = LFieldCount
> End Property
これは、こんな感じで。
Public Property FieldCount() As Long
  Get
    Return データセット.Columns.Count ' 後述
  End Get
End Property

> On Error Resume Next 'Error無視
これは削って、Try 〜 Finally で実装してください。必要なら、Catch もしてください。
詳しいことは、リファレンスを読んでください。

> 'Oracleセッション参照作成
> Set G_OraSs = CreateObject("OracleInProcServer.XOraSession")

> ■特にこの部分が知りたいです
>  データの前後を取りたいときなどがあるため、このような方法は必須なんです
> '指定されたレコードを返す
「このような方法」は、不要になります。
ADO.NET は、非接続型のデータベース アクセス コンポーネントです。「非」接続なので、接続していません。接続していないので、ダイナセットのような「カーソルを戻す」操作は不要です。

では、どうするかというと、ローカルにデータテーブルのコピーができあがっています。そのコピーを操作します。
詳しくは、ADO.NET に関するリファレンス、DataTable や Datacolumn, DataRow のリファレンスを読んでください。

引用返信 編集キー/
■8692 / inTopicNo.4)  Re[3]: VB6クラスから.NETへの変換
□投稿者/ はつね (287回)-(2007/10/07(Sun) 00:39:31)
No8670 (Jitta on the way さん) に返信
> 2007/10/05(Fri) 22:28:03 編集(投稿者)
> ■No8669 (エキサ さん) に返信
>>後は同じ処理をする関数に置き換えていけばいいだけ。
>>ODP.NETの仕様を見ながら元ソースと見比べてやればできるはず。
>
> たぶん、無理
> ADO.NETは、名前こそ同じだけど、ADOと技術が違うから。

そのとおりです。まあ、元ネタはoo4oだと思われますが変更するのに必要な考え方は一緒。
ODP.NETの使い方、そのまえにADO.NETの使い方(ここでおぼえたことはODP.NETでも有効です)を調べて、かきかえていくのがいいかと。
元のつくりにもよるけれど、なれちゃえばその部分はそれほど大変じゃないですよ。

#VB2005からoo4o使うこともできますけどね。
引用返信 編集キー/
■8716 / inTopicNo.5)  Re[4]: VB6クラスから.NETへの変換
□投稿者/ キラ (2回)-(2007/10/09(Tue) 08:19:11)
皆様
ご返事有難うございます

ODP.NETにおいては考えてみましたが、クライアントにインストールする必要があるため
やめました。
ORACLEのデータベース自体が古い(Ver 7.3)のため既存のADO.Netもしくは他のやり方
をさがしていましたが、なかなか見つけるのに苦労しております
そのため、VB6のときのクラスを元に変更する事しかないのかな?と思い皆様の知恵を
お借りしたかったものです

ODP.NETを使わない方法となるとADO.NETについて調べればいいのでしょうか?
若しくはもっといい方法があるのであれば教えて頂きたく思っております

皆様のご返事に感謝致します


引用返信 編集キー/
■8720 / inTopicNo.6)  Re[5]: VB6クラスから.NETへの変換
□投稿者/ 魔界の仮面弁士 (451回)-(2007/10/09(Tue) 10:06:55)
No8716 (キラ さん) に返信
> ORACLEのデータベース自体が古い(Ver 7.3)のため既存のADO.Netもしくは他のやり方
> をさがしていましたが、なかなか見つけるのに苦労しております

バージョンを上げる事はできないのでしょうか?

(ODP.NET ではなく).NET Framework に標準で含まれる System.Data.OracleClient を使ったとしても、
最低でも Oracle 8i Release 3 (8.1.7) Client 以降が必要になります。DB は 7.3 でも構いませんが。
http://msdn2.microsoft.com/ja-jp/library/2d7h4ycx%28VS.80%29.aspx

# 名前空間が Microsoft.Data.OracleClient だったころ、8.1.6 クライアントで接続したことが
# ありますが、Openしようとすると、System.EntryPointNotFoundException 例外が発生して、
# 『DLL oci.dll の OCIEnvCreate というエントリ ポイントが見つかりません。』
# と言われて、動作しませんでした…。


で。Oracle 7.3 クライアントによる.NET 環境からの接続が可能かどうかは把握していませんが、
Oracle への接続として、System.Data.OracleClient 以外の選択肢として残るのは、
 《ADO.NET 系》
  ・System.Data.OleDb 名前空間 + MSDAORA プロバイダ
  ・System.Data.Odbc 名前空間 + 各社の Oracle 用 ODBC ドライバ
 《COM 接続系》
  ・oo4o
  ・ADO + MSDAORA プロバイダ
  ・ADO + ODBC プロバイダ + 各社の Oracle 用 ODBC ドライバ
  ・DAO の ODBC Direct モード
  ・DAO の ODBC パススルークエリ
などがあります。(7.3 クライアントから利用可能かどうかは不明ですが)
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -