我正在编写通用代码以从任何RDS表查询数据。我经历了很多StackOverflow答案,但是没有一个对我有用。我已经通过以下链接:-
我的第一个代码是
package main
import (
"fmt"
)
type BA_Client struct {
ClientId int `json:ClientId;"`
CompanyName string `json:CompanyName;"`
CreateDate string `json:CreateDate;"`
}
func main() {
conn, _ := getConnection() // Det database connection
query := `select * from IMBookingApp.dbo.BA_Client
ORDER BY
ClientId ASC
OFFSET 56 ROWS
FETCH NEXT 10 ROWS ONLY ;`
var p []byte
err := conn.QueryRow(query).Scan(&p)
if err != nil {
fmt.Println("Error1", err)
}
fmt.Println("Data:", p)
var m BA_Client
err = json.Unmarshal(p, &m)
if err != nil {
fmt.Println("Error2", err)
}
}
我的第二个代码是
conn, _ := getConnection()
query := `select * from IMBookingApp.dbo.BA_Client__c
ORDER BY
ClientId__c ASC
OFFSET 56 ROWS
FETCH NEXT 10 ROWS ONLY ;`
rows, err := conn.Query(query)
if err != nil {
fmt.Println("Error:")
log.Fatal(err)
}
println("rows", rows)
defer rows.Close()
columns, err := rows.Columns()
fmt.Println("columns", columns)
if err != nil {
panic(err)
}
for rows.Next() {
receiver := make([]*string, len(columns))
err := rows.Scan(&receiver )
if err != nil {
fmt.Println("Error reading rows: " + err.Error())
}
fmt.Println("Data:", p)
fmt.Println("receiver", receiver)
}
使用这两个代码,我得到如下相同的错误
sql: expected 3 destination arguments in Scan, not 1
可能是因为我使用的是SQL Server而不是MySQL?感谢是否有人可以帮助我找到问题。
最佳答案
当您要使用输入 slice 进行行扫描时,请使用可变的3点表示法...
将 slice 转换为单独的参数,如下所示:
err := rows.Scan(receiver...)
使用可变参数的您的列(在本例中为三列)将有效地扩展为:
// len(receiver) == 3
err := rows.Scan(receiver[0], receiver[1], receiver[2])
编辑:
SQL扫描方法参数值的类型必须为
interface{}
。因此,我们需要一个中间片。例如:is := make([]interface{}, len(receiver))
for i := range is {
is[i] = receiver[i]
// each is[i] will be of type interface{} - compatible with Scan()
// using the underlying concrete `*string` values from `receiver`
}
// ...
err := rows.Scan(is...)
// `receiver` will contain the actual `*string` typed items
关于sql - sql:“扫描”中应有3个目标参数,在Golang中不是1个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59629440/