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 folyamaton belül működik az alkalmazással együtt. 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 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
";

Működtetők

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 Funkció
X GLOB Y glob(Y, X)
X olyan, mint 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();

Összesítő fü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 CreateAggregate használatával.

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 kontextust. 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 bejárása után számítsa ki a végeredményt a kontextusbó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();

Hibák

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). Azonban úgy módosíthatja, hogy a függvénybe bedob egy SqliteException-t, a kívánt SqliteErrorCode megadásával.

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