sql - sql:“扫描”中应有3个目标参数,在Golang中不是1个

标签 sql sql-server go

我正在编写通用代码以从任何RDS表查询数据。我经历了很多StackOverflow答案,但是没有一个对我有用。我已经通过以下链接:-

  • panic: sql: expected 1 destination arguments in Scan, not <number> golang, pq, sql
  • How to query any table of RDS using Golang SDK

  • 我的第一个代码是
    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/

    相关文章:

    json - Golang 中的语法错误

    mysql - 选择数据: paginating data from multiple tables with inconsistent dates

    SQL查询选择优化

    mysql - SQL查询丢弃具有多个条目的记录

    sql-server - 在 T-SQL 中获取过去 24 小时结果的最佳方法是什么?

    sql-server - SQL Server——循环遍历每个表中的每一列?

    memory - 如何将内存地址(如 0xc20803a000)转换为字符串?戈朗

    sql - 嵌套游标、多个结果集

    sql - 无法通过 SQL 查询替换 Char(63)

    go - 在 Gogland,我使用 go run 得到 'flag provided but not defined: -goversion'