From e1b390a91c018ac8e13c92fffaddb65012244bf5 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 28 Jul 2021 13:19:02 +0800 Subject: [PATCH] implementation scan for mssql --- dialects/mssql.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/dialects/mssql.go b/dialects/mssql.go index 3b935396..092d7f93 100644 --- a/dialects/mssql.go +++ b/dialects/mssql.go @@ -14,6 +14,7 @@ import ( "strings" "xorm.io/xorm/core" + "xorm.io/xorm/internal/convert" "xorm.io/xorm/schemas" ) @@ -712,3 +713,35 @@ func (p *odbcDriver) GenScanResult(colType string) (interface{}, error) { return &r, nil } } + +func (b *odbcDriver) Scan(ctx *ScanContext, rows *core.Rows, types []*sql.ColumnType, vv ...interface{}) error { + var scanResults = make([]interface{}, 0, len(types)) + var replaces = make([]bool, 0, len(types)) + var err error + for i, v := range vv { + var replaced bool + var scanResult interface{} + if types[i].DatabaseTypeName() == "NVARCHAR" { + scanResult = &sql.RawBytes{} + replaced = true + } else { + scanResult = v + } + + scanResults = append(scanResults, scanResult) + replaces = append(replaces, replaced) + } + + if err = rows.Scan(scanResults...); err != nil { + return err + } + + for i, replaced := range replaces { + if replaced { + if err = convert.Assign(vv[i], scanResults[i], ctx.DBLocation, ctx.UserLocation); err != nil { + return err + } + } + } + return nil +}