sql-server sql:Scan中应有3个目标参数,而Golang中只有1个

mum43rcc  于 2022-10-31  发布在  Go
关注(0)|答案(3)|浏览(335)

我正在写一个通用代码来查询任何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吗?如果有人能帮助我找到这个问题,我将不胜感激。

iih3973s

iih3973s1#

当您想要使用输入切片进行行扫描时,请使用可变3点表示法...将切片转换为单个参数,如下所示:

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
isr3a4wc

isr3a4wc2#

对于第二个示例,请尝试以下操作(接收方前面没有&符号):

err := rows.Scan(receiver)

receiver*string已经是一个引用类型,不需要再添加引用。

bnl4lu3b

bnl4lu3b3#

特定字段表

query := `select * from IMBookingApp.dbo.BA_Client__c
      ORDER BY
        ClientId__c ASC
      OFFSET 56 ROWS
      FETCH NEXT 10 ROWS ONLY ;`

更改为

query := `select ClientId, CompanyName, CreateDate   from IMBookingApp.dbo.BA_Client__c
      ORDER BY
        ClientId__c ASC
      OFFSET 56 ROWS
      FETCH NEXT 10 ROWS ONLY ;`

相关问题