Lập trình VB với Oracle Database
KẾT NỐI VÀO ORACLE - Bài 6: Lập trình VB với Oracle DatabaseTác giả: www.oravn.comQua bài này tôi muốn giới thiệu với các bạn đặc biệt các bạn đang lập trình với VB lớp ứng dụng Oracle Object for OLE (OO4O) do Oracle cung cấp cho phép kết nối và thao tác với Oracle database dễ dàng, hiệu quả hơn.1. Sơ lược về OO4O Thông thường khi sử dụng ODBC hay OLE DB để kết nối với một cơ sở dữ liệu nói chung và Oracle database nói riêng thì dữ liệu phải chuyển tiếp qua nhiều lớp ứng dụng làm cho việc xử lý dữ liệu trở nên chậm chạm. Ngoài ra, các object mà các lớp ứng dụng này cung cấp không có những tính năng giúp pháp huy ngôn ngữ cũng như tận dụng hết những tính năng mạnh của Oracle database. OO4O được thiết kế nhằm giúp truy cập dữ liệu trong Oracle Database được dễ dàng từ các ngôn ngữ lập trình có hỗ trợ Microsoft COM Automation và ActiveX. OO4O cung cấp những đặc điểm giúp kết nối và thao tác với Oracle database dễ dàng, hiệu quả trong môi trường ứng dụng client/server cũng như multi-tier. Đặc biệt, các object trong OO4O có thể thực thi theo syntax PL/SQL giúp khắc điểm yếu về xử lý lỗi trong VB.Hình bên dưới mô tả các lớp ứng dụng mà dữ liệu sẽ đi qua khi chung ta kết nối với Oracle database. a) Cài đặt: Các bạn có thể check vào option Oracle Objects for OLE trong mục Oracle9i Development Kit khi cài Oracle database server hoặc download riêng các version khác nhau của OO4O ở đường link này: http://www.oracle.com/technology/software/tech/windows/ole/index.html Khi download về các bạn sẽ có một file .exe, các bạn chạy file .exe này để extract file ra thư mục oo4o, rồi chạy tiếp Oracle Universal Installer chọn source path là oo4o/stage/products.jar để setup. b) Key objects OraSessionLà đối tượng quản lý tập hợp các đối tượng OraDatabase, OraConnection, and OraDynaset sử dụng một applicationOraDatabaseThể hiện một session đến database và cung cấp phương thức thực thi các câu lệnh SQL và PL/SQL. Khởi tạo OraDatabase object bằng cách gọi phương thức OpenDatabase của OraSession objectOraDynasetCho phép xem và hiệu chỉnh dữ liệu từ câu truy vấn SQL. Được khởi tạo bằng phương thức CreateDynaset or CreatePLSQLDynaset của OraDatabase object.OraSQLStmtĐại diện một câu lệnh SQL đã được parse (để thực thi nhiều lần). Được khởi tạo với phương thức CreateSQL của OraDatabase object.OraParameterCác biến truyền cho câu lệnh SQL hay block PL/SQL. Được khởi tạo, truy xuất và loại bỏ một các dán tiếp qua tập hợp OraParameters của OraDatabase object.OraMetaDataTập hợp các OraMDAttribute chứa thông tin về một object nào đó trong database. OraMDAttribute Mô tả thuộc tính của một object nào đó trong database.Ngoài ra, còn một số các object khác ít được sử dụng, cũng như chi tiết các lựa chọn của các object các bạn tham khảo file help oracle_home/mshelp/oracleo.hlp sau khi đã cài OO4O 2. Examples: để sử dụng các object trong OO4O, trước tiên, trong VB project, các bạn references đến Oracle InProc Server 4.0 Type Library/** khởi tạo OraSession object */ Dim orasess As Object Set orasess = CreateObject("OracleInProcServer.XOraSession") or Dim orasess As OraSession Set orasess = New OraSessionClass or Dim orasess As New OraSessionClass /** khởi tạo OraDatabase object */ Dim oradb As OraDatabase Set oradb = orasess.OpenDatabase("oraedu", "scott/tiger", ORADB_ORAMODE) /** khởi tạo OraDynaSet object */ Dim orads As OraDynaset Set orads = oradb.CreateDynaset("select * from employees", &H0&) While Not orads.EOF MsgBox orads.Fields(0).Value + " - " + orads.Fields(1).Value orads.MoveNext Wend /** khởi tạo OraSQLStmt object */ Dim orastmt As OraSQLStmt … oradb.Parameters.Add "p_name", "new name", ORAPARM_INPUT oradb.Parameters("p_name").serverType = ORATYPE_VARCHAR2 oradb.Parameters.Add "p_id", 100, ORAPARM_INPUT oradb.Parameters("p_id").serverType = ORATYPE_NUMBER Set orastmt = oradb.CreateSql("begin update employees " & _ "set last_name = :p_name " & _ "where employee_id = :p_id; " & _ "commit; end;", ORASQL_NO_AUTOBIND) … ' thực thi lại oradb.Parameters("p_name").Value = "revised name" orastmt.Refresh ' không thực thi được với option ORASQL_NONBLK /** khởi tạo OraMetaData và OraMDAttribute object */ Dim orameta As OraMetaData Dim oracols As OraMetaData Dim oracol As OraMetaData Dim oramdattr As OraMDAttribute … Set orameta = oradb.Describe("employees") Set oramdattr = orameta!ColumnList If (oramdattr.IsMDObject()) Then Set oracols = oramdattr.Value For I = 0 To oracols.Count - 1 Set oracol = oracols(I).Value MsgBox "Column: " & oracol!Name & " DataType: " & oracol!Datatype Next I End If /** Trước tiên, các bạn chạy đoạn code ở phần server code sample ở sqlplus để tạo các thủ tục được gọi trong các ví dụ. Ví dụ dưới đây đưa ra nhiều các khác nhau để khởi tạo một OraDynaset object. Các bạn comment các đoạn code còn lại trước khi chạy */ Private Sub Command1_Click() Dim orasess As New OraSessionClass Dim oradb As OraDatabase Dim orads As OraDynaset Set oradb = orasess.OpenDatabase("oraedu", "scott/tiger", &H0&) ' cách 1: tạo từ một câu truy vấn sql sử dụng phương thức CreateDynaset Set orads = oradb.CreateDynaset("select * from employees", &H0&) ' cách 2: tạo từ một ref cursor sử dụng phương thức CreatePLSQLDynaset. Đây là một dynaset readonly oradb.Parameters.Add "p_table_name", "EMPLOYEES", ORAPARM_INPUT oradb.Parameters("p_table_name").serverType = ORATYPE_VARCHAR2 oradb.Parameters.Add "p_where", "", ORAPARM_INPUT oradb.Parameters("p_where").serverType = ORATYPE_VARCHAR2 Set orads = oradb.CreatePlsqlDynaset("begin pack1.gettables(:p_table_name,:p_where,:result); end;", "result", &H0&) ' cách 3: tạo từ một ref cursor sử dụng bien output kieu cursor và phương thức ExecuteSQL. Đây là một dynaset readonly oradb.Parameters.Add "p_output", Null, ORAPARM_OUTPUT oradb.Parameters("p_output").serverType = ORATYPE_CURSOR oradb.Parameters.Add "p_table_name", "employees", ORAPARM_INPUT oradb.Parameters("p_table_name").serverType = ORATYPE_VARCHAR2 oradb.Parameters.Add "p_error", 0, ORAPARM_OUTPUT oradb.Parameters("p_error").serverType = ORATYPE_NUMBER oradb.ExecuteSQL "begin :p_output := pack1.gettableinfo(:p_table_name,:p_error); end;" Set orads = oradb.Parameters.Item(0).Value '------------- While Not orads.EOF MsgBox orads.Fields(0).Value + " - " + orads.Fields(1).Value orads.MoveNext Wend orads.Close oradb.Close Set orasess = Nothing End Sub /** ví dụ này cho chung ta chi tiết thông tin, thuộc tính của một table trong database */ Private Sub Command2_Click() Dim orasess As New OraSessionClass Dim oradb As OraDatabase Dim orameta As OraMetaData Dim oracols As OraMetaData Dim oracol As OraMetaData Dim oramdattr As OraMDAttribute Set oradb = orasess.OpenDatabase("oraedu", "scott/tiger", &H0&) Set orameta = oradb.Describe("employees") ' retrieve metadata object ' hiển thị các thuộc tính MsgBox TypeofMetaData & orameta.Type MsgBox "Is Clustered: " & orameta!IsClustered MsgBox "Is Partitioned: " & orameta!IsPartitioned Set oramdattr = orameta!ColumnList ' retrieve column list If (oramdattr.IsMDObject()) Then Set oracols = oramdattr.Value ' hiển thị tên và kiểu dữ liệu của các cột For I = 0 To oracols.Count - 1 Set oracol = oracols(I).Value MsgBox "Column: " & oracol!Name & " DataType: " & oracol!Datatype Next I End If oradb.Close Set orasess = Nothing End Sub Sử dụng Oracle Data Control Tương tự như ADODC, chúng ta sử dụng Oracle data control làm data source cho lưới. Các bạn set các thuộc tính sau: Connect: là username và password (vd: scott/tiger) DatabaseName: là service name, có thể là TNSName hoặc Hostname, . RecordSource: câu truy vấn SQL. Server code sample: create or replace function findtable(p_name in varchar2) return number is v_name user_tables.table_name%type; begin select table_name into v_name from user_tables where lower(table_name) = lower(p_name); return 1; exception when no_data_found then return 0; end; / create or replace package pack1 is type curtype is ref cursor; function getTableInfo(p_name in varchar2, p_error out number) return curtype; procedure getTables(p_name in varchar2, p_where in varchar2, p_output out nocopy curtype); end pack1; / create or replace package body pack1 is function getTableInfo(p_name in varchar2, p_error out number) return curtype is info_cursor curtype; begin p_error := 0; open info_cursor for 'select * from ' || p_name; return (info_cursor); exception when others then p_error := sqlcode; end getTableInfo; procedure getTables(p_name in varchar2, p_where in varchar2, p_output out nocopy curtype) is begin if findtable(p_name) != 1 then null; end if; if (p_where is null) then open p_output for 'select * from ' || p_name; else open p_output for 'select * from ' || pname ||' '|| p_where; end if; exception when others then null; end getTables; end pack1; / . bạn đang lập trình với VB lớp ứng dụng Oracle Object for OLE (OO4O) do Oracle cung cấp cho phép kết nối và thao tác với Oracle database dễ. KẾT NỐI VÀO ORACLE - Bài 6: Lập trình VB với Oracle DatabaseTác giả: www.oravn.comQua bài này tôi muốn giới thiệu với các bạn đặc biệt