Visual Basic y AS/400

Estoy desarrollando aplicaciones en visual basic que deben leer información contenida en archivos de as400, sin embargo sucede que cuando realizo estos programas el tiempo de acceso es muy lento (hasta 10 min.) Yo utilizo una conexión de ODBC con el as400 y dentro de visual basic abro la base de datos y realizo un select con los campos que deseo utilizar, y es precisamente cuando el programa llega al select que tarda en procesar (depende claro de la cantidad de registros). Me imagino que debe haber otra forma de utilizar la información del as400, una forma optima que no tarde tanto, ¿tienes idea de como hacerlo?.

1 Respuesta

Respuesta
1
A ver, hay muchas formas. La mayoría de ellas están ya implementadas.
Si son maquinas que están lejanas, impelenta un SFTP (Secrure FTP ) como cliente en Visual basic. Y pon un servicio de SFTP en el servidor AS400. Pero he trabajado poco con el AS4000.
Mirando por ahí, además he visto que con ADO dicen que es rápido y fiable.
Te paso una clase de conexión ADO. Si aun así no te funciona rápido, habrá que buscar otro método de conexión.
Private Conexion As ADODB.Connection
Dim innerRS As ADODB.Recordset
Private Sub Class_Initialize()
On Error GoTo FalloConexion
Set Conexion = New ADODB.Connection
Conexion.ConnectionString = strMontarCad()
Conexion.Open
Exit Sub
FalloConexion:
MsgBox "Valide que la conexion es contra el servicio." _
" El error generado = " & Err.Description
End Sub
Private Function strMontarCad() As String
mCadenaConex = "Provider=IBMDA400;" & _
"Data source=myAS400;" & _
"User Id=myUsername;" & _
"Password=myPassword"
strMontarCad = mCadenaConex
End Function
Public Function ExecuteQuery(sql As String) As ADODB.Recordset
Dim RetVal As Long
inicio:
On Error GoTo fallo
Set innerRS = New ADODB.Recordset
innerRS.CacheSize = 30
InnerRS. Open UCase(sql), Conexion. ConnectionString, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified
Set ExecuteQuery = innerRS
Exit Function
fallo:
RetVal = MsgBox("Fallo la sql :" & sql & vbNewLine & " Error : " & Err.Description, vbYesNo)
If RetVal = vbYes Then
GoTo inicio
End If
End Function
Public Sub ExecuteSQL(sql As String)
Conexion.Execute sql
End Sub
Private Sub Class_Terminate()
If (Conexion.State <> adStateClosed) Then
Conexion.Close
End If
End Sub
No lo he probado. Y asegurate, que usas el ODBC apropiado de la cadena de conexión.
También existe esta cadena de conexión por si usas otro driver :
Provider=SNAOLEDB;" & _
"Data source=myAS400;" & _
"User Id=myUsername;" & _
"Password=myPassword"
Pero, vamos, si ya has conectado antes tendrás la cadena (supongo).
Presta atención también a los parámetros de la linea :
InnerRS. Open UCase(sql), Conexion. ConnectionString, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified
Para que el recordset sea lo más rápido posible. Al limitarlo solo a lectura y solo en modo Fordward.
Bueno, so se si te solucionaré algo o no.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas