【问题标题】:why after I connect to sql server with library golang go-mssqldb, it prints <nil>?为什么在我使用库 golang go-mssqldb 连接到 sql server 后,它会打印 <nil>?
【发布时间】:2020-08-13 16:59:29
【问题描述】:

在我连接到 sql server 后,它打印 &lt;nil&gt; ,我的代码有什么问题,或者我与 sql server 的连接有问题,因为它们只打印 &lt;nil&gt;

错误截图:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/denisenkom/go-mssqldb"
    "github.com/gin-gonic/gin"
    "net/http"
)

func main()  {
    db, err :=  sql.Open("sqlserver","sqlserver://sa:@localhost:1433?database=CONFINS&connection+timeout=30")
    if err != nil{
        fmt.Print(err.Error())
    }


    err = db.Ping()

    if err != nil {
        fmt.Print(err.Error())
    }
    defer db.Close()

    type SMSBlast struct {
        SequenceID  string
        MobilePhone string
        Output  string
        WillBeSentDate string
        SentDate string
        Status string
        DtmUpd string
    }

    router := gin.Default()

    //Get a SMSBlast  detail
    router.GET("/SMSBlast2/:SequenceID", func(context *gin.Context) {
        var(
            smsblast SMSBlast
            result gin.H
        )

        SequenceID := context.Param("SequenceID")
        fmt.Println(db.Ping())
        row := db.QueryRow("select SequenceID, MobilePhone, Output, WillBeSentDate, SentDate, Status, DtmUpd from SMSBlast2 = ?;",SequenceID)
        err = row.Scan(&smsblast.SequenceID, &smsblast.MobilePhone, &smsblast.Output, &smsblast.WillBeSentDate, &smsblast.SentDate, &smsblast.Status, &smsblast.DtmUpd)
        if err != nil{
            //if no results send null
            result = gin.H{
                "result": nil,
                "count":  0,
            }
            }else{
                result = gin.H{
                    "result" : smsblast,
                    "count" : 1,
                }
            }

        context.JSON(http.StatusOK, result)
    })
    router.Run(":8080")

}

【问题讨论】:

  • 谁是“他们”,他们在哪里返回? SQL,这种语言,不仅仅是 SQL Server,没有nil您的代码虽然似乎在出错的情况下返回该值,但甚至没有检查该错误是什么
  • 你的 sql 字符串中不是缺少WHERE SequenceID = ? 吗?无论如何这只是一个猜测,你真的应该只记录从row.Scan返回的错误,这样你就会知道你做错了什么。
  • @mkopriva 我用 row := db.QueryRow("select SequenceID, MobilePhone, Output, WillBeSentDate, SentDate, Status, DtmUpd from SMSBlast2 where SequenceID = ?;",SequenceID) 更正了该代码,但仍然显示 nil
  • @DevoAvidiantoPratama 它是 your 代码,如果有任何错误。您应该修改代码以至少记录错误,而不仅仅是返回 emtpy 结果。您已经有一个语法错误会阻止您的查询运行。错误消息会解释这一点。
  • @DevoAvidiantoPratama 在编写代码之前使用 SSMS 或 ADS 或您想要的任何其他数据库客户端工具测试查询。如果您不能直接运行查询,您将无法使用自己的代码运行它

标签: go go-gin


【解决方案1】:
    fmt.Println(db.Ping())

打印db.Ping()返回的错误,通常是nil

【讨论】:

  • 那是正确的谢谢,我忘记删除db.ping()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多