【问题标题】:SQLite C# Insert an unsigned integer store a negative numberSQLite C#插入一个无符号整数存储一个负数
【发布时间】:2020-04-15 09:19:18
【问题描述】:

我有一张这张桌子

创建表 MyTable (Id NUMERIC NOT NULL,UnsignedValue NUMERIC 非空默认 0)

我必须在“UnsignedValue”列中保存一个数字作为 Id 和一个无符号整数。 我使用 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();
}

插入有效,但如果我使用 SQLite 的 DB 浏览器查看,在该列中我看到一个负值。 我担心我正在使用 Dapper 将数据源映射到我的对象模型。 SELECt 查询给出异常,因为该值对于 uint 类型来说太小了。

我在运行时检查了 IDbParameter.DbType,它是 UInt32,符合预期。

我错过了什么吗?

编辑:

按照下面 cmets 的建议,我尝试使用 INTEGER 列类型而不是 NUMERIC。但结果是一样的。

我还注意到存储的负值与显式 Int32 强制转换为 myUnsignedValue 相同。

【问题讨论】:

  • 可能是添加参数的方式不对。您应该尝试明确指定类型的那个。在这里,您的值大于 max int 并转换为负值
  • 你能检查出错误的不仅仅是 DB Browser 吗?使用命令行选择值,还是得到负值吗?
  • @DragandDrop 即使我指定了参数类型,结果也是一样的。顺便说一句,我的价值低于UInt32.MaxValue。所以我还是不明白为什么它被转换为负数。
  • 听起来 SQLite 是“正确地”确定参数的大小为 32 位,然后 将其视为有符号值 - 因为它没有无符号值。
  • 我会尝试将其声明为 Int64

标签: c# sqlite


【解决方案1】:

我怀疑 SQLite 没有正确确定值 - 首先它没有无符号整数 - 它们都是有符号的 64 位值,其次它确定给定值的大小,我认为它弄错了。

根据您的描述,听起来 SQLite 是“正确地”确定参数的 size 为 32 位,然后将其视为有符号值(因为它没有无符号整数)。因此,当该值被视为带符号的 32 位整数时,它会给您一个负值。

改为将变量声明为 Int64,它应该正确存储值。

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2023-04-08
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多