Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
De flesta databaser har en procedurmässig dialekt av SQL som du kan använda för att definiera dina egna funktioner. SQLite körs dock i samma process som din app. I stället för att behöva lära dig en ny dialekt av SQL kan du bara använda programmeringsspråket i din app.
Skalärfunktioner
Skalärfunktioner returnerar ett enda skalärt värde för varje rad i en fråga. Definiera nya skalärfunktioner och åsidosätt de inbyggda med hjälp av CreateFunction.
Se Datatyper för en lista över parametrar som stöds och returtyper för func argumentet.
Om du state anger argumentet skickas värdet till varje anrop av funktionen. Använd detta för att undvika stängningar.
Ange isDeterministic om funktionen är deterministisk för att tillåta att SQLite använder ytterligare optimeringar vid kompilering av frågor.
I följande exempel visas hur du lägger till en skalär funktion för att beräkna radien för en cylinder.
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örer
Följande SQLite-operatorer implementeras av motsvarande skalärfunktioner. Om du definierar dessa skalärfunktioner i din app åsidosätts beteendet för dessa operatorer.
| Operatör | Funktion |
|---|---|
| X GLOB Y | glob(Y, X) |
| X liknar Y | like(Y, X) |
| X LIKE Y ESCAPE Z | like(Y, X, Z) |
| X JÄMFÖR Y | match(Y, X) |
| X REGEXP Y | regexp(Y, X) |
I följande exempel visas hur du definierar funktionen regexp för att aktivera motsvarande operator. SQLite innehåller inte någon standardimplementering av regexp-funktionen.
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();
Aggregatfunktioner
Mängdfunktioner returnerar ett enda, aggregerat värde för alla rader i en fråga. Definiera och åsidosätta mängdfunktioner med hjälp av CreateAggregate.
Argumentet seed anger kontextens ursprungliga tillstånd. Använd detta för att undvika stängningar också.
Argumentet func anropas en gång per rad. Använd kontexten för att ackumulera ett slutligt resultat. Returnera kontexten. Det här mönstret gör att kontexten kan vara en värdetyp eller oföränderlig.
Om inget resultSelector anges används kontextens slutliga tillstånd som resultat. Detta kan förenkla definitionen av funktioner som summa och antal som bara behöver öka ett tal varje rad och returnera det.
Ange resultSelector för att beräkna slutresultatet från kontexten efter iterering genom alla rader.
Se Datatyper för en lista över parametertyper som stöds för func argumentet och returtyperna för resultSelector.
Om funktionen är deterministisk anger du isDeterministic så att SQLite kan använda ytterligare optimeringar vid kompilering av frågor.
I följande exempel definieras en mängdfunktion för att beräkna standardavvikelsen för en kolumn.
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();
Felaktigheter
Om en användardefinierad funktion utlöser ett undantag returneras meddelandet till SQLite. SQLite skapar sedan ett fel och Microsoft.Data.Sqlite genererar en SqliteException. Mer information finns i Databasfel.
Som standard är felkoden SQLite SQLITE_ERROR (eller 1). Du kan dock ändra det genom att kasta en SqliteException i din funktion med önskad SqliteErrorCode angiven.
Felsökning
SQLite anropar implementeringen direkt. På så sätt kan du lägga till brytpunkter som utlöses medan SQLite utvärderar frågor. Den fullständiga .NET-felsökningsfunktionen är tillgänglig för att hjälpa dig att skapa dina användardefinierade funktioner.