ODBC in Go返回空/空记录

ODBC in Go返回空/空记录,go,odbc,filemaker,Go,Odbc,Filemaker,我正在尝试通过ODBC将GoRESTAPI连接到基于FileMaker的后端数据库 我已经在Windows上成功安装了FileMaker ODBC驱动程序,DSN正在工作 我正在使用Go中的mgodbc包连接到数据库 然而,当连接工作时(没有运行时错误),我只是在运行查询时返回空/空记录。我有以下代码来创建DB连接: func NewDB(dataSourceName string) (*DB, error) { db, err := sql.Open("mgodbc", dataSo

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

我已经在Windows上成功安装了FileMaker ODBC驱动程序,DSN正在工作

我正在使用Go中的
mgodbc
包连接到数据库

然而,当连接工作时(没有运行时错误),我只是在运行查询时返回空/空记录。我有以下代码来创建DB连接:

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\u 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
,我似乎没有读回任何值。为什么会这样


另外,当我在SQL Server中通过链接服务器连接对FileMaker DB运行查询时,查询肯定会返回值。

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

  • 由于数据类型不匹配/不受支持,驱动程序无法转换查询结果(例如,您在数据库表中将字符串存储为二进制等)。因此,第一次尝试是将结果扫描到[]字节
  • 由于错误,驱动程序无法转换查询结果。尝试使用
  • 因为我们无法使用所讨论的数据库,所以我们不可能重现这个问题。要了解问题所在,请使用调试器。就我个人而言,我正在使用。要设置调试器,请参阅


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

    如果将值扫描到具有
    []字节
    类型的变量中,而不是
    sql.NullString
    ,会得到什么结果?如果我将其更改为
    []字节
    ,并使用相同的print语句,而不使用字符串(
    log.print(p.FirstName)
    ),则数组中没有值,即
    []
    已打印。如果您将驱动程序从
    mgodbc
    更改为(只需更改导入部件),该问题已解决。非常感谢你。如果你能回答这个问题,我很高兴能回答你。如果您能够深入了解
    mgodbc
    驱动程序的错误,那么我就可以了解
    odbc
    驱动程序/
    golang