如何修复错误mssql:将数据类型decimal转换为nvarchar时出错。使用Go-MSSQLSDB进入Go

如何修复错误mssql:将数据类型decimal转换为nvarchar时出错。使用Go-MSSQLSDB进入Go,sql,sql-server,go,Sql,Sql Server,Go,我很难理解为什么在使用go MSSQLSDB驱动程序时无法使用我定义的参数执行存储过程。如果有人能指出我在定义作为参数传递的值时出错的地方,这将导致从microsoft sql server数据库“mssql:error converting data type decimal to nvarchar”(mssql:error converting data type decimal to nvarchar)接收到错误。在使用Go MSSQLSDB的Go中,我们将不胜感激 我在下面的存储过程中包

我很难理解为什么在使用go MSSQLSDB驱动程序时无法使用我定义的参数执行存储过程。如果有人能指出我在定义作为参数传递的值时出错的地方,这将导致从microsoft sql server数据库“mssql:error converting data type decimal to nvarchar”(mssql:error converting data type decimal to nvarchar)接收到错误。在使用Go MSSQLSDB的Go中,我们将不胜感激

我在下面的存储过程中包含了我正在使用的代码,甚至包括参数定义

Go代码:

package main

import (
    "context"
    "database/sql"
    "flag"
    "fmt"
    _ "github.com/denisenkom/go-mssqldb"
    "github.com/shopspring/decimal"
    "log"
)

var (
    debug         = flag.Bool("debug", true, "enable debugging")
    userid        = flag.String("U", "user", "the database user")
    password      = flag.String("P", "password", "the database password")
    server        = flag.String("S", "address", "the database server")
    port     *int = flag.Int("port", 1433, "the database port")
    database      = flag.String("d", "database", "the database")
    encrypt       = flag.String("e", "disable", "the encryption flag")
)

func main() {

    flag.Parse()

    if *debug {
        fmt.Printf(" port:%d\n", *port)
        fmt.Printf(" server:%s\n", *server)
        fmt.Printf(" user:%s\n", *userid)
        fmt.Printf(" database:%s\n", *database)
    }

    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    connString := fmt.Sprintf("server=%s;port=%d;user id=%s;password=%s;database=%s;encrypt=%s;", *server, *port, *userid, *password, *database, *encrypt)
    if *debug {
        fmt.Printf(" connString:%s\n", connString)
    }
    db, err := sql.Open("sqlserver", connString)
    if err != nil {
        log.Fatal("Open connection failed:", err.Error())
    }

    defer db.Close()

    // bigint
    WarehouseID := 1

    // nvarchar(7)
    TaxCode := "Vertex"

    // nvarchar(max)
    LineItemTotals := "16.35"

    // decimal(19,5)
    TotalTax, _ := decimal.NewFromString("00.00")

    // nvarchar(50)
    ShipToAddress1 := "Address1"

    // nvarchar(50)
    ShipToAddress2 := "Address2"

    // nvarchar(40)
    ShipToCity := "Seattle"

    // nvarchar(5)
    ShipToState := "WA"

    // nvarchar(10)
    ShipToZip := "zip"

    // nchar(3)
    ISOCountryCode := "USA"

    // decimal(19,5)
    FreightCharge, _ := decimal.NewFromString("12.10")

    // bigInt
    CustomerID := 456118

    // bigint
    Timeout := 5000

    rows, err := db.QueryContext(ctx, "EAPI_CalculateTax",

        sql.Named("WarehouseID", WarehouseID),

        sql.Named("TaxCode", TaxCode),

        sql.Named("LineItemTotals", LineItemTotals),
        sql.Named("ShipToAddress1", ShipToAddress1),
        sql.Named("ShipToAddress2", ShipToAddress2),
        sql.Named("ShipToCity", ShipToCity),
        sql.Named("ShipToState", ShipToState),
        sql.Named("ShipToZip", ShipToZip),
        sql.Named("ISOCountryCode", ISOCountryCode),
        sql.Named("FreightCharge", FreightCharge),
        sql.Named("CustomerID", CustomerID),
        sql.Named("Timeout", Timeout),
        sql.Named("TotalTax", sql.Out{Dest: &TotalTax}),
    )

    if err != nil {
        log.Fatal("Prepare failed: ", err.Error())
    }
    defer rows.Close()

    var strrow string
    for rows.Next() {
        err = rows.Scan(&strrow)
    }
    fmt.Printf("TotalTax is %d", TotalTax)
}
sql存储过程参数:

@WarehouseID bigint,
@TaxCode nvarchar(7),
@LineItemTotals nvarchar(max),
@TotalTax decimal(19,5) OUTPUT,
@ShipToAddress1 nvarchar(50) = '', 
@ShipToAddress2 nvarchar(50) = '', 
@ShipToCity nvarchar(40) = '', 
@ShipToState nvarchar(5) = '', 
@ShipToZip nvarchar(10) = '', 
@ISOCountryCode nchar(3) = 'USA',
@FreightCharge decimal(19,5) = 0,
@CustomerID bigInt = 0,
@Timeout bigint = 0
编辑:

我在errorx库中添加了一个,并获得了更好的堆栈跟踪。堆栈跟踪如下所示:

mssql: Error converting data type decimal to nvarchar.
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x4cd337]

goroutine 1 [running]:
database/sql.(*Rows).Next(0x0, 0xc0000468a0)
        C:/Go/src/database/sql/sql.go:2640 +0x37
main.main()
        C:/Users/chris/go/src/RAPI/main.go:99 +0xc18

检查这是否是订单问题


意思:尝试使用
sql.Named()调用
db.QueryContext(ctx,
参数的列出顺序与sql存储过程参数的定义顺序相同。

同时检查十进制精度是否存在问题。我现在就试试!待机!我尝试了你说的操作,但没有任何更改。我还包括了errorx库,并编辑了我的问题以包括堆栈跟踪。它不喜欢行下一个语句,似乎返回nil?还是我对TotalTax参数的引用错误?