Page 1 of 2
Oracle con ADO
Posted: Mon Oct 01, 2007 5:18 pm
by Sebastián Almirón
Hola a todos.
Estoy haciendo unas primeras pruebas con Oracle XE 10g, en concreto pasar una DBF de clientes a una tabla Oracle con la nueva herramienta ADORDD.
En un principio me está funcionando y una vez pasados los datos le hago un Browse y me muestra la tabla Oracle. ¡Que maravilla, tengo que hacer el cambio de todas las bases de datos de mi aplicación (más de 150) y parece que no va a suponer el tremendo esfuerzo que me imaginaba!
De momento tengo una pega (ya me saldrán otras): _ que contienen una Ñ (supongo que para las letras acentuadas pasará lo mismo) no me los graba y me salta un error. He estado mirando y en el registro de Windows Oracle tiene el valor NLS_LANG = SPANISH_SPAIN.WE8MSWIN1252
El error que salta no creo que sea muy descriptivo:
Error 41954080/16389 E_FAIL: COUNT from Errorsys, line 0
Pero se que el problema está en las Ñ porque si las quito de los registros se lo traga sin problemas.
¿ Por donde empiezo a mirar ? Soy nuevo en ADO y en ORACLE
Saludos
Posted: Wed Oct 03, 2007 2:53 am
by metaldrummer
Sebastián por favor postea el código que utilizas para el traspaso.
Yo estoy utilizando ado en oracle 10g express edition sin problemas. Me toma todo, Ñ, acentos, TODO!!!!
Tengo además unas funciones que cree para conectarme al motor y controlar cuando se realiza la conexión.
Además el como agregar los datos sin tener que utilizar sentencias SQL. Directamente usando ADO.
Incluso tengo una rutina que agrega datos a una tabla .dbf temporal y luego los pasa a la tabla que necesito en oracle sin problemas.
Hace dos días hice una presentación de un módulo de punto venta y caja a un cliente en sus instalaciones utilizando una conexión ADSL de 512mb donde el cliente hacia nuestro server que es público en forma excelente.
Saludos
David Lagos S.
Coquimbo - Chile
Posted: Wed Oct 03, 2007 6:31 am
by Sebastián Almirón
Hola David, de momento solo estoy haciendo pruebas, el siguiente código me marca el error al llegar a un registro que contiene Ñ. En la tabla Oracle, que solo tiene _, el campo codigo de ese registro se queda grabado, sin embargo el campo nombre que es el que contiene la Ñ se queda en blanco:
#include "FiveWin.ch"
#include "adordd.ch"
function Main()
USE clientes VIA 'ADORDD' TABLE "clientes" ORACLE FROM '127.0.0.1' USER 'SEBAS' PASSWORD 'mandarina' shared alias oraclientes
sele oraclientes
#define adIndex 0x100000
MsgInfo( HB_AdoRddGetRecordset():Supports( adIndex ) )
REQUEST DBFCDX
RddSetDefault('dbfcdx')
use clientes new VIA 'DBFCDX' alias gdfclientes
sele gdfclientes
set order to 1
go top
do whil !eof()
if !empty(codigo) .and. !empty(nombre)
ccliente := codigo
cnombre := nombre
sele oraclientes
append blank
if rlock()
replace codigo with ccliente, nombre with cnombre
unlock
endif
endif
sele gdfclientes
skip
enddo
sele oraclientes
Browse()
USE
return nil
En la declaración USE he intentado poner CODEDEPAGE 850 pero sigue sin funcionar
El MsgInfo() es para ver si mi conexión ADO soporta indices y me devuelve .F. ¿Entiendo que no se pueden usar indices con ORACLE?
Gracias por tu atención.
Posted: Wed Oct 03, 2007 8:05 am
by Antonio Linares
Sebastian,
> ¿Entiendo que no se pueden usar indices con ORACLE?
La limitación es de ADO no de Oracle, posiblemente.
Lo solucionas usando sentencias SQL que implican el uso de indices (ORDER BY, etc.)
Posted: Thu Oct 04, 2007 2:11 am
by metaldrummer
Sebastian:
Dame un correo donde enviarte un ejemplo.
La idea es que te olvides del concepto de .dbf
Yo por lo menos trabajo con ADO duro y puro y no tengo problemas.
Saludos
David
Posted: Thu Oct 04, 2007 6:52 am
by Sebastián Almirón
metaldrummer wrote:Sebastian:
Dame un correo donde enviarte un ejemplo.
La idea es que te olvides del concepto de .dbf
Yo por lo menos trabajo con ADO duro y puro y no tengo problemas.
Saludos
David
David:
Estoy evaluando el tiempo que me llevaría pasar una aplicación de dbfs a Oracle, por exigencia del cliente, a la vez que de FW16 a FWH (esto último ya he pasado parte porque tiene varios ejecutables). Es una aplicación muy gorda, unas 150 dbfs, más de 300.000 línea de código, 5 Dlls de recursos, lenguaje Script propio (basado en TScript que creo no está disponible para Harbour), etc.
Así que agradezco todas las ayudas, mi email es:
sebas@moralzarzal.com
Saludos
Posted: Tue Oct 09, 2007 3:34 pm
by metaldrummer
Sebastián favor mira tu correo.
Saludos
Posted: Tue Oct 09, 2007 4:00 pm
by Sebastián Almirón
metaldrummer wrote:Sebastián favor mira tu correo.
Saludos
Gracias David. Ahora mismo le hecho un vistazo.
Saludos
Posted: Thu Oct 18, 2007 3:53 am
by Manuel Valdenebro
metaldrummer wrote:Sebastian:
Dame un correo donde enviarte un ejemplo.
La idea es que te olvides del concepto de .dbf
Yo por lo menos trabajo con ADO duro y puro y no tengo problemas.
Saludos
David
David, podrias enviarme el ejemplo a mi correo:
soporte@lebsoft.es
Muchas gracias
Posted: Tue Jan 08, 2008 5:58 pm
by MarioDava
metaldrummer wrote:Sebastian:
Dame un correo donde enviarte un ejemplo.
La idea es que te olvides del concepto de .dbf
Yo por lo menos trabajo con ADO duro y puro y no tengo problemas.
Saludos
David
Hola,
Yo tambien uso ADO, pero la conexion a la base la hago por medio de un ODBC previamente configurado:
oCnx200:=TAdoConn():New()
IF !oCnx200:Open( "ORACLE CBS", "CBS", "pedro234" )
Msginfo('No hay conexión con el Servidor de Oracle...')
Return( .f. )
ENDIF
Como hago la conexión sin usar ODBC.
Saludos,
Mario A. Dávalos
México, D.F.
Posted: Tue Jan 08, 2008 8:43 pm
by Manuel Valdenebro
MarioDava wrote:
Yo tambien uso ADO, pero la conexion a la base la hago por medio de un ODBC previamente configurado:Como hago la conexión sin usar ODBC.
La conexión por ADO es mucho mas rápida y directa. Esta es una forma de conectar son Oracle (recuerda iniciar previamente la BD):
Local cProv := "MSDAORA.1"
Local cHost := "127.0.0.1" // tambien puedes poner el nombre de la BD
Local cUser := "hr"
local cPass := "hr"
local oCon := TOLEAuto():New('ADODB.Connection')
// realiza la conexion con la Base de Datos
TRY
oCon:Open("Provider=" + cProv + ";" + ;
"Data Source= " + cHost + ";" + ;
"User ID=" + cUser + ";" + ;
"Password=" + cPass + ";" )
CATCH
MSGSTOP ("Provider: " + cProv + CRLF + ;
"Host: " + cHost + CRLF + ;
"Usuario: " + cUser + CRLF + ;
"Clave: " + cPass, "Error de Conexión")
RETURN nil
END
Posted: Tue Jan 08, 2008 9:31 pm
by MarioDava
Manuel Valdenebro wrote:MarioDava wrote:
Yo tambien uso ADO, pero la conexion a la base la hago por medio de un ODBC previamente configurado:Como hago la conexión sin usar ODBC.
La conexión por ADO es mucho mas rápida y directa. Esta es una forma de conectar son Oracle (recuerda iniciar previamente la BD):
Local cProv := "MSDAORA.1"
Local cHost := "127.0.0.1" // tambien puedes poner el nombre de la BD
Local cUser := "hr"
local cPass := "hr"
local oCon := TOLEAuto():New('ADODB.Connection')
// realiza la conexion con la Base de Datos
TRY
oCon:Open("Provider=" + cProv + ";" + ;
"Data Source= " + cHost + ";" + ;
"User ID=" + cUser + ";" + ;
"Password=" + cPass + ";" )
CATCH
MSGSTOP ("Provider: " + cProv + CRLF + ;
"Host: " + cHost + CRLF + ;
"Usuario: " + cUser + CRLF + ;
"Clave: " + cPass, "Error de Conexión")
RETURN nil
END
Me puedes explicar un poco que es:
Local cProv := "MSDAORA.1"
y porque MSDAORA.1, yo acceso a una base remota de Orcale 10g
Saludos y gracias,
Mario A. Dávalos
Posted: Wed Jan 09, 2008 5:04 am
by Manuel Valdenebro
MarioDava wrote:Me puedes explicar un poco que es:
Local cProv := "MSDAORA.1"
MSDAORA.1 es el provider OLE estandar de Microsoft para acceder a una base de datos Oracle, aunque el mismo Oracle tiene otro provider-OLE propio. Si usas la función siguiente (cortesía de Biel), puedes probar si la conexión es correcta, usando el Datalink de Microsoft.
static FUNCTION FDATALINK (oCon)
LOCAL oDataLink := TOleAuto():New("Datalinks"), ;
oConn := oDataLink:PromptNew()
msginfo (oConn:ConnectionString)
oCon:CLOSE()
RETURN nil
Posted: Thu Jan 10, 2008 12:00 am
by MarioDava
Manuel Valdenebro wrote:MarioDava wrote:Me puedes explicar un poco que es:
Local cProv := "MSDAORA.1"
MSDAORA.1 es el provider OLE estandar de Microsoft para acceder a una base de datos Oracle, aunque el mismo Oracle tiene otro provider-OLE propio. Si usas la función siguiente (cortesía de Biel), puedes probar si la conexión es correcta, usando el Datalink de Microsoft.
static FUNCTION FDATALINK (oCon)
LOCAL oDataLink := TOleAuto():New("Datalinks"), ;
oConn := oDataLink:PromptNew()
msginfo (oConn:ConnectionString)
oCon:CLOSE()
RETURN nil
Gracias Manuel, finalmente pude hacer la conexión a Oracle vía ADO, tengo una pregunta que hacerte, has usado en tus querys en la clausula WHERE capos tipo fecha? y si es el caso, te funcionan bien, a mi no?
Antes me conectaba via ODBC y mis querys correian perfecto, ahora las querys que usan fechas no funcionan.
Saludos,
Mario A. Dávalos
Posted: Thu Jan 10, 2008 6:00 am
by Manuel Valdenebro
MarioDava wrote:Gracias Manuel, finalmente pude hacer la conexión a Oracle vía ADO, tengo una pregunta que hacerte, has usado en tus querys en la clausula WHERE capos tipo fecha? y si es el caso, te funcionan bien, a mi no?
Mario,
Aquí estamos aprendiendo a "porrazos" y con la ayuda de todos. Por eso sería bueno nos comentaras como te has conectado, con que cadena de conexión.
En cuando al problema de las fecha, yo no tengo problemas. La siguiente consulta sobre la tabla EMPLOYEES la realiza correcamente:
select * from employees where LAST_NAME LIKE 'D%' AND hire_date > '01/01/1998'
¿Estas usando comillas dobles ó sencillas?