前陣子,也是 User 提出的需求,他希望能夠用 Excel 把資料倒進 Oracle,雖然 Oracle 有 SQL Loader,但是對 User 來說,那不是一個簡單的東西,所以呢,他想要「直接」用 Excel。

雖然可以使用 ODBC 或者 ADO,但是顧問告訴我們一個小東西 : OO4O

OO4O 簡介
(Oracle Object For Ole),Oracle 所提供的 Native OLEDB Driver,效能比 ADO 好

就衝著它比 ADO 效能更好,就在 Excel VBA 中實現它吧。

不過,也沒人教怎麼用 Orz
在 Google 找半天的結果,給我翻到了一個日文網頁,剛好有寫用法

參考網址 : http://homepage1.nifty.com/shimajun/ora.htm
原文如下 :

VisualBasic から OO4O を使って、表にアクセスしてみる(その他更新編)


Select 編は、読んでいただけましたか?Dynaset を使用する方法と、Bind を使用した参照方法、2つを書きました。
単なる1レコードの読みこみ(照会)だけならば、Dynaset で十分です。コーディングも短いですし、気軽に使えます。

ようは、適材適所というか、○鹿の一つ覚えのように、Dynaset を使うのはダメということです。

さて、参照の次は当然、更新,追加,削除です。参照を含めて、この4つが使えれば、大体のPGは問題なく作成できます(よね?)

1.Dynaset を使う

参照の時に使った、Dynaset を用いて、更新,追加,削除をしましょう。
--------------------------------------------------------------------------------
Dim W_Sql   As Object
Dim W_Dyna As Object

W_Sql = "select item1 from tblA"

Set W_Dyna = OraDatabase.dbCreateDynaset(W_Sql,&H0&)

W_Dyna.dbEdit '(A)
W_Dyna.fields("item1") = "ABC" '(B)
W_Dyna.dbUpdate '(C)
--------------------------------------------------------------------------------
簡単です。超が付くほど。

(A) では、「これからレコードの編集をするぞ」と宣言し、
(B) にて、更新対象の項目に、値をセットし、
(C) で、更新を実行しています。

更新処理(Update) を行うには、dbUpdate メソッドを、Dynaset に対して実行してやれば良いのです。
(当然、カレントレコードが対象になります)

なにも考えてないコーディングですが、これだけで更新できます。実際にはもっと項目が多いですから、
コーディングは煩雑ですけど。

追加の場合はこうです。
--------------------------------------------------------------------------------
Dim W_Sql   As Object
Dim W_Dyna As Object

W_Sql = "select item1 from tblA"

Set W_Dyna = OraDatabase.dbCreateDynaset(W_Sql,&H0&)

W_Dyna.dbAddNew '(A)
W_Dyna.fields("item1") = "ABC" '(B)
W_Dyna.dbUpdate '(C)
--------------------------------------------------------------------------------
更新の時と、そう差が有りません。
dbEdit メソッドが、dbAddNew メソッドに変わるだけです。最終的に、(C)の dbUpdate を実行した時点で、
Insert されます。

さらに、削除の場合は、こうです。
--------------------------------------------------------------------------------
Dim W_Sql   As Object
Dim W_Dyna As Object

W_Sql = "select item1 from tblA"

Set W_Dyna = OraDatabase.dbCreateDynaset(W_Sql,&H0&)

W_Dyna.dbDelete '(A)
--------------------------------------------------------------------------------
これはもう、こんなんで良いんでしょうか、っていうくらい簡素なコードです。
これで簡単に削除されてしまうレコードは、カワイソウになってきます。

2.Dynaset を使わない更新操作

当然、Dynaset を使用しなくても、更新や追加,削除は可能です。
1件ずつの更新や削除なら、Dynaset でも良いと思います。しかし、まとめて更新や削除するとき
には、いちいち Dynaset を使う必要はありません。

SQL 文を実行するために、dbExecuteSQL メソッドを使います。
例を見ていただくと、一目瞭然でしょう。

(1)更新

Dim W_Sql        As String

W_Sql = "update "
W_Sql = W_Sql & "tblA "
W_Sql = W_Sql & "set "
W_Sql = W_Sql & "item1 = 'AAA'"
W_Sql = W_Sql & "where "
W_Sql = W_Sql & "item2 = '123'"

OraDatabase.dbExecuteSQL(W_Sql)

(2) 削除

Dim W_Sql        As String

W_Sql = "delete from "
W_Sql = W_Sql & "tblA "
W_Sql = W_Sql & "where "
W_Sql = W_Sql & "item2 = '123'"

OraDatabase.dbExecuteSQL(W_Sql)

いかがでしょうか。更新用の SQL 文を作成して、dbExecuteSQL にて実行するだけです。
簡単ですね。
対象が1件だけなら、Dynaset と変わりないかも知れませんが、複数件有るときはとても
便利です。

arrow
arrow
    全站熱搜

    Aloz 發表在 痞客邦 留言(3) 人氣()