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

sshcrbum  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(462)

我的firebird程序只接受几个bigint值的参数。当我从go调用这个过程时,程序参数类型为uint64,值大于max int32/2,存储为负数。如何将bigint/uint64值作为参数传递?

  1. import (
  2. ...
  3. "database/sql"
  4. "github.com/arteev/firebirdsql"
  5. )
  6. ...
  7. type Data struct {
  8. Value uint64
  9. Sum uint64
  10. Ts time.Time
  11. }
  12. ...
  13. tx, _ := db.Begin()
  14. st, err := tx.Prepare("execute procedure add_summary(?, ? ,? ,?, ?)")
  15. if err != nil {
  16. tx.Rollback()
  17. }
  18. defer st.Close()
  19. if _, err := st.Exec(ip, ifKey, port, data.Sum, data.Ts); err != nil {
  20. ...
  21. } else {
  22. ...
  23. }
  24. ...

架构/表ddl片段:

  1. CREATE TABLE ADM_SUMMARY (
  2. ITEM_ID INTEGER NOT NULL,
  3. PERIOD CHAR(1) NOT NULL,
  4. VAL BIGINT NOT NULL,
  5. DT TIMESTAMP NOT NULL,
  6. UNITS CHAR(1) NOT NULL
  7. );

过程ddl片段:

  1. CREATE OR ALTER PROCEDURE ADD_SUMMARY (
  2. ip varchar(20),
  3. if_key varchar(20),
  4. if_num integer,
  5. val bigint,
  6. dt timestamp)
  7. as...

我写了一个小测试:测试代码

  1. tx, err := db.Begin()
  2. if err != nil {
  3. tx.Rollback()
  4. }
  5. _, err = tx.Exec("insert into test(B1) values(?)", uint64(2147483648))
  6. if err != nil {
  7. fmt.Println(err)
  8. }
  9. tx.Commit()

试验台ddl:

  1. CREATE TABLE TEST (
  2. B1 BIGINT
  3. );

结果:b1=-2147483648

g6baxovj

g6baxovj1#

nakagami在2小时前添加了引用此问题的提交修复问题#112 92e5c50 nakagami在2小时前关闭了此问题
从我的错误报告几个小时后,它就被作者关闭了。github.com/arteev/firebirdsql上的bug报告仍然打开。感谢大家的参与和建议。

相关问题