Ошибка SQLite «несоответствие типа данных» с переменными одного типаC#

Место общения программистов C#
Ответить
Anonymous
 Ошибка SQLite «несоответствие типа данных» с переменными одного типа

Сообщение Anonymous »

У меня есть база данных SQLite с таблицей для хранения данных и виртуальной таблицей, которая связана с этой таблицей для функций поиска. Я получаю сообщение об ошибке, которое предположительно подразумевает, что мои таблицы и/или переменные имеют разные типы, но это не так.
Я проверил свой ввод, и кажется, что все в порядке. . Я несколько раз менял свои функции, но безрезультатно. MRE:

Код: Выделить всё

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

await InsertTracks(connection, [new Track("test_path", "test_artist", "test_title")]);
}

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

foreach (Track track in tracks)
{
command.Parameters.Add("$path", SqliteType.Text).Value = track.FilePath;
command.Parameters.Add("$artist", SqliteType.Text).Value = track.Artist;
command.Parameters.Add("$title", SqliteType.Text).Value = track.Title;

await command.ExecuteNonQueryAsync();
}
}
}
}
}
Полное сообщение об ошибке:

Код: Выделить всё

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#, поэтому не думаю, что проверил все, что должен был.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -same-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»