ผมทำโปรเจค บันทึกvdoวงจรปิดลงฐานข้อมูล อยากทราบโค๊ตที่ทำให้vbสามารถติดต่อกับoracleได้และโค๊ตที่ทำให้ vb ติดต่อกับกล้องcctvได้ด้วยอะครับ โปรเจคนี้บังคับใช้vb2005กับoracleคับ ยากๆๆมาก
Announcement
Collapse
No announcement yet.
vb&oracle
Collapse
X
-
ดูเหมือนจะทำเป็นอาชีพได้เลยนะครับ โปรเจ็คแบบนี้
Option Explicit
Private Sub Form_Load()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim txt As String
Dim fld As Field
' Open a connection using Oracle ODBC.
Set conn = New ADODB.Connection
conn.ConnectionString = _
"Driver={Microsoft ODBC for Oracle};" & _
"UID=user_name;PWD=user_passsword"
conn.Open
' Open the FuelTypes table.
Set rs = New ADODB.Recordset
rs.Open "TableName", conn, adOpenDynamic, adLockOptimistic, adCmdTable
' List the data.
Do While Not rs.EOF
txt = ""
For Each fld In rs.Fields
txt = txt & Trim$(fld.Value) & ", "
Next fld
If Len(txt) > 0 Then txt = Left$(txt, Len(txt) - 2)
List1.AddItem txt
rs.MoveNext
Loop
rs.Close
conn.Close
End SubDim con As ADODB.Connection
Dim rs1 As ADODB.Recordset
Private Sub Form_Load()
Set con = New ADODB.Connection
Set rs1 = New ADODB.Recordset
con.Open "Provider=MSDAORA.1;Password=xyz;UserID=raminder;Persist Security Info=True"
rs1.CursorLocation = adUseClient
rs1.Open "Tablename", con, adOpenStatic, adLockOptimistic, -1
End Sub
Dim Q As OraAQ
Dim QMsg As OraAQMsg
Set OO4OSession = CreateObject("OracleInProcServer.XOraSession")
Set empDb = OO4OSession.OpenDatabase("AQ_DUAL", "aq/aq", 0)
Set Q = empDb.CreateAQ("AQQUEUE")
'Specify the message value.
Set QMsg = Q.AQMsg(ORATYPE_OBJECT, "MESSAGE_TYPE", "AQ")
Set QMsg = Q.AQMsg
'HERE for Error ORA-25215 'user_data type and queue type do not match'
Q.Dequeue
# Oracle Code
PROCEDURE GetXML
(temp IN NUMBER,
OutputXML OUT CLOB)
IS
--.....Variable Declaration
BEGIN
OutputXML :=EMPTY_CLOB();
DBMS_LOB.CREATETEMPORARY(OutputXML,TRUE);
stCurrentXMLNode := ''; --Load XML Denotion
--Code to get data, make XML and store into CLOB variable goes here....
DBMS_LOB.WRITEAPPEND(OutputXML, LENGTH(stCurrentXMLNode),stCurrentXMLNode); --Finally complete Loading Data in OUTPUT CLOB
COMMIT;
END GetXML;
But VB 6 was not supporting this OUT CLOB parameter OutputXML and would throw Microsoft ODBC inconsistent Datatype or Access Violation Error for every datatype I tried (VB adDataypes)
Then what I did is divided this collected CLOB in distinct ARRAY (Table) of VARCHAR2 variables of some fixed size(say 4000) Using this code
CREATE OR REPLACE PACKAGE BODY MYPACKEGE
AS
TYPE tblXML IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER; --VRACHAR2 ARRAY Table
PROCEDURE GetXML
(temp IN NUMBER,
OutputXML OUT tblXML)
IS
--.....Variable Declaration
BEGIN
OutputXML :=EMPTY_CLOB();
DBMS_LOB.CREATETEMPORARY(OutputXML,TRUE);
stCurrentXMLNode := ''; --Load XML Denotion
--Code to get data, make XML and store into CLOB variable goes here....
DBMS_LOB.WRITEAPPEND(OutputXML, LENGTH(stCurrentXMLNode),stCurrentXMLNode); --Finally complete Loading Data in OUTPUT CLOB
--**************************************************************************************************************---
output_var := ' '; -- NonEmpty String
offset_var := 0; -- Offset To start chopping with
amount_var := 4000; -- Fixed SIze Varchar2
nCount := 0;
WHILE output_var <> ''
LOOP
DBMS_LOB.READ(OutputXML,amount_var,offset_var,output_var);
--Load character Chunk 'output_var' Cut from previous statement into Array element
OutputXML(nCount) := output_var;
nCount := nCount + 1;
offset_var:= amount_var + offset_var + 1;
END LOOP;
--**************************************************************************************************************---
COMMIT;
END GetXML;
End MYPACKAGE;
Now use following VB 6 code to load this into a Recordset, then loope thru recordset and load it into a String (max size 65K characters) or variant(max size 2G Characaters)
# VB Code
Dim objCmd As New ADODB.Command
Dim objRS As New ADODB.Recordset
Dim vXML As Variant
With objCmd
.ActiveConnection = "{Microsoft ODBC DSN ConnectionString}"
.CommandType = adCmdText
.CommandTimeout = 30
.CommandText = "{call MYPACKAGE.GetXML(?, {resultset 10000, OutputXML})}"
.Parameters.Append .CreateParameter("temp", adNumeric, adParamInput, , 1234) 'Input Paramneter
Set objRS = .Execute 'Load Output VARCHAR2 Array into RecordSet
vXML = ""
While Not objRS.EOF
vXML = vXML & objRS(0).Value 'Loading Large CLOB (by looped appending) into a Variant
objRS.MoveNext
Wend
End With
1.ลองดูขั้นตอนที่ 7,8 และ 9 จาก เอกสารนี้นะครับ
" http://www.exzilla.net/docs/starter/toc-oracle-01.php "
2. จากนั้น ขึ้นอยู่กับว่า คุณ จะเลือกใช้ VB ติดต่อ กับ Oracle ผ่านทางอะไร เช่น ODBC,OLE DB, OO4O
ลองดูแนวทางจาก URL นี้นะครับ
" http://www.exzilla.net/tech/windows/...#_Connectivity "
" http://www.exzilla.net/docs/dataAcce...ata-access.php "
ช่วยได้เท่านี้ละครับผม
-
อาจจะต้องมีเสียทรัพย์ได้ อ่านดูครับ
http://th.88db.com/th/Services/Post_...335&lang=en-us
ยากจริงๆครับ เพราะที่ผมเคยผ่านมา มันก็มีโปรแกรมให้อยู่แล้วครับผม
Comment
Comment