I do it the way agraham says -and I would listen to what he says, not just as an expert, but as someone who has even been involved in some way in the initial development of B4X (correct me if I'm wrong) - and I don't think it's too messy. Just add the parameters to a map, and return it.
Or the way LucasMs says, just return a custom type, "Rs As ResultSet" is a custom type indeed
Code:
Public Sub GetRecord (Command As String, parameters() As String) As ResumableSub
Dim Answer As Map
Answer.Initialize
Dim req As DBRequestManager = CreateRequest
Dim cmd As DBCommand = CreateCommand(Command, parameters)
Wait For (req.ExecuteQuery(cmd, 0, Null)) JobDone(j As HttpJob)
Answer.Put("status", j.Success)
If j.Success Then
req.HandleJobAsync(j, "req")
Wait For (req) req_Result(Res As DBResult)
'work with result
' req.PrintTable(Res)
Answer.Put("Status","Data read succesfuly")
Else
Log("ERROR: " & j.ErrorMessage)
Answer.Put("Status","Error getting data. Error: " & j.ErrorMessage)
End If
j.Release
Answer.Put("Data",Res)
Return Answer
End Sub
Me finally:
[CODE lang="b4x" title="ResponseBuilder.bas"]Sub Class_Globals
Private Success_ As Boolean
Private Data_ As Object
Private Params_ As Map
End Sub
Public Sub Initialize
End Sub
Public Sub getSuccess As Boolean
Return Success_
End Sub
Public Sub setSuccess(Success As Boolean)
Success_ = Success
End Sub
Public Sub getFailed As Boolean
Return Not(Success_)
End Sub
Public Sub getData As Object
Return Data_
End Sub
Public Sub setData(Data As Object)
Data_ = Data
End Sub
Public Sub getResultSet As ResultSet
Return Data_
End Sub
Public Sub getAsByte As Byte
Return Data_
End Sub
Public Sub getAsShort As Short
Return Data_
End Sub
Public Sub getAsInt As Int
Return Data_
End Sub
Public Sub getAsLong As Long
Return Data_
End Sub
Public Sub getAsDouble As Double
Return Data_
End Sub
Public Sub getAsFloat As Float
Return Data_
End Sub
Public Sub getAsString As String
Return Data_
End Sub
Public Sub getAsBinary As Byte()
Return Data_
End Sub
Public Sub getAsArray As String()
Return Data_
End Sub
Public Sub getAsArrayInt As Int()
Return Data_
End Sub
Public Sub getAsList As List
Return Data_
End Sub
Public Sub getAsMap As Map
Return Data_
End Sub
Public Sub First As Object
Dim Rs As ResultSet
Rs = Data_
Rs.NextRow
Return Rs.GetString2(0)
End Sub
Public Sub Count As Long
If Success_ Then
Dim Rs As ResultSet
Rs = Data_
Return Rs.RowCount
End If
Return 0
End Sub
Public Sub Any As Boolean
Dim Value As String = FirstOrDefault
If Value = Null Then
Return False
End If
Return Value.As(Long) > 0
End Sub
Public Sub FirstOrDefault As String
If Success_ Then
Dim Rs As ResultSet
Rs = Data_
If Rs.RowCount > 0 Then
Rs.Position = 0
Return Rs.GetString2(0)
End If
End If
Return Null
End Sub
Public Sub List As List
Dim List1 As List
List1.Initialize
If Success_ Then
Dim Rs As ResultSet
Rs = Data_
If Rs.RowCount > 0 Then
Rs.Position = 0
Do Until Rs.Position > Rs.RowCount - 1
List1.Add(Rs.GetString2(0))
If Not(Rs.NextRow) Then
Rs.Position = 0
Exit
End If
Loop
End If
End If
Return List1
End Sub
Public Sub Map As Map
Dim Map1 As Map
Map1.Initialize
If Success_ Then
Dim Rs As ResultSet
Rs = Data_
If Rs.RowCount > 0 Then
Rs.Position = 0
For i = 0 To Rs.ColumnCount - 1
Map1.Put(Rs.GetColumnName(i), Rs.GetString2(i))
Next
End If
End If
Return Map1
End Sub
Public Sub ListMap As List
Dim List1 As List
List1.Initialize
If Success_ Then
Dim Rs As ResultSet
Rs = Data_
If Rs.RowCount > 0 Then
Rs.Position = 0
Do Until Rs.Position > Rs.RowCount - 1
Dim Map1 As Map
Map1.Initialize
For i = 0 To Rs.ColumnCount - 1
Map1.Put(Rs.GetColumnName(i), Rs.GetString2(i))
Next
List1.Add(Map1)
If Not(Rs.NextRow) Then
Rs.Position = 0
Exit
End If
Loop
End If
End If
Return List1
End Sub
Public Sub GetParam(Key As Object) As Object
If Not(Params_.IsInitialized) Then
Return Null
End If
Return Params_.GetDefault(Key, Null)
End Sub
Public Sub SetParam(Key As Object, Value As Object)
If Not(Params_.IsInitialized) Then
Params_.Initialize
End If
Params_.Put(Key, Value)
End Sub[/CODE]
[CODE lang="b4x" title="Response.bas"]'Code module
'Subs in this code module will be accessible from all modules.
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.
End Sub
Public Sub Create(Success As Boolean, Data As Object) As ResponseBuilder
Dim Response As ResponseBuilder
Response.Initialize
Response.Success = Success
Response.Data = Data
Return Response
End Sub[/CODE]
B4X:
Public Sub ExecQueryAsync2(QueryString As String, Args As List) As ResumableSub
Dim SenderFilter As Object = SQL_.ExecQueryAsync("SQL", QueryString, Args)
Wait For (SenderFilter) SQL_QueryComplete (Success As Boolean, Rs As Object) 'Rs As ResultSet will throw an uncatchable exception if query fail
Return Response.Create(Success, Rs)
End Sub