1

我正在使用 The Brainman 的 ODBC 驱动程序。我使用的是通用 ODBC 语法,即使用“CALL”来调用存储过程。这是我的代码:

stmt, stmtErr := db.Prepare("CALL RecordClick (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
if stmtErr != nil {
    fmt.Printf("\nstmtErr: %s", stmtErr)
}
defer stmt.Close()

var aclickid int
stmtRows, stmtRowsErr := stmt.Query(xaid, subtag, r.Referer, requestUserAgent, requestIP, ip, ua, title, description, displayurl, clickUrl, kw, rpc, exid)
if stmtRowsErr != nil {
    fmt.Printf("\nstmtRowsErr: %s", stmtRowsErr)
}
for stmtRows.Next() {
    stmtRows.Scan(&aclickid)
}

当我运行它时,我收到以下错误:

stmtRowsErr: sql: converting Exec argument #2's type: unsupported type func() string, a func

我真的不明白我在这里做错了什么。我已经尝试过在 CALL XXX (?, ?, ?) 部分周围使用和不使用花括号,但它仍然无法正常工作。有任何想法吗?

谢谢。

4

1 回答 1

2

我的猜测是r.Referer(Type func) instmt.Query应该是r.Referer()(Returns type string, From net/http)。

所以该行应该是:

stmtRows, stmtRowsErr := stmt.Query(xaid, subtag, r.Referer(), requestUserAgent, requestIP, ip, ua, title, description, displayurl, clickUrl, kw, rpc, exid)

该错误来自package中的第 37 行convert.godatabase/sql

它告诉您 SQL 查询的参数 #2(零索引)的类型转换无法转换为 SQL 引擎预期的类型(特别是函数 driver.DefaultParameterConverter.ConvertValue(arg)失败。)

检查查询中每个变量的类型,例如:

fmt.Printf("%T %T %T %T %T %T %T %T %T %T %T %T %T %T", xaid, subtag, r.Referer, requestUserAgent, requestIP, ip, ua, title, description, displayurl, clickUrl, kw, rpc, exid)

并查看其中是否有任何意外或不正确。

于 2013-11-06T07:15:02.080 回答