Aracılığıyla paylaş


Kullanıcı tanımlı işlevler

Çoğu veritabanı, kendi işlevlerinizi tanımlamak için kullanabileceğiniz bir yordamsal SQL diyalektine sahiptir. Ancak SQLite, uygulamanızla birlikte işlem halinde çalışır. SQL'in yeni bir diyalektini öğrenmek yerine uygulamanızın programlama dilini kullanabilirsiniz.

Skaler işlevler

Skaler işlevler, sorgudaki her satır için tek bir skaler değer döndürür. Yeni skaler işlevleri tanımlayın ve kullanarak CreateFunctionyerleşik işlevleri geçersiz kılın.

Bkz. Desteklenen parametre listesi için veri türleri ve bağımsız değişken için func dönüş türleri.

Fonksiyona her çağrı sırasında bu değeri aktarmak için state argümanını belirtin. Kapatmaları önlemek için bunu kullanın.

SQLite'in sorguları derlerken ek iyileştirmeler kullanmasına izin vermek için işlevinizin belirleyici olup olmadığını belirtin isDeterministic .

Aşağıdaki örnekte, silindir yarıçapını hesaplamak için skaler işlevin nasıl ekleneceği gösterilmektedir.

connection.CreateFunction(
    "volume",
    (double radius, double height)
        => Math.PI * Math.Pow(radius, 2) * height);

var command = connection.CreateCommand();
command.CommandText =
@"
    SELECT name,
           volume(radius, height) AS volume
    FROM cylinder
    ORDER BY volume DESC
";

Operatörler

Aşağıdaki SQLite işleçleri ilgili skaler işlevler tarafından uygulanır. Uygulamanızda bu skaler işlevlerin tanımlanması, bu işleçlerin davranışını geçersiz kılar.

Operatör İşlev
X GLOB Y glob(Y, X)
X, Y GİBİ like(Y, X)
X LIKE Y ESCAPE Z like(Y, X, Z)
X EŞLEŞTİR Y eşleştir(Y, X)
X REGEXP Y regexp(Y, X)

Aşağıdaki örnekte, karşılık gelen işlecini etkinleştirmek için regexp işlevinin nasıl tanımlanacağı gösterilmektedir. SQLite, regexp işlevinin varsayılan uygulamasını içermez.

connection.CreateFunction(
    "regexp",
    (string pattern, string input)
        => Regex.IsMatch(input, pattern));

var command = connection.CreateCommand();
command.CommandText =
@"
    SELECT count()
    FROM user
    WHERE bio REGEXP '\w\. {2,}\w'
";
var count = command.ExecuteScalar();

Toplama işlevleri

Toplama işlevleri, sorgudaki tüm satırlar için tek bir toplanmış değer döndürür. CreateAggregate kullanarak toplama işlevlerini tanımlayın ve geçersiz kılın.

seed bağımsız değişkeni bağlamın ilk durumunu belirtir. Kapatmaları önlemek için de bunu kullanın.

func argümanı her satır için bir kez uygulanır. Sonucu elde etmek için bağlamı kullanın. Bağlamı geri ver. Bu desen, bağlamın bir değer türü veya sabit olmasını sağlar.

Belirtilmezse resultSelector , sonuç olarak bağlamın son durumu kullanılır. Bu, yalnızca her satırda bir sayıyı artırması ve döndürmesi gereken toplam ve sayı gibi işlevlerin tanımını basitleştirebilir.

Tüm satırları yineledikten sonra bağlamdan nihai sonucu hesaplamak için resultSelector belirtin.

bkz. Veri türleri, func bağımsız değişkeni için desteklenen parametre türlerinin listesi ve resultSelector için dönüş türleri.

İşleviniz belirleyiciyse, sorgu derlerken SQLite'in ek iyileştirmeler kullanmasına izin vermek için belirtin isDeterministic .

Aşağıdaki örnek, bir sütunun standart sapması hesaplamak için bir toplama işlevi tanımlar.

connection.CreateAggregate(
    "stdev",

    // A tuple to maintain context between rows
    (Count: 0, Sum: 0.0, SumOfSquares: 0.0),

    // This is called for each row
    ((int Count, double Sum, double SumOfSquares) context, double value) =>
    {
        context.Count++;
        context.Sum += value;
        context.SumOfSquares += value * value;

        return context;
    },

    // This is called to get the final result
    context =>
    {
        var variance = context.SumOfSquares - context.Sum * context.Sum / context.Count;

        return Math.Sqrt(variance / context.Count);
    });

var command = connection.CreateCommand();
command.CommandText =
@"
    SELECT stdev(gpa)
    FROM student
";
var stdDev = command.ExecuteScalar();

Hatalar

Kullanıcı tanımlı bir işlev özel durum oluşturursa, ileti SQLite'e döndürülür. Ardından SQLite bir hata oluşturur ve Microsoft.Data.Sqlite bir SqliteException oluşturur. Daha fazla bilgi için bkz . Veritabanı hataları.

Varsayılan olarak SQLite hata kodu SQLITE_ERROR (veya 1) olur. Bununla birlikte, işlevinize istediğiniz şekilde belirtilmiş bir SqliteException ekleyerek bunu değiştirebilirsiniz.

Hata ayıklama

SQLite uygulamanızı doğrudan çağırır. Bu, SQLite sorguları değerlendirirken tetikleyen kesme noktaları eklemenize olanak tanır. Kullanıcı tanımlı işlevlerinizi oluşturmanıza yardımcı olmak için tam .NET hata ayıklama deneyimi sağlanır.

Ayrıca bakınız