【发布时间】:2020-04-15 09:19:18
【问题描述】:
我有一张这张桌子
创建表
MyTable(IdNUMERIC NOT NULL,UnsignedValueNUMERIC 非空默认 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