Spanish Que tipo es null?

carlos7000

Well-Known Member
Licensed User
Longtime User
He escrito una función que retorna en valor booleano, True, o False. Al ejecutar la aplicación, la misma se bloquea. Al buscar la causa descubrí que la función ExecQuerySingleResult cuando no se ejecuta correctamnete, en lugar de retornar False, retorna Null. El problema no fue difícil de solucionar, solo fue agregar un If, para convertir el Null en False, pero me quedo la duda, ¿que tipo de dato es Null

La función que tenía el problema era esta:

UpdateStopLoss:
public Sub UpdateStopLoss(Asset As String, Market As String, StopLoss As Float) As Boolean
    Dim Query As String  
    Dim Result As Boolean
    Try      
        Query = "UPDATE `main`.`Pares` SET StopLoss = "& StopLoss &" WHERE Asset = '" & Asset & "' AND Market = '" & Market & "';"
        Result = Sql1.ExecQuerySingleResult(Query )
    Catch
        Log(LastException)      
    End Try
   
    Return Result
End Sub

La versión corregida es

UpdateStopLoss2:
public Sub UpdateStopLoss(Asset As String, Market As String, StopLoss As Float) As Boolean
    Dim Query As String  
    Dim Result As Boolean
   
    Result = False
   
    Try      
        Query = "UPDATE `main`.`Pares` SET StopLoss = "& StopLoss &" WHERE Asset = '" & Asset & "' AND Market = '" & Market & "';"
        If(Sql1.ExecQuerySingleResult(Query) <> Null) Then
            Result = True
        End If
    Catch
        Log(LastException)      
    End Try
   
    Return Result
End Sub

Entonces, si deseo que una función pueda retornar un valor Null, ¿Cómo lo hago?
 
Last edited:

josejad

Expert
Licensed User
Longtime User
Hola Carlos:

Según la documentación de la librería SQL, ExecQuerySingleResult devuelve Null (as Object) si no encuentra resultados (no si no se ejecuta correctamente).


Method_636.png
ExecQuerySingleResult (Query As String) As String

Executes the query and returns the value in the first column and the first row (in the result set).
Returns Null if no results were found.
Example:
Dim NumberOfMatches As Int
NumberOfMatches = SQL1.ExecQuerySingleResult("SELECT count(*) FROM table1 WHERE col2 > 300")

Además, ExecQuerySingleResult ejecuta una consulta, cuando lo que quieres hacer es una actualización, es decir, no quieres obtener datos de tu base de datos, sino actualizarlos.
Así que creo que deberías usar ExecNonQuery para hacer el update.

Method_636.png
ExecNonQuery (Statement As String)

Executes a single non query SQL statement.
Example:
SQL1.ExecNonQuery("CREATE TABLE table1 (col1 TEXT , col2 INTEGER, col3 INTEGER)")
If you plan to do many "writing" queries one after another, then you should consider using BeginTransaction / EndTransaction.
It will execute significantly faster.

saludos,
 

carlos7000

Well-Known Member
Licensed User
Longtime User
Hola Carlos:

Según la documentación de la librería SQL, ExecQuerySingleResult devuelve Null (as Object) si no encuentra resultados (no si no se ejecuta correctamente).


Method_636.png
ExecQuerySingleResult (Query As String) As String

Executes the query and returns the value in the first column and the first row (in the result set).
Returns Null if no results were found.
Example:
Dim NumberOfMatches As Int
NumberOfMatches = SQL1.ExecQuerySingleResult("SELECT count(*) FROM table1 WHERE col2 > 300")

Además, ExecQuerySingleResult ejecuta una consulta, cuando lo que quieres hacer es una actualización, es decir, no quieres obtener datos de tu base de datos, sino actualizarlos.
Así que creo que deberías usar ExecNonQuery para hacer el update.

Method_636.png
ExecNonQuery (Statement As String)

Executes a single non query SQL statement.
Example:
SQL1.ExecNonQuery("CREATE TABLE table1 (col1 TEXT , col2 INTEGER, col3 INTEGER)")
If you plan to do many "writing" queries one after another, then you should consider using BeginTransaction / EndTransaction.
It will execute significantly faster.

saludos,

Hola José.

Muchas gracias.
 
Top