Я прочитал тип даты документа sqlite , который указывает, что SMALLINT - это affinity INTEGER.
I use the library below.
https://www.nuget.org/packages/System.Data.SQLite.Core/1.0.113.1
Common function
private static void TestSqlite(IDbConnection conn, string sql, Action<SQLiteCommand> action)
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = sql;
action?.Invoke(cmd);
conn.Close();
}
(1) Я создаю таблицу TESTOVERFLOW.
var cache = "Cache.db";
var conn = new SQLiteConnection($"Data Source={cache};Version=3;");
var sql1 = "CREATE TABLE IF NOT EXISTS TESTOVERFLOW(ID INTEGER PRIMARY KEY AUTOINCREMENT, SHOWSMALLINT SMALLINT NOT NULL)";
TestSqlite(conn, sql1, (cmd) => cmd.ExecuteNonQuery());
(2) Я вставляю значение 65535 с именем SHOWSMALLINT в таблицу TESTOVERFLOW.
var sql2 = "INSERT INTO TESTOVERFLOW(SHOWSMALLINT) VALUES (65535)";
TestSqlite(conn, sql2, (cmd) => cmd.ExecuteNonQuery());
(3) Прочтите таблицу TESTOVERFLOW и выберите столбец SHOWSMALLINT. Я получаю значение -1.
var sql3 = "SELECT * FROM TESTOVERFLOW";
TestSqlite(conn, sql3, (cmd) =>
{
var reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine($"{reader[0]} | {reader[1]}");
// 1 | -1
}
});
(3.1) Используйте команду sqlite3 для чтения таблицы TESTOVERFLOW, и я получил значение SHOWSMALLINT, равное 65535, см. Рисунок ниже.
введите описание изображения здесь
(4) почему я использую C# SQLiteconnection читать значение -1, а не 65535?
65535 и -1 для двоичного кода ниже
1111 1111 1111 1111(2)(unsign) => 65535(10)
1111 1111 1111 1111(2)(sign) => -1(10)
SMALLINT - это affinity INTEGER. Поэтому я думаю, что значение чтения должно быть 65535, потому что я вставляю значение 65535 правильно, не показываю ошибку.
Я использую значение чтения команды sqlite 65535, но я использую Sqliteconnection, похоже, значение -1.
Тип данных чтения SQLiteConnection не соответствует типу документа sqlite?