Golang查詢SqlServer數(shù)據(jù)庫

Go語言中查詢SqlServer數(shù)據(jù)庫

一秦士、Go語言中查詢MsSQL數(shù)據(jù)庫:

// main.go

package main

import (

? ? "database/sql"

? ? "fmt"

? ? "log"

? ? "time"

? ? _ "github.com/denisenkom/go-mssqldb"

)

func main() {

? ? var isdebug = true

? ? var server = "localhost"

? ? var port = 1433

? ? var user = "sa"

? ? var password = "123456xx"

? ? var database = "MyTestDB"

? ? //連接字符串

? ? connString := fmt.Sprintf("server=%s;port%d;database=%s;user id=%s;password=%s", server, port, database, user, password)

? ? if isdebug {

? ? ? ? fmt.Println(connString)

? ? }

? ? //建立連接

? ? conn, err := sql.Open("mssql", connString)

? ? if err != nil {

? ? ? ? log.Fatal("Open Connection failed:", err.Error())

? ? }

? ? defer conn.Close()

? ? //產(chǎn)生查詢語句的Statement

? ? stmt, err := conn.Prepare(`select * from [account_region]`)

? ? if err != nil {

? ? ? ? log.Fatal("Prepare failed:", err.Error())

? ? }

? ? defer stmt.Close()

? ? //通過Statement執(zhí)行查詢

? ? rows, err := stmt.Query()

? ? if err != nil {

? ? ? ? log.Fatal("Query failed:", err.Error())

? ? }

? ? //建立一個列數(shù)組

? ? cols, err := rows.Columns()

? ? var colsdata = make([]interface{}, len(cols))

? ? for i := 0; i < len(cols); i++ {

? ? ? ? colsdata[i] = new(interface{})

? ? ? ? fmt.Print(cols[i])

? ? ? ? fmt.Print("\t")

? ? }

? ? fmt.Println()

? ? //遍歷每一行

? ? for rows.Next() {

? ? ? ? rows.Scan(colsdata...) //將查到的數(shù)據(jù)寫入到這行中

? ? ? ? PrintRow(colsdata)? ? //打印此行

? ? }

? ? defer rows.Close()

}

//打印一行記錄羹铅,傳入一個行的所有列信息

func PrintRow(colsdata []interface{}) {

? ? for _, val := range colsdata {

? ? ? ? switch v := (*(val.(*interface{}))).(type) {

? ? ? ? case nil:

? ? ? ? ? ? fmt.Print("NULL")

? ? ? ? case bool:

? ? ? ? ? ? if v {

? ? ? ? ? ? ? ? fmt.Print("True")

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? fmt.Print("False")

? ? ? ? ? ? }

? ? ? ? case []byte:

? ? ? ? ? ? fmt.Print(string(v))

? ? ? ? case time.Time:

? ? ? ? ? ? fmt.Print(v.Format("2016-01-02 15:05:05.999"))

? ? ? ? default:

? ? ? ? ? ? fmt.Print(v)

? ? ? ? }

? ? ? ? fmt.Print("\t")

? ? }

? ? fmt.Println()

}

二僵朗、效果:

server=localhost;port1433;database=MyTestDB;user id=sa;password=123456xx

region_id? ? provider_id? ? region_name? ? billing_region_name? ? description? ?

1? ? 5? ? us-east-1? ? US-EAST? ? AWS US EAST Data Center? ?

2? ? 5? ? us-west-2? ? US_WEST_OREGON? ? AWS Oregon Data Center? ?

3? ? 5? ? ap-southeast-1? ? ASIA_SIGN? ? AWS Singapore Data Center? ?

4? ? 5? ? ap-southeast-2? ? ASIA_SYDENY? ? AWS Sydney Data Center? ?

5? ? 5? ? ap-northeast-1? ? ASIA_TOKYO? ? AWS Tokyo Data Center? ?

6? ? 5? ? eu-central-1? ? EU_FRANKFURT? ? AWS Frankfurt Data Center? ?

7? ? 5? ? eu-west-1? ? EU_IRELAND? ? AWS Europe Data Center? ?

8? ? 5? ? us-west-1? ? US_WEST_CA? ? AWS CA Data Center? ?

9? ? 5? ? sa-east-1? ? SOUA_SAOP? ? AWS Sao Paulo Data Center? ?

10? ? 5? ? ap-northeast-2? ? ASIA_SEOUL? ? AWS Seoul Data Center? ?

11? ? 5? ? ap-south-1? ? ASIA_MUMBAI? ? AWS Mumbai Data Center? ?

12? ? 2? ? Central US? ? US-CENTRAL? ? Azure Center US Data Center? ?

13? ? 2? ? North Central US? ? US-NORTH-CENTRAL? ? Azure North US Data Center? ?

14? ? 2? ? East US? ? US-EAST? ? Azure East US Data Center? ?

15? ? 2? ? South Central US? ? US-SOUTH-CENTRAL? ? Azure South US Data Center? ?

16? ? 2? ? West US? ? US-WEST? ? Azure West US Data Center? ?

17? ? 2? ? North Europe? ? EUROPE-NORTH? ? Azure North Europe Data Center? ?

18? ? 2? ? West Europe? ? EUROPE-WEST? ? Azure North Europe Data Center? ?

19? ? 2? ? East Asia? ? ASIA-PACIFIC-EAST? ? Azure East Aisa Data Center? ?

20? ? 2? ? Southeast Asia? ? ASIA-PACIFIC-SOUTHEAST? ? Azure Singapore Data Center? ?

21? ? 2? ? Japan East? ? JAPAN-EAST? ? Azure East Japan Data Center? ?

22? ? 2? ? Japan West? ? JAPAN-WEST? ? Azure West Japan Data Center? ?

23? ? 2? ? Brazil South? ? BRAZIL-SOUTH? ? Azure Sao Paulo Data Center? ?

24? ? 2? ? Australia East? ? AUSTRALIA-EAST? ? Azure East Australia Data Center? ?

25? ? 2? ? Australia Southeast? ? AUSTRALIA-SOUTHEAST? ? Azure Southeast Australia Data Center? ?

26? ? 2? ? East US 2? ? US-EAST-2? ? Azure East US Data Center 2? ?

27? ? 2? ? US Gov Virginia? ? USGOV-VIRGINIA? ? Azure US Virginia Government Data Center? ?

28? ? 2? ? US Gov Iowa? ? USGOV-IOWA? ? Azure US Iowa Government Data Center? ?

29? ? 2? ? Canada Central? ? CANADA-CENTRAL? ? Azure Central Canada? ?

30? ? 2? ? Canada East? ? CANADA-EAST? ? Azure East Canada? ?

31? ? 2? ? Germany Central? ? GERMANY-CENTRAL? ? Azure Central Germany? ?

32? ? 2? ? Germany Northeast? ? GERMANY-NORTHEAST? ? Azure Northeast Germany? ?

33? ? 2? ? Korea Central? ? KOREA-CENTRAL? ? Azure Central Korea? ?

34? ? 3? ? China North? ? CN-BEIJING? ? Azure Mooncake Beijing Data Center? ?

35? ? 3? ? China East? ? CN-SHANGHAI? ? Azure Mooncake Shanghai Data Center? ?

36? ? 4? ? cn-hangzhou? ? CN_HANGZHOU? ? Aliyun Hangzhou Data Center? ?

37? ? 4? ? cn-beijing? ? CN_BEIJING? ? Aliyun Beijing Data Center? ?

38? ? 4? ? cn-shenzhen? ? CN_SHENZHEN? ? Aliyun Shenzhen Data Center? ?

39? ? 4? ? cn-qingdao? ? CN_QINGDAO? ? Aliyun Qingdao Data Center? ?

40? ? 4? ? cn-hongkong? ? HONGKONG? ? Aliyun Hong Kong Data Center? ?

41? ? 4? ? us-silicon-valley? ? US-Silicon_Valley? ? Aliyun Silicon Valley Data Center? ?

三纽疟、使用實體實現(xiàn)的方法:

// main.go

package main

import (

? ? "database/sql"

? ? "fmt"

? ? "log"

? ? _ "github.com/denisenkom/go-mssqldb"

)

type AccessRegion struct {

? ? region_id? ? ? ? ? int64

? ? provider_id? ? ? ? int64

? ? region_name? ? ? ? string

? ? sub_region_names? ? string

? ? billing_region_name string

? ? description? ? ? ? string

}

func main() {

? ? var server = "localhost"

? ? var port = 1433

? ? var user = "sa"

? ? var password = "123456xxx"

? ? var database = "MyTestDB"

? ? //連接字符串

? ? connString := fmt.Sprintf("server=%s;port%d;database=%s;user id=%s;password=%s", server, port, database, user, password)

? ? //建立連接

? ? db, err := sql.Open("mssql", connString)

? ? if err != nil {

? ? ? ? log.Fatal("Open Connection failed:", err.Error())

? ? }

? ? defer db.Close()

? ? //通過連接對象執(zhí)行查詢

? ? rows, err := db.Query(`select * from [account_region]`)

? ? if err != nil {

? ? ? ? log.Fatal("Query failed:", err.Error())

? ? }

? ? defer rows.Close()

? ? var rowsData []*AccessRegion

? ? //遍歷每一行

? ? for rows.Next() {

? ? ? ? var row = new(AccessRegion)

? ? ? ? rows.Scan(&row.region_id, &row.provider_id, &row.region_name, &row.billing_region_name, &row.description)

? ? ? ? rowsData = append(rowsData, row)

? ? }

? ? //打印數(shù)組

? ? for _, ar := range rowsData {

? ? ? ? fmt.Print(ar.region_id, "\t", ar.provider_id, "\t", ar.region_name, "\t", ar.billing_region_name, "\t", ar.description)

? ? ? ? fmt.Println()

? ? }

}

四斥滤、使用ODBC的實現(xiàn)方式

// main.go

package main

import (

? ? "database/sql"

? ? "fmt"

? ? "log"

? ? _ "github.com/alexbrainman/odbc"

)

type AccessRegion struct {

? ? region_id? ? ? ? ? int64

? ? provider_id? ? ? ? int64

? ? region_name? ? ? ? string

? ? sub_region_names? ? string

? ? billing_region_name string

? ? description? ? ? ? string

}

func main() {

? ? db, err := sql.Open("odbc", "driver={sql server};server=localhost;port=1433;uid=sa;pwd=123456xxx;database=MyTestDB")

? ? if err != nil {

? ? ? ? fmt.Printf(err.Error())

? ? }

? ? //通過連接對象執(zhí)行查詢

? ? rows, err := db.Query(`select * from [account_region]`)

? ? if err != nil {

? ? ? ? log.Fatal("Query failed:", err.Error())

? ? }

? ? defer rows.Close()

? ? var rowsData []*AccessRegion

? ? //遍歷每一行

? ? for rows.Next() {

? ? ? ? var row = new(AccessRegion)

? ? ? ? rows.Scan(&row.region_id, &row.provider_id, &row.region_name, &row.billing_region_name, &row.description)

? ? ? ? rowsData = append(rowsData, row)

? ? }

? ? //打印數(shù)組

? ? for _, ar := range rowsData {

? ? ? ? fmt.Print(ar.region_id, "\t", ar.provider_id, "\t", ar.region_name, "\t", ar.billing_region_name, "\t", ar.description)

? ? ? ? fmt.Println()

? ? }

}

五烂琴、最終轉(zhuǎn)為Map集合

// main.go

package main

import (

? ? "database/sql"

? ? "fmt"

? ? "log"

? ? _ "github.com/alexbrainman/odbc"

? ? "github.com/demdxx/gocast"

)

func main() {

? ? db, err := sql.Open("odbc", "driver={sql server};server=localhost;port=1433;uid=sa;pwd=123456xxx;database=MyTestDB")

? ? if err != nil {

? ? ? ? fmt.Printf(err.Error())

? ? }

? ? //通過連接對象執(zhí)行查詢

? ? rows, err := db.Query(`select * from [account_region]`)

? ? if err != nil {

? ? ? ? log.Fatal("Query failed:", err.Error())

? ? }

? ? defer rows.Close()

? ? //遍歷每一行

? ? colNames, _ := rows.Columns()

? ? var cols = make([]interface{}, len(colNames))

? ? for i := 0; i < len(colNames); i++ {

? ? ? ? cols[i] = new(interface{})

? ? }

? ? var maps = make([]map[string]interface{}, 0)

? ? for rows.Next() {

? ? ? ? err := rows.Scan(cols...)

? ? ? ? if err != nil {

? ? ? ? ? ? log.Fatal(err.Error())

? ? ? ? }

? ? ? ? var rowMap = make(map[string]interface{})

? ? ? ? for i := 0; i < len(colNames); i++ {

? ? ? ? ? ? rowMap[colNames[i]] = convertRow(*(cols[i].(*interface{})))

? ? ? ? }

? ? ? ? maps = append(maps, rowMap)

? ? }

? ? //打印數(shù)組

? ? for _, rowMap := range maps {

? ? ? ? for k, v := range rowMap {

? ? ? ? ? ? fmt.Print(k, ":", v, "\t")

? ? ? ? }

? ? ? ? fmt.Println()

? ? }

}

func convertRow(row interface{}) interface{} {

? ? switch row.(type) {

? ? case int:

? ? ? ? return gocast.ToInt(row)

? ? case string:

? ? ? ? return gocast.ToString(row)

? ? case []byte:

? ? ? ? return gocast.ToString(row)

? ? case bool:

? ? ? ? return gocast.ToBool(row)

? ? }

? ? return row

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弧械,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子譬挚,更是在濱河造成了極大的恐慌锅铅,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件减宣,死亡現(xiàn)場離奇詭異盐须,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)漆腌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門贼邓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闷尿,你說我怎么就攤上這事塑径。” “怎么了填具?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵统舀,是天一觀的道長。 經(jīng)常有香客問我劳景,道長誉简,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任盟广,我火速辦了婚禮闷串,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筋量。我一直安慰自己窿克,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布毛甲。 她就那樣靜靜地躺著年叮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玻募。 梳的紋絲不亂的頭發(fā)上只损,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音七咧,去河邊找鬼跃惫。 笑死,一個胖子當(dāng)著我的面吹牛艾栋,可吹牛的內(nèi)容都是我干的爆存。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蝗砾,長吁一口氣:“原來是場噩夢啊……” “哼先较!你這毒婦竟也來了携冤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闲勺,失蹤者是張志新(化名)和其女友劉穎曾棕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菜循,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡翘地,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了癌幕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衙耕。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勺远,靈堂內(nèi)的尸體忽然破棺而出橙喘,到底是詐尸還是另有隱情,我是刑警寧澤谚中,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布渴杆,位于F島的核電站寥枝,受9級特大地震影響宪塔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜囊拜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一某筐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冠跷,春花似錦南誊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至橄务,卻和暖如春幔托,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜂挪。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工重挑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棠涮。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓谬哀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親严肪。 傳聞我的和親對象是個殘疾皇子史煎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容