驱动程序将 uint64 参数转换为 int32 负值



我的火鸟过程采用几个具有bigint值的参数。 当我从 uint64 类型的 go 程序参数调用此过程时,值大于最大 int32/2 存储为负数。 如何将 bigint/uint64 值作为参数传递?

import (
...
"database/sql"
"github.com/arteev/firebirdsql"
)
...
type Data struct {
Value uint64
Sum   uint64
Ts    time.Time
}
...
tx, _ := db.Begin()
st, err := tx.Prepare("execute procedure add_summary(?, ? ,? ,?, ?)")
if err != nil {
tx.Rollback()
}
defer st.Close()
if _, err := st.Exec(ip, ifKey, port, data.Sum, data.Ts); err != nil {
...   
} else {
...
}
...

架构/表 DDL 片段:

CREATE TABLE ADM_SUMMARY (
ITEM_ID  INTEGER NOT NULL,
PERIOD   CHAR(1) NOT NULL,
VAL      BIGINT NOT NULL,
DT       TIMESTAMP NOT NULL,
UNITS    CHAR(1) NOT NULL
);

过程 DDL 片段:

CREATE OR ALTER PROCEDURE ADD_SUMMARY (
ip varchar(20),
if_key varchar(20),
if_num integer,
val bigint,
dt timestamp)
as...

我写了很少的测试: 测试代码

tx, err := db.Begin()
if err != nil {
tx.Rollback()
}
_, err = tx.Exec("insert into test(B1) values(?)", uint64(2147483648))
if err != nil {
fmt.Println(err)
}
tx.Commit()

测试表DDL:

CREATE TABLE TEST (
B1  BIGINT
);

结果:B1 = -2147483648

> Nakagami 添加了一个引用此问题的提交 2 小时前修复 问题 #112 92E5C50 中上在 2 小时前关闭了这个

从我的错误报告几个小时后,它被作者关闭了。 github.com/arteev/firebirdsql 的错误报告仍然打开。 感谢大家的参与和建议。

最新更新