Go中的ODBC返回空/空记录

时间:2017-04-26 05:14:20

标签: go odbc filemaker

我正在尝试通过ODBC将Go REST API连接到基于FileMaker的后端数据库。

我已经在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 DB的链接服务器连接运行它时,查询肯定会返回值。

1 个答案:

答案 0 :(得分:1)

Golang odbc驱动程序是系统的odbc驱动程序(odbc32.dll, unixODBC等)的包装器。如果在SQL Server中执行查询时得到任何结果,则可以消除查询错误或系统驱动程序问题的可能性。然后问题出在golang的驱动程序(mgodbc)方面。可能的问题:

  1. 由于不匹配/不支持的数据类型,驱动程序无法转换查询结果(例如,您将数据库表中的字符串存储为二进制等)。所以第一次尝试是scan the result to []byte
  2. 由于bug,驱动程序无法转换查询结果。尝试使用another odbc driver
  3. 由于我们无法使用相关数据库,因此我们无法重现问题。要了解问题所在,请使用调试器。就个人而言,我正在使用Visual Studio Code。要设置调试器,请参阅VS Code and delve debugger

    我的猜测,问题存在于mgodbc's Next函数中(行号781-1011)。 odbc's函数的Next实现可用here(第35行)。该函数依赖于column.Value函数(第116-165行)来转换查询结果。使用调试器,您可以观察变量,表达式并比较这些驱动程序如何处理查询结果转换。