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 de athrarn
1
1
athrarn, - Sistemas Operativos : - MS-DOS, Windows 3
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.