SQLiteConnection читать SMALLINT переполнение - PullRequest
1 голос
/ 11 июля 2020

Я прочитал тип даты документа sqlite , который указывает, что SMALLINT - это affinity INTEGER.

enter image description here

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?

1 Ответ

0 голосов
/ 17 июля 2020

Наконец, я пишу тестовый проект для SQLiteConnection.
Тест System.Data.SQLite.Core библиотека, которая использует IDataReader для чтения значения и перечисляет тип данных sqlite ниже.

Range is 0 ~ 255, 0 ~ (2^8 -1)
TINYINT

Range is -32768 ~ 32767, (-2^15) ~ (2^15 -1)
SMALLINT

Range is -2147483648 ~ 2147483647, (-2^31) ~ (2^31 -1)
INT
MEDIUMINT

Range is over than -9223372036854775808 ~ 9223372036854775807, (-2^63) ~ (2^63 -1) that will cast to the exponent value
INTEGER
INT2
INT8
BIGINT
UNSIGNED BIG INT

Если вам интересно результат можно ссылаться на тестовый проект .

...