У меня есть база данных SQLite с таблицей для хранения данных и виртуальной таблицей, которая связана с этой таблицей для функций поиска. Я получаю сообщение об ошибке, которое предположительно подразумевает, что мои таблицы и/или переменные имеют разные типы, но это не так.
Я проверил свой ввод, и кажется, что все в порядке. . Я несколько раз менял свои функции, но безрезультатно. MRE:
Unhandled exception. Microsoft.Data.Sqlite.SqliteException (0x8000
4005): SQLite Error 20: 'datatype mismatch'.
at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(In
t32 rc, sqlite3 db)
at Microsoft.Data.Sqlite.SqliteDataReader.NextResult()
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBeh
avior behavior)
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader()
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery()
at System.Data.Common.DbCommand.ExecuteNonQueryAsync(Cancellati
onToken cancellationToken)
--- End of stack trace from previous location ---
at SqliteExample.Program.InsertTracks(SqliteConnection connecti
on, Track[] tracks) in E:\Documents\projects\sqlite-in-csharp\Sqli
teExample\Program.cs:line 201
at SqliteExample.Program.Main(String[] args) in E:\Documents\pr
ojects\sqlite-in-csharp\SqliteExample\Program.cs:line 39
at SqliteExample.Program.(String[] args)
Однако я новичок в C#, поэтому не думаю, что проверил все, что должен был.
У меня есть база данных SQLite с таблицей для хранения данных и виртуальной таблицей, которая связана с этой таблицей для функций поиска. Я получаю сообщение об ошибке, которое предположительно подразумевает, что мои таблицы и/или переменные имеют разные типы, но это не так. Я проверил свой ввод, и кажется, что все в порядке. . Я несколько раз менял свои функции, но безрезультатно. MRE: [code]using Microsoft.Data.Sqlite;
namespace SqliteExample { struct Track { public string FilePath; public string Artist; public string Title;
public Track(string file_path, string artist, string title) { FilePath = file_path; Artist = artist; Title = title; } }
class Program { static async Task Main(string[] args) { // Get database connection var connection = await Init();
static async Task Init() { // Make a connection to our database and open it var connection = new SqliteConnection("Data Source=meta.db"); await connection.OpenAsync();
// Create tables if they don't already exist using (var command = connection.CreateCommand()) { Console.WriteLine("\nCreating tables..."); // Create metadata table command.CommandText = """ CREATE TABLE IF NOT EXISTS meta ( file TEXT PRIMARY KEY, artist TEXT, title TEXT ) """;
await command.ExecuteNonQueryAsync();
// Create FTS5 virtual table command.CommandText = """ CREATE VIRTUAL TABLE IF NOT EXISTS search USING fts5( artist, title, content='meta', content_rowid='file' ); """;
await command.ExecuteNonQueryAsync();
// Push triggers command.CommandText = """ CREATE TRIGGER IF NOT EXISTS insert_search AFTER INSERT ON meta BEGIN INSERT INTO search(rowid, artist, title) VALUES (new.file, new.artist, new.title); END; CREATE TRIGGER IF NOT EXISTS update_search AFTER UPDATE ON meta BEGIN INSERT INTO search(search, rowid, artist, title) VALUES ('delete', old.file, old.artist, old.title); INSERT INTO search(rowid, artist, title) VALUES (new.file, new.artist, new.title); END; CREATE TRIGGER IF NOT EXISTS delete_search AFTER DELETE ON meta BEGIN INSERT INTO search(search, rowid, artist, title) VALUES ('delete', old.file, old.artist, old.title); END; """;
await command.ExecuteNonQueryAsync(); }
return connection; }
static async Task InsertTracks(SqliteConnection connection, Track[] tracks) { using (var command = connection.CreateCommand()) { Console.WriteLine("\nInserting entries..."); command.CommandText = "INSERT INTO meta (file, artist, title) VALUES ($path, $artist, $title)";
await command.ExecuteNonQueryAsync(); } } } } } [/code] Полное сообщение об ошибке: [code]Unhandled exception. Microsoft.Data.Sqlite.SqliteException (0x8000 4005): SQLite Error 20: 'datatype mismatch'. at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(In t32 rc, sqlite3 db) at Microsoft.Data.Sqlite.SqliteDataReader.NextResult() at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBeh avior behavior) at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader() at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery() at System.Data.Common.DbCommand.ExecuteNonQueryAsync(Cancellati onToken cancellationToken) --- End of stack trace from previous location --- at SqliteExample.Program.InsertTracks(SqliteConnection connecti on, Track[] tracks) in E:\Documents\projects\sqlite-in-csharp\Sqli teExample\Program.cs:line 201 at SqliteExample.Program.Main(String[] args) in E:\Documents\pr ojects\sqlite-in-csharp\SqliteExample\Program.cs:line 39 at SqliteExample.Program.(String[] args) [/code] Однако я новичок в C#, поэтому не думаю, что проверил все, что должен был.