消息关闭
    暂无新消息!

关于写数据库的sql.stmt传递问题

问题作者 : Spinks2017-06-07发布
先写问题,代码在下面。
写入数据库可以这么写:
stmt,err:=db.Prepare(`insert into user_tb(userid,userNo) values (?,?)`) //要写入的userid和userNo都是int型。
然后就是:
stmt.exec(1,2)//分别把1和2写给userid和userNo两个值。

在同一个func里面这样写可以成功执行。
但是如果把prepare和exec分开就会报错,在exec那里报错。
怎么分开的:
先定义type:
type Mssql struct {
*sql.DB
dataSource string
database   string
windows    bool
sa         SA
stmt       *sql.Stmt //作为成员数据
}
然后写F1来执行prepare:
func (db *Mssql)F1(){
      db.stmt, _= db.Prepare(`insert into user_tb(userid,userNo) values (?,?)`)
      //这里把prepare返回的【*sql.Stmt】指针写给db的成员数据
}
j接下来用F2来做exec:
func (db *Mssql) F2(){
     db.stmt.exec(1,2)//编译不会报错,执行报错。
}

然后是main:
func main(){
  var db Mssql
 db.open(巴拉巴拉)
defer db.close()
db.F1() //这里执行prepare,赋值给成员数据的stmt
db.F2() //这里执行exec,但是出错了,执行的时候发现db.stmt已经是空的了?
}

问题就是,db.prepare()返回的是一个指针,是不是这个语句所在函数执行完毕之后就会把指针所在的地址释放掉?所以造成后面想用的时候就出错了?如果是的话怎样才能让stmt成功传递呢?

1个回答

︿ 2
db.stmt, _= db.Prepare(`insert into user_tb(userid,userNo) values (?,?)`)
--------------------------------
你都没有判断返回值error, 估计Prepare失败。