1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-19 13:19:43 +02:00
documize/vendor/github.com/denisenkom/go-mssqldb/newconnector_example_test.go
2019-06-25 15:37:19 +01:00

143 lines
3.5 KiB
Go

// +build go1.10
package mssql_test
import (
"context"
"database/sql"
"flag"
"fmt"
"log"
"net/url"
"strconv"
mssql "github.com/denisenkom/go-mssqldb"
)
var (
debug = flag.Bool("debug", false, "enable debugging")
password = flag.String("password", "", "the database password")
port *int = flag.Int("port", 1433, "the database port")
server = flag.String("server", "", "the database server")
user = flag.String("user", "", "the database user")
)
const (
createTableSql = "CREATE TABLE TestAnsiNull (bitcol bit, charcol char(1));"
dropTableSql = "IF OBJECT_ID('TestAnsiNull', 'U') IS NOT NULL DROP TABLE TestAnsiNull;"
insertQuery1 = "INSERT INTO TestAnsiNull VALUES (0, NULL);"
insertQuery2 = "INSERT INTO TestAnsiNull VALUES (1, 'a');"
selectNullFilter = "SELECT bitcol FROM TestAnsiNull WHERE charcol = NULL;"
selectNotNullFilter = "SELECT bitcol FROM TestAnsiNull WHERE charcol <> NULL;"
)
func makeConnURL() *url.URL {
return &url.URL{
Scheme: "sqlserver",
Host: *server + ":" + strconv.Itoa(*port),
User: url.UserPassword(*user, *password),
}
}
// This example shows the usage of Connector type
func ExampleConnector() {
flag.Parse()
if *debug {
fmt.Printf(" password:%s\n", *password)
fmt.Printf(" port:%d\n", *port)
fmt.Printf(" server:%s\n", *server)
fmt.Printf(" user:%s\n", *user)
}
connString := makeConnURL().String()
if *debug {
fmt.Printf(" connString:%s\n", connString)
}
// Create a new connector object by calling NewConnector
connector, err := mssql.NewConnector(connString)
if err != nil {
log.Println(err)
return
}
// Use SessionInitSql to set any options that cannot be set with the dsn string
// With ANSI_NULLS set to ON, compare NULL data with = NULL or <> NULL will return 0 rows
connector.SessionInitSQL = "SET ANSI_NULLS ON"
// Pass connector to sql.OpenDB to get a sql.DB object
db := sql.OpenDB(connector)
defer db.Close()
// Create and populate table
_, err = db.Exec(createTableSql)
if err != nil {
log.Println(err)
return
}
defer db.Exec(dropTableSql)
_, err = db.Exec(insertQuery1)
if err != nil {
log.Println(err)
return
}
_, err = db.Exec(insertQuery2)
if err != nil {
log.Println(err)
return
}
var bitval bool
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// (*Row) Scan should return ErrNoRows since ANSI_NULLS is set to ON
err = db.QueryRowContext(ctx, selectNullFilter).Scan(&bitval)
if err != nil {
if err.Error() != "sql: no rows in result set" {
log.Println(err)
return
}
} else {
log.Println("Expects an ErrNoRows error. No error is returned")
return
}
// (*Row) Scan should return ErrNoRows since ANSI_NULLS is set to ON
err = db.QueryRowContext(ctx, selectNotNullFilter).Scan(&bitval)
if err != nil {
if err.Error() != "sql: no rows in result set" {
log.Println(err)
return
}
} else {
log.Println("Expects an ErrNoRows error. No error is returned")
return
}
// Set ANSI_NULLS to OFF
connector.SessionInitSQL = "SET ANSI_NULLS OFF"
// (*Row) Scan should copy data to bitval
err = db.QueryRowContext(ctx, selectNullFilter).Scan(&bitval)
if err != nil {
log.Println(err)
return
}
if bitval != false {
log.Println("Incorrect value retrieved.")
return
}
// (*Row) Scan should copy data to bitval
err = db.QueryRowContext(ctx, selectNotNullFilter).Scan(&bitval)
if err != nil {
log.Println(err)
return
}
if bitval != true {
log.Println("Incorrect value retrieved.")
return
}
}