SQLite C# Вставьте целое число без знака для хранения отрицательного числа - PullRequest
1 голос
/ 15 апреля 2020

У меня есть эта таблица

CREATE TABLE MyTable (Id NUMERI C NOT NULL, UnsignedValue NUMERI C NOT NULL DEFAULT 0)

Я должен сохранить число как Id и целое число без знака в столбце «UnsignedValue». Моя вставка с использованием C#:

int id = 1;
uint myUnsignedValue = 3990427167;
using (IDbCommand cmd = connection.CreateCommand())
{
    cmd.CommandText = $@"INSERT INTO MyTable (Id, UnsignedValue) VALUES (@id, @value)";

    IDbDataParameter par = cmd.CreateParameter();
    par.ParameterName = "@id";
    par.Value = id;
    cmd.Parameters.Add(par);

    par = cmd.CreateParameter();
    par.ParameterName = "@value";
    par.Value = myUnsignedValue;
    cmd.Parameters.Add(par);

    cmd.ExecuteNonQuery();
}

Вставка работает, но если я смотрю в DB Browser для SQLite, в этом столбце я вижу отрицательное значение . Меня беспокоит то, что я использую Dapper для отображения источника данных в моей объектной модели. Запрос SELECt дает исключение, потому что значение слишком мало для типа uint.

Я проверил IDbParameter.DbType во время выполнения, и это UInt32, как и ожидалось.

Я что-то упустил?

EDIT :

Как указано в комментариях ниже, я попытался использовать тип столбца INTEGER вместо NUMERI C. Но результат тот же.

Я также заметил, что сохраненное отрицательное значение совпадает с явным приведением Int32 к myUnsignedValue.

1 Ответ

1 голос
/ 15 апреля 2020

Я подозреваю, что SQLite не определяет значение правильно - во-первых, у него нет целых чисел без знака - все они являются 64-битными значениями со знаком, во-вторых, он определяет размер по значению, и я думаю, что это неправильно.

Из того, что вы описываете, звучит так, что SQLite «правильно» определяет размер параметра как 32-битный, а затем рассматривает его как значение со знаком (потому что у него нет целых чисел без знака). Поэтому, когда значение обрабатывается как 32-разрядное целое число со знаком, оно дает отрицательное значение.

Вместо этого объявите переменную как Int64, и оно должно правильно хранить значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...