Spanish MSSQL usando B4A

IndigoMex

New Member
Saludos a todos,

Estoy empezando a usar B4A y tengo una aplicacion en B4J que se conecta perfectamente a mi servidor de SQL que esta en mi PC, al tratar de hacer lo mismo pero usando B4A me da un error de inicializazion y un timeout de conexion, he tratado de buscar un ejemplo que funcione para conectarme a un servidor de MS SQL (he tratado casi todos los ejemplos que hay en los post y foros y nada), espero me puedan ayudar en esto

Ejemplo en Java:

MS SQL Server:
#Region Project Attributes
    #CommandLineArgs:
    #MergeLibraries: True
    'MSSQL Connector/J Driver
    #AdditionalJar: jtds-1.3.1.jar
#End Region

Sub Process_Globals
    Private SQL As SQL
#Region Database Location
    Private DBLocation As String = "192.168.1.169:51517"
    Private DBUsername As String = "sa"
    Private DBPassword As String = "sa"
#End Region
End Sub

Sub AppStart (Args() As String)
    LogError("---------- TestSQLServer Database (MSSQL) ----------")
'    SQL.InitializeAsync("MSSQL","net.sourceforge.jtds.jdbc.Driver", $"jdbc:jtds:sqlserver://${DBLocation}/TestSQLServer"$, DBUsername, DBPassword)
    SQL.InitializeAsync("MSSQL","net.sourceforge.jtds.jdbc.Driver", $"jdbc:jtds:sqlserver://${DBLocation}/MSWM"$, DBUsername, DBPassword)
    SQL.Close
    StartMessageLoop
    ExitApplication
End Sub

Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

Sub MSSQL_Ready (Success As Boolean)
    If Success Then
'        Dim RS As ResultSet = SQL.ExecQuery("SELECT Id,Name,Salary FROM Employees")
        Dim RS As ResultSet = SQL.ExecQuery("SELECT Description FROM Item")
        Do While RS.NextRow
            Log(RS.GetString2(0))
        Loop
        RS.Close
    End If
    StopMessageLoop
End Sub

Y este es mi codigo en B4A:

MS SQL Server B4A:
#AdditionalJar: jtds-1.3.1.jar
#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Globals
    '
End Sub

Sub Process_Globals
    Private xui As XUI
    Dim sql As SQL
    Private DBLocation As String = "192.168.1.169:51517"
    Private DBUsername As String = "sa"
    Private DBPassword As String = "sa"
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")
End Sub

Sub Button1_Click
    SQLConnect
End Sub

Public Sub SQLConnect
    sql.InitializeAsync("MSSQL","net.sourceforge.jtds.jdbc.Driver", $"jdbc:jtds:sqlserver://${DBLocation}/MSWM"$, DBUsername, DBPassword)
    sql.Close       
End Sub

Sub SQL_Ready (Success As Boolean)
    If Success Then
        Dim rs As ResultSet =  sql.ExecQuery("SELECT Description FROM Item:")
        Do While rs.nextrow
            Log(rs.GetString2(0))
        Loop
        rs.Close
    Else
        Log(LastException)
        Return
    End If
End Sub

Mil gracias por la ayuda
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
En el sql del B4A tienes puesto From Item:. No se si podrá ser por eso.

¿El equipo que ejecuta el B4J es también el servidor de base de datos?. Quizás pueda ser el firewall.
 

josejad

Expert
Licensed User
Longtime User
Hola IndigoMex, bienvenido:

Como bien dice Gabino, prueba a quitar los dos puntos detrás de Item.

Aparte de eso, necesitaríamos más datos para poder ayudarte, y quizás, si estás empezando, sería bueno algunas recomendaciones.
- ¿Qué error recibes en los logs? Pega (como texto) los errores
- ¿Qué librería estás usando para conectarte? Por lo que intuyo, podría ser JdbcSQL
- Si es esa librería, has probado a descargar y ejecutar el ejemplo? No veo que tu código incluya ningún Wait For, como deberías estar haciendo.
- Si estás empezando a probar con B4A, sería mejor que lo hicieras con B4XPages, te hará más sencilla algunas cosas
- Sería recomendable que usaras jRDC2 para conectarte a la base de datos.
- Siempre, si subes un pequeño ejemplo y los errores que recibes, recibirás más ayuda, más rápida y sin tener que estar suponiendo cosas.

saludos,
 

EnriqueGonzalez

Well-Known Member
Licensed User
Longtime User
Que tal IndigoMex!
Aparte de las buenas recomendaciones de Jose, yo por mi parte te recomiendo:

- No usar JTDS, JTDS es una libreria cuya ultima actualizacion ocurrio en el 2003, usa los drivers oficiales de microsoft
- Descarga la ultima version aqui: https://learn.microsoft.com/en-us/s...c-driver-for-sql-server?view=sql-server-ver16
- Considera que los drivers de microsoft no funcionan en B4A asi que solo podrias usar JRDC2 para ese proposito.
- Lo cual no es malo! iniciar una interfaz directa desde android expone la contraseña de tu servidor y es bastante inestable.
 

IndigoMex

New Member
Hola IndigoMex, bienvenido:

Como bien dice Gabino, prueba a quitar los dos puntos detrás de Item.

Aparte de eso, necesitaríamos más datos para poder ayudarte, y quizás, si estás empezando, sería bueno algunas recomendaciones.
- ¿Qué error recibes en los logs? Pega (como texto) los errores
- ¿Qué librería estás usando para conectarte? Por lo que intuyo, podría ser JdbcSQL
- Si es esa librería, has probado a descargar y ejecutar el ejemplo? No veo que tu código incluya ningún Wait For, como deberías estar haciendo.
- Si estás empezando a probar con B4A, sería mejor que lo hicieras con B4XPages, te hará más sencilla algunas cosas
- Sería recomendable que usaras jRDC2 para conectarte a la base de datos.
- Siempre, si subes un pequeño ejemplo y los errores que recibes, recibirás más ayuda, más rápida y sin tener que estar suponiendo cosas.

saludos,
Mil gracias por sus respuestas, debo clarificar lo siguiente:

El primer codigo que puse de refrencia q es para B4J corre perfectamente y trae los 15,000 records que hay en el servido de MSSQL que esta en mi maquina.

Llevando el codigo a B4A quedaria de la sigueinte manera (añadiendo las sugerencias hechas por ustedes)

B4A:
#Region Project Attributes
    #AdditionalJar: jtds-1.3.1.jar
#End Region

Sub Globals
    '
End Sub

Sub Process_Globals
    Private SQL As SQL
#Region Database Location
    Private DBLocation As String = "192.168.1.169:51517"
    Private DBUsername As String = "sa"
    Private DBPassword As String = "sa"
#End Region
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")
    Log("---------- Database (MSSQL) ----------")
'    SQL.InitializeAsync("MSSQL","net.sourceforge.jtds.jdbc.Driver", $"jdbc:jtds:sqlserver://${DBLocation}/TestSQLServer"$, DBUsername, DBPassword)
    SQL.InitializeAsync("MSSQL","net.sourceforge.jtds.jdbc.Driver", $"jdbc:jtds:sqlserver://${DBLocation}/MSWM"$, DBUsername, DBPassword)
    Wait For MSSQL_Ready (Success As Boolean)
    If Success Then
        Log("Conexion con el servidor")
    Else
        Log("No hubo conexion con el servidor 01")
    End If
    SQL.Close
    ExitApplication
End Sub

Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

Sub MSSQL_Ready (Success As Boolean)
    If Success Then
        Dim RS As ResultSet = SQL.ExecQuery("SELECT Description FROM Item") 'Item es el nombre de la tabla'
        Do While RS.NextRow
            Log(RS.GetString2(0))
        Loop
        RS.Close
    Else
        Log("No hubo conexion con el servidor 02")   
        ExitApplication
    End If
End Sub

Los Logs aparecen asi:

*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create (first time) **
---------- Database (MSSQL) ----------
** Activity (main) Resume **
No hubo conexion con el servidor 01
 

IndigoMex

New Member
He bajado 25 ejemplos que he encontrado aqui en los foros y ninguno que me permita conectarme a un MSSQL Server, solo necesito eso para poder continuar.

Ah, olvidaba esto, estoy usando la libreria de JSQL 1.61 que es la misma que uso en el programa de Java que funciona perfectamemente y se conecta a mi MSSQL Server
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Como te han comentado los compañeros en post anteriores, te aconsejamos que cambies a B4XPages y a JRDC2 que son mucho más fáciles de implementar y estables cara a los ciclos de Android, pérdidas de conexión Wifi, etc. Tienes ejemplos en el foro muy completos.

De todas formas, además he visto que todo lo tienes puesto en el Create y al final del Create tienes un ExitApplication.

¿Cómo no pones un botón en el formulario y los pruebas las haces en el evento OnClik del ratón para ver realmente lo que hace y lo que no?.

Ya para pruebas iniciales, tampoco creo que sea muy recomendable que hagas peticiones de 25000 registros. Para saber que no sea también cosa de timeout, etc.

Un saludo.
 

IndigoMex

New Member
Gracias Gabino, hare la prueba con JRDC2; de hecho ya cree y termine la navegacion de una docena de ventanas en una aplicacion con los Menus correspondientes y la funionalidad de la aplicacion, solo estoy buscando una ejemplo muy simple de conexion de MSSQL y buscar un record en una tabla, las estructucturas de los Querys q voy a usar y las vistas con tablas ya las tengo diseñadas y funcionales, solo me frusta que llevo un mes sin poder hacer una conexion simple a MSSQL en B4A, cuando en B4J lo hize en un momento y funciona. Agradezco muchisimo su feedback
 
Top