Megosztás a következőn keresztül:


Felhasználó által definiált függvények

A legtöbb adatbázis rendelkezik az SQL eljárási dialektusával, amellyel saját függvényeket határozhat meg. Az SQLite azonban folyamatban fut az alkalmazással. Az SQL új dialektusának elsajátítása helyett egyszerűen használhatja az alkalmazás programozási nyelvét.

Skaláris függvények

A skaláris függvények egyetlen skaláris értéket adnak vissza a lekérdezés minden sorához. Új skaláris függvények definiálása és a beépített függvények felülbírálása a használatával CreateFunction.

A támogatott paraméterek listáját és az argumentum visszatérési típusait az func Adattípusok című témakörben találja.

Az argumentum megadásával ezt az state értéket a függvény minden meghívása megkapja. Ezzel elkerülheti a lezárásokat.

Adja meg isDeterministic , hogy a függvény determinisztikus-e ahhoz, hogy az SQLite további optimalizálásokat használjon a lekérdezések összeállításakor.

Az alábbi példa bemutatja, hogyan adhat hozzá skaláris függvényt a henger sugarának kiszámításához.

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
";

Operátorok

A következő SQLite operátorokat a megfelelő skaláris függvények implementálják. Ezeknek a skaláris függvényeknek az alkalmazásban való definiálása felülírja ezeknek az operátoroknak a viselkedését.

Operátor Függvény
X GLOB Y glob(Y, X)
X LIKE Y like(Y, X)
X LIKE Y ESCAPE Z like(Y, X, Z)
X EGYEZÉS Y egyezés(Y, X)
X REGEXP Y regexp(Y, X)

Az alábbi példa bemutatja, hogyan definiálhatja a regexp függvényt a megfelelő operátor engedélyezéséhez. Az SQLite nem tartalmazza a regexp függvény alapértelmezett implementációját.

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();

Aggregátumfüggvények

Az összesítő függvények egyetlen összesített értéket adnak vissza a lekérdezés összes sorához. Összesítő függvények definiálása és felülbírálása a következő használatával CreateAggregate: .

Az seed argumentum a környezet kezdeti állapotát adja meg. Ezzel elkerülheti a lezárásokat is.

Az func argumentum meghívása soronként egyszer történik. A környezet használatával halmozhat fel végeredményt. Adja vissza a környezetet. Ez a minta lehetővé teszi, hogy a környezet értéktípus vagy nem módosítható legyen.

Ha nincs resultSelector megadva, a rendszer a környezet végső állapotát használja az eredményként. Ez leegyszerűsítheti az olyan függvények definícióját, mint az összeg és a darabszám, amelyeknek csak egy számot kell növelniük minden sorban, és vissza kell adniuk.

Adja meg resultSelector , hogy az összes sor iterálása után számítsa ki a végeredményt a környezetből.

Az argumentum támogatott paramétertípusainak listáját az Adattípusok és a func visszatérési típusok resultSelectorcímű témakörben találja.

Ha a függvény determinisztikus, adja meg isDeterministic , hogy az SQLite további optimalizálásokat használhasson a lekérdezések összeállításakor.

Az alábbi példa egy aggregátumfüggvényt határoz meg egy oszlop szórásának kiszámításához.

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();

Errors

Ha egy felhasználó által definiált függvény kivételt jelez, a rendszer visszaadja az üzenetet az SQLite-nek. Az SQLite ezután hibát jelez, a Microsoft.Data.Sqlite pedig egy SqliteException hibát fog eredményezni. További információ: Adatbázishibák.

Alapértelmezés szerint az SQLite hibakód SQLITE_ERROR (vagy 1). Ezt azonban módosíthatja úgy, hogy a SqliteException kívánt értéket SqliteErrorCode adja meg a függvényben.

Hibakeresés

Az SQLite közvetlenül meghívja a megvalósítást. Ez lehetővé teszi olyan töréspontok hozzáadását, amelyek az SQLite lekérdezések kiértékelése során aktiválnak. A teljes .NET hibakeresési felület elérhető a felhasználó által definiált függvények létrehozásához.

Lásd még