2017-04-26 166 views
0

我試圖通過ODBC將Go REST API連接到基於後端FileMaker的數據庫。ODBC返回空/空記錄

我在Windows上成功安裝了FileMaker ODBC驅動程序,並且DSN正在運行。

我正在使用Go中的mgodbc軟件包連接到數據庫。

但是,雖然連接有效(無運行時錯誤),但當我運行查詢時,我只是返回空白/空記錄。我有以下代碼來創建一個數據庫連接:

func NewDB(dataSourceName string) (*DB, error) { 

    db, err := sql.Open("mgodbc", dataSourceName) 
    if err != nil { 
     return nil, err 
    } 
    if err = db.Ping(); err != nil { 
     return nil, err 
    } 

    // TEST 

    return &DB{db}, nil 
} 

這會從我的main方法稱爲如下:db, err := md.NewDB("DSN=cet_registrations2;Uid=*****;Pwd=*****;")。然後,我打電話給我的一個查詢方法,並嘗試將其讀入模型struct。我簡化了我的查詢,使其更容易:

func (db *DB) GetStudent(id int) (*Student, error) { 

    s := new(Student) 
    p := new(PersonalDetails) 

    log.Println(id) 

    rows, err := db.Query("SELECT FN_Gn_Pn FROM STUDENTS") 

    i := 0 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer rows.Close() 
    for rows.Next() { 
     i++ 
     err := rows.Scan(&p.FirstName) 
     log.Print(p.FirstName.String) 
     log.Printf(strconv.Itoa(i)) 
     if err != nil { 
      log.Fatal(err) 
     } 
    } 
    err = rows.Err() 
    if err != nil { 
     log.Fatal(err) 
    } 

    s.ID = 34114 
    s.Details = p 

    return s, err 
} 

,我讀成以下struct

import (
    "database/sql" 

    u "sydney.edu.au/bric9018/cet.api/util" 
) 

type PersonalDetails struct { 

    // Unique identifier for person 
    ID int32 `json:"id,omitempty"` 

    // First name of person 
    FirstName sql.NullString `json:"firstName,omitempty"` 

    // Last name of person. 
    LastName sql.NullString `json:"lastName,omitempty"` 

    // Person nominated preferrered name. 
    PreferredName sql.NullString `json:"preferredName,omitempty"` 

    // Person's SSO username for University systems 
    Unikey sql.NullString `json:"unikey,omitempty"` 

    // Person's personal email 
    PersonalEmail sql.NullString `json:"personalEmail,omitempty"` 

    // Sydney University email 
    UniEmail sql.NullString `json:"uniEmail,omitempty"` 

    // Person's date of birth 
    Dob u.NullTime `json:"dob,omitempty"` 
} 

不過,我只是得到完全空白行,當我打印掃描到模型中的價值使用log.Print(p.FirstName.String)。我似乎沒有得到任何值通過掃描回到我的struct。爲什麼是這樣?

P.S.當我在SQL Server中通過鏈接服務器連接對FileMaker數據庫運行時,查詢肯定會返回值。

+0

如果您將該值掃描到具有'[] byte'類型而不是'sql.NullString'的變量,您會得到什麼? – putu

+0

如果將其更改爲'[] byte'並使用不帶字符串的相同打印語句('log.Print(p.FirstName)'),則不會在數組中找到任何值,即打印出[]。 – Ben

+0

如果將驅動程序從'mgodbc'更改爲['odbc'驅動程序](https://github.com/alexbrainman/odbc)(只更改導入部分)? – putu

回答

1

Golang odbc驅動程序是系統的odbc驅動程序(odbc32.dll, unixODBC等)的包裝。如果在SQL Server中執行查詢時得到任何結果,則消除查詢錯誤或系統驅動程序問題的可能性。那麼問題將出現在golang的驅動程序(mgodbc)一側。可能的問題:

  1. 由於不匹配/不支持的數據類型導致驅動程序無法轉換查詢結果(例如,您將字符串作爲二進制等存儲在數據庫表中)。所以第一次嘗試是scan the result to []byte
  2. 由於錯誤導致驅動程序無法轉換查詢結果。嘗試使用another odbc driver

由於問題數據庫不適用於我們,因此我們無法重現該問題。要了解問題所在,請使用調試器。我個人使用Visual Studio Code。要設置調試器,請參考VS Code and delve debugger

我的猜測,問題存在於mgodbc's Next函數(行號781-1011)。 函數的odbc's函數可用here(第35行)。該函數依賴column.Value函數(第116-165行)來轉換查詢結果。使用調試器,您可以觀察變量,表達式並比較這些驅動程序處理查詢結果轉換的方式。