dotConnect for SQLite Documentation
In This Topic
    SQLite UDFs: Adding Sqrt and CToF Functions
    In This Topic

    According to the list of core functions in SQLite, there is no native support for the most of mathematics functions (sqrt, log, etc). This issue can be resolved with user-defined functions (UDFs). Furthermore, user may need non-standard functions for his own task (e.g. conversion Celsius to Fahrenheit).

    UDF provide a mechanism for extending the functionality of the SQLite engine by adding a function that can be evaluated in the SQL statements of SQLiteCommand. Full support for user-defined functions and collating sequences means that in many cases if SQLite doesn't have a feature, you can write it yourself in your favorite .NET language. Writing UDF's and collating sequences has never been easier.

    We have implemented some of the functions in the dotConnect for SQLite data provider. You can refer to the list of implemented functions in the Standard SQL Function Support article.

    Examples

    1. Here is an example of creating and using of the function, that calculates the square root.

       public class SqrtFunction<T1>: SQLiteScalarFunction<T1,double> {
        
          public SqrtFunction(): base("Sqrt") {
          }
         
          protected override double Execute(T1 arg, SQLiteConnection connection) {
            return Math.Sqrt(Convert.ToDouble(arg));
          }
        }


      
      Public Class SqrtFunction(Of T1)
          Inherits SQLiteScalarFunction(Of T1, Double)
          ' Methods
          Public Sub New()
              MyBase.New("Sqrt")
          End Sub
        
      
          Protected Overrides Function Execute(ByVal arg As T1, ByVal connection As SQLiteConnection) As Double
              Return Math.Sqrt(Convert.ToDouble(arg))
          End Function
      
      End Class
      
      
      And using it

      SQLiteConnection sqLiteConnection = new SQLiteConnection(
        @"Data Source=D:\SQLite\test.db");
      sqLiteConnection.Open();
      SqrtFunction<double> function = new SqrtFunction<double>();
      sqLiteConnection.RegisterFunction(function);
      
      SQLiteCommand command = new SQLiteCommand("select sqrt(9.0)", sqLiteConnection);
      double result = (double)command.ExecuteScalar();
      
      sqLiteConnection.UnRegisterFunction(function);
      sqLiteConnection.Close(); 
      


      
      Dim sqLiteConnection As New SQLiteConnection("Data Source=D:\SQLite\test.db")
      sqLiteConnection.Open
      Dim function As New SqrtFunction(Of Double)
      sqLiteConnection.RegisterFunction([function])
      
      Dim command As New SQLiteCommand("select sqrt(9.0)", sqLiteConnection)
      Dim result As Double = CDbl(command.ExecuteScalar)
      
      sqLiteConnection.UnRegisterFunction([function])
      sqLiteConnection.Close
      
      
    2. This sample implements scalar function that makes the "Celsius to Fahrenheit" conversion.

       
      public class CelsToFahrFunction : SQLiteScalarFunction<long, long> {
      
          public CelsToFahrFunction() : base("CToF") { 
          }
      
          protected override long Execute(long parameter, SQLiteConnection connection) {
      
            return Convert.ToInt64((9.0f / 5.0f) * parameter + 32);
          }
        }
      

      
      Public Class CelsToFahrFunction
          Inherits SQLiteScalarFunction(Of Long, Long)
          ' Methods
          Public Sub New()
              MyBase.New("CToF")
          End Sub
        
          Protected Overrides Function Execute(ByVal parameter As Long, ByVal connection As SQLiteConnection) As Long
              Return Convert.ToInt64(CSng(((1.8! * parameter) + 32!)))
          End Function
      
      End Class
      
      
      Using the function:

      SQLiteConnection sqLiteConnection = new SQLiteConnection(
        @"Data Source=D:\SQLite\test.db");
      sqLiteConnection.Open();
      CelsToFahrFunction function = new CelsToFahrFunction();
      sqLiteConnection.RegisterFunction(function);
      
      SQLiteCommand command = new SQLiteCommand("select CtoF(-40)", sqLiteConnection);
      long result = (long)command.ExecuteScalar();
      
      sqLiteConnection.UnRegisterFunction(function);
      sqLiteConnection.Close();
      


      [Visual Basic]

      Dim sqLiteConnection As New SQLiteConnection("Data Source=D:\SQLite\test.db")
      sqLiteConnection.Open
      Dim function As New CelsToFahrFunction
      sqLiteConnection.RegisterFunction([function])
      
      Dim command As New SQLiteCommand("select CtoF(-40)", sqLiteConnection)
      Dim result As Long = CLng(command.ExecuteScalar)
      
      sqLiteConnection.UnRegisterFunction([function])
      sqLiteConnection.Close
      

      See Also

      Using parameters