I want to import data from Oracle database to Excel using VBA. I've tried several options I found in here or in the official manual but none of them seem to work for me - I always get the same unspecified runtime error on line with
rs.Open strSQL1, con
or
Set rs = con.Execute(strSQL1)
depending on which one of these two methods I use obviously. Here is the whole code:
Sub data_distribution()
'Setting up the database connection
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL1, strInput, strCon As String
Set con = New ADODB.Connection
Set rs = New ADODB.Recordset
strCon = "Driver={Microsoft ODBC for Oracle}; " & _
"CONNECTSTRING=(DESCRIPTION=" & _
"(ADDRESS=(PROTOCOL=TCP)" & _
"(HOST=XXX)(PORT=XXX))" & _
"(CONNECT_DATA=(SERVICE_NAME=XXX))); uid=XXX; pwd=XXX;"
'--- Open the above connection string.
con.ConnectionString = strCon
con.Open
'con.Open strCon
'--- Now connection is open and you can use queries to execute them.
'--- It will be open till you close the connection
'Definition of parameter
strInput = InputBox("Insert car_id")
strSQL1 = "select * from car where car_id = " & strInput & ""
'Executing the query
'rs.activeconnection = con
'rs.Open strSQL1, con
Set rs = con.Execute(strSQL1)
rs.Open strSQL1, con
Worksheets("Data").Range("A2").CopyFromRecordset rs
'Closing connection
rs.Close
con.Close
Set con = Nothing
Set rs = Nothing
I was thinking it might be an issue of connecting to the database but if I import/query data manual, it works just fine. For example using this manual
http://blog.mclaughlinsoftware.com/microsoft-excel/how-to-query-oracle-from-excel-2007/
I had to download and configure ODAC for Windows from Oracle site to make it work. I use tsnames.ora to set the path. Wasn't sure if I configured it right but it works so I guess there isn't a problem with the connection in vba either, or is it? (The variables are, of course, set to real values, not "XXX")
The query itself is correct and returns valid results from the database. Libraries necessary to use ADOBD are linked as well. (Microsoft ActiveX Data Objects 2.0 Library)
There is an existing question with the same error but it's unresolved:
Unspecified run time error while executing vba script
I'm guessing it's station/interface specific (I use Excel 2010, SQL developer).
Even though it's been some time I asked the question, here, it's still unresolved so I will answer myself.
The problem was in the car table where one of the attributes was type CLOB (CHARACTER LARGE OBJECT) with lenght over 2000 characters. Excel was unable to cope with that type and the query caused the unspecified error. If I listed all attributes but this one, it all went well.
Related
I'm trying to find out the names of the tables.DBF, which are in a hard drive directory.
Subsequently, I need to know the names of their columns, but even the names of the tables I do not know how to find out. Standard SQL tools do not work, it's logical. The script is run on the site under IIS (win server 2008), VBScript. For the connection, I use the driver: AccessDatabaseEngine_X64.
The selection from the specific tables is working, create, delete the table - it works. Connection code:
<%#LANGUAGE="VBSCRIPT" CODEPAGE=1251%>
<%
Function OpenDBFConn(Path)
Dim Conn: Set Conn = CreateObject("ADODB.Connection")
Conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & Path & ";" & _
"Extended Properties=""DBASE IV;"";"
Set OpenDBFConn = Conn
End Function
Dim DBConn
Set DBConn = OpenDBFConn("C:\update")
Dim Lel
Set Lel = DBConn.Execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE table_type='BASE TABLE'")
%>
The script result:
The Microsoft Access database engine could not find the object 'INFORMATION_SCHEMA.TABLES'. Make sure the object exists and that you spell its name and the path name correctly. If 'INFORMATION_SCHEMA.TABLES' is not a local object, check your network connection or contact the server administrator.
This is logical. Here, the methods for accessing the system table will not work, because they are not. Question - how do I know the names of the tables in the 'Update' folder? Screenshot of the folders:
1) Table names. As it's already mentioned, get table names (i.e. M1072R, M10201, etc.) by using FileSystemObject:
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Set fo=fs.GetFolder("C:\update")
For Each x in fo.files
If LCase(fs.GetExtensionName(x.path)) = "dbf" Then
Response.Write fs.GetBaseName(x.path) & ";"
End if
Next
2) Column names:
'Dim Lel
'Set Lel = DBConn.Execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE table_type='BASE TABLE'")
Set rs=Server.CreateObject("ADODB.Recordset")
rs.Open "M1072R", DBConn
'-- where M1072R is your table/dbf file
For Each f In rs.Fields
Response.Write "Column=" & f.Name & ";"
Next
Another way to get columns is to use OpenSchema
Set rs=DBConn.OpenSchema(4, Array(Null, Null, "M1072R"))
'-- where M1072R is your table/dbf file,
'-- 4 stands for adSchemaColumns
Do While Not rs.EOF
Response.Write "Column=" & rs.Fields("COLUMN_NAME").Value & ";"
rs.MoveNext
Loop
In VBA macro in Excel I have an issue where the exact same query with the exact same database credentials are returning different results depending on what computer the script is being executed. Some pull all of the correct results, others have results missing.
If we execute the query using Toad or any other tool that can execute oracle it has worked correctly on every machine tested.
So far we have found out that the following things are not causing the issue:
Oracle Driver version (instant client vs full both tested no correlation found)
Excel versions (everyone at my company has the same build of excel)
VBA project references are the same.
Confirmed all machines are pointing to the correct database.
ODBC Settings are the same
All machines tested are running Excel 2010 on windows 7, The Database is Oracle 11,
Here is the script
Dim cn
Set cn = CreateObject("ADODB.Connection")
Dim rs
Set rs = CreateObject("ADODB.Recordset")
cn.ConnectionString = "DSN=#####;UID=####;PWD=#####;DBQ=######;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F"`
`cn.Open`
`Set rs = cn.Execute(SQLfinal)`
Dim iCol As Integer
Dim iRow As Integer
fldCount = rs.Fields.Count
For iCol = 1 To fldCount
Sheets("8. Data").Cells(12, iCol).Value = rs.Fields(iCol - 1).Name
Next
Sheets("8. ####").Cells(13, 1).CopyFromRecordset rs
rs.Close
Set rs = Nothing
cn.Close
Rows("12:12").Select
Selection.AutoFilter
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent1
.TintAndShade = 0.599993896298105
.PatternTintAndShade = 0
End With
I am trying to connect my vb 6.0 application to the database , so i have declared my data base as Dim dbStu as Database,but while compiling it is giving me error user defined type not defined , i found on another thread that , i need to add the Microsoft Active x Data Objects 2.8 for xp.I have done that too.so now my doubt is am i doing this correct ? should i have to declare those data base variable in form only ?.Or is there anything that is causing the error
you must add a reference to Microsoft Active x Data Objects 2.8 or later
then declare an ADODB.Connection and open it with proper ConnectionString value that specify your database path and if it has a password a password value
and then you can use this connection object to get data from your database or insert data to it
public cnn As ADODB.Connection
public rs As ADODB.Recordset
Set cnn = New ADODB.Connection
cnn.Open "PROVIDER=MSDataShape;DATA PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source= DatabasePath\DatabaseName.mdb ;Jet OLEDB:Database " 'Password= DataBasePassword ;"
Set rs = New ADODB.Recordset
rs.Open "Select * from FZONE ", cnn, adOpenDynamic, adLockOptimistic
We have very old VB6 applications connecting to a Sybase database. Today they are running fine using the Open Client 12 drivers via ODBC connecting to a Sybase ASE 15 servers.
There is a plan on upgrading to the OpenClient 15 drivers and with that version I'm getting this error:
Run-time error '-2147467259(80004005)'
Transaction cannot have multiple recordsets with this cursor type.
Change the cursor type, commit the transaction, or close one of the recordsets.
As I understand searching the internet, the problem is in the Cursors.
In the old drivers in the ODBC configuration manager there was a Performance Tab and we have the Select Method in cursor, but with the new drivers this tab is gone and all we got about cursors is a section in the General tab named Cursor Behavior, in there we have the option Use Cursors checked.
Here is a little code snippet where I can reproduce the problem. All help is appreciated.
Dim conObj As ADODB.Connection
Dim objRs As ADODB.Recordset
Dim objRs2 As ADODB.Recordset
Set conObj = New ADODB.Connection
conObj.ConnectionTimeout = 10
conObj.CommandTimeout = 5
conObj.Provider = "MSDASQL"
conObj.Open "DSN=cdbur32;UID=***;PWD=***;Database=dbsait;WSID=Test;APP=Test"
conObj.CursorLocation = adUseClient
conObj.BeginTrans
Set objRs = New ADODB.Recordset
Set objRs.ActiveConnection = conObj
objRs.Source = "select id_estatus_aplicacion from dbo.cat_sait_estatus_aplicaciones"
objRs.CursorType = ADODB.CursorTypeEnum.adOpenForwardOnly
objRs.LockType = ADODB.LockTypeEnum.adLockReadOnly
objRs.Open
objRs.MoveNext
Debug.Print objRs("id_estatus_aplicacion")
Set objRs2 = New ADODB.Recordset
Set objRs2.ActiveConnection = conObj
objRs2.Source = "select * from dbo.cat_sait_estatus_aplicaciones"
objRs2.CursorType = ADODB.CursorTypeEnum.adOpenForwardOnly
objRs2.LockType = ADODB.LockTypeEnum.adLockReadOnly
objRs2.Open 'error here
objRs.MoveNext
Debug.Print objRs("id_estatus_aplicacion")
conObj.RollbackTrans
objRs.Close
objRs2.Close
Set conObj = Nothing
Does changing lines
objRs.CursorType = ADODB.CursorTypeEnum.adOpenForwardOnly
and
objRs2.CursorType = ADODB.CursorTypeEnum.adOpenForwardOnly
help?
in the end the Sybase guys send us a new drivers and that fixed the problem
I am trying to retrieve an oracle field with datatype clob into a VB array without reformating the retrieval SQL string (simply SELECT * FROM my_table). I am using an ADO recordset.
The clob values are lost when I close the connection or do any other action with the recordset. How can I achieve this.
In one of my projects I tried to manipulate BLOBs and CLOBs using ADO, but without any success, until I switched to Oracle Objects 4 OLE. You need to install and configure Oracle client on your machine, the in project references add "Oracle InProc Server 4.0 Type Library".
Here's a sample code I used for BLOBs:
Dim OraSession As OracleInProcServer.OraSessionClass
Dim OraDatabase As OracleInProcServer.OraDatabase
Dim OraDynaset As OracleInProcServer.OraDynaset
Dim srcImg As OraBlob
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.DbOpenDatabase("myDBName", "login/password", 0&)
Set OraDynaset = OraDatabase.DbCreateDynaset("SELECT src_id, src_image from Sources where src_file_name like '%.png'", 0&)
With OraDynaset
If .RecordCount > 0 Then
.MoveFirst
While (Not .EOF Or .BOF)
Set srcImg = .Fields("src_image").Value
srcImg.CopyToFile ("C:\sources\" & srcID & ".png")
.MoveNext
Wend
End If
End With
Set OraDynaset = Nothing
Set OraDatabase = Nothing
Set OraSession = Nothing