Golang中无法识别C.SQL_C_WCHAR类型的名称

Golang中无法识别C.SQL_C_WCHAR类型的名称 错误:api_unix.go:91:25: 无法确定 C.SQL_C_WCHAR 的名称类型

我的代码:

// +build !windows
// +build cgo

package api

// #cgo darwin LDFLAGS: -ldb2
// #cgo linux LDFLAGS: -ldb2
//#include<sqlcli.h>
import "C"

const (
        SQL_OV_ODBC3 = uintptr(C.SQL_OV_ODBC3)

        SQL_ATTR_ODBC_VERSION = C.SQL_ATTR_ODBC_VERSION

        SQL_DRIVER_NOPROMPT = C.SQL_DRIVER_NOPROMPT

        SQL_HANDLE_ENV  = C.SQL_HANDLE_ENV
        SQL_HANDLE_DBC  = C.SQL_HANDLE_DBC
        SQL_HANDLE_STMT = C.SQL_HANDLE_STMT

        SQL_SUCCESS            = C.SQL_SUCCESS
        SQL_SUCCESS_WITH_INFO  = C.SQL_SUCCESS_WITH_INFO
        SQL_INVALID_HANDLE     = C.SQL_INVALID_HANDLE
        SQL_NO_DATA            = C.SQL_NO_DATA
        SQL_NO_TOTAL           = C.SQL_NO_TOTAL
        SQL_NTS                = C.SQL_NTS
        SQL_MAX_MESSAGE_LENGTH = C.SQL_MAX_MESSAGE_LENGTH
        SQL_NULL_HANDLE        = uintptr(C.SQL_NULL_HANDLE)
        SQL_NULL_HENV          = uintptr(C.SQL_NULL_HENV)
        SQL_NULL_HDBC          = uintptr(C.SQL_NULL_HDBC)
        SQL_NULL_HSTMT         = uintptr(C.SQL_NULL_HSTMT)

        SQL_PARAM_INPUT = C.SQL_PARAM_INPUT

        SQL_NULL_DATA    = C.SQL_NULL_DATA
        SQL_DATA_AT_EXEC = C.SQL_DATA_AT_EXEC

        SQL_UNKNOWN_TYPE    = C.SQL_UNKNOWN_TYPE
        SQL_CHAR            = C.SQL_CHAR
        SQL_NUMERIC         = C.SQL_NUMERIC
        SQL_DECIMAL         = C.SQL_DECIMAL
        SQL_INTEGER         = C.SQL_INTEGER
        SQL_SMALLINT        = C.SQL_SMALLINT
        SQL_FLOAT           = C.SQL_FLOAT
        SQL_REAL            = C.SQL_REAL
        SQL_DOUBLE          = C.SQL_DOUBLE
        SQL_DATETIME        = C.SQL_DATETIME
        SQL_DATE            = C.SQL_DATE
        SQL_TIME            = C.SQL_TIME
        SQL_VARCHAR         = C.SQL_VARCHAR
        SQL_TYPE_DATE       = C.SQL_TYPE_DATE
        SQL_TYPE_TIME       = C.SQL_TYPE_TIME
        SQL_TYPE_TIMESTAMP  = C.SQL_TYPE_TIMESTAMP
        SQL_TIMESTAMP       = C.SQL_TIMESTAMP
        SQL_LONGVARCHAR     = C.SQL_LONGVARCHAR
        SQL_BINARY          = C.SQL_BINARY
        SQL_VARBINARY       = C.SQL_VARBINARY
        SQL_LONGVARBINARY   = C.SQL_LONGVARBINARY
        SQL_BIGINT          = C.SQL_BIGINT
        SQL_TINYINT         = C.SQL_TINYINT
        SQL_BIT             = C.SQL_BIT
        SQL_WCHAR           = C.SQL_WCHAR
        SQL_WVARCHAR        = C.SQL_WVARCHAR
        SQL_WLONGVARCHAR    = C.SQL_WLONGVARCHAR
        SQL_GUID            = C.SQL_GUID
        SQL_BLOB            = C.SQL_BLOB
        SQL_CLOB            = C.SQL_CLOB
        SQL_SIGNED_OFFSET   = C.SQL_SIGNED_OFFSET
        SQL_UNSIGNED_OFFSET = C.SQL_UNSIGNED_OFFSET

        // TODO(lukemauldin): Not defined in sqlext.h. Using windows value, but it is not supported.
        SQL_SS_XML = -152

        SQL_C_CHAR           = C.SQL_C_CHAR
        SQL_C_LONG           = C.SQL_C_LONG
        SQL_C_SHORT          = C.SQL_C_SHORT
        SQL_C_FLOAT          = C.SQL_C_FLOAT
        SQL_C_DOUBLE         = C.SQL_C_DOUBLE
        SQL_C_NUMERIC        = C.SQL_C_NUMERIC
        SQL_C_DATE           = C.SQL_C_DATE
        SQL_C_TIME           = C.SQL_C_TIME
        SQL_C_TYPE_TIMESTAMP = C.SQL_C_TYPE_TIMESTAMP
        SQL_C_TIMESTAMP      = C.SQL_C_TIMESTAMP
        SQL_C_BINARY         = C.SQL_C_BINARY
        SQL_C_BIT            = C.SQL_C_BIT
        SQL_C_DEFAULT        = C.SQL_C_DEFAULT
        SQL_C_SBIGINT        = C.SQL_C_SBIGINT
        SQL_C_UBIGINT        = C.SQL_C_UBIGINT
        SQL_C_GUID           = C.SQL_C_GUID
        SQL_C_WCHAR          = C.SQL_C_WCHAR

        SQL_COMMIT   = C.SQL_COMMIT
        SQL_ROLLBACK = C.SQL_ROLLBACK

        SQL_AUTOCOMMIT         = C.SQL_AUTOCOMMIT
        SQL_ATTR_AUTOCOMMIT    = C.SQL_ATTR_AUTOCOMMIT
        SQL_AUTOCOMMIT_OFF     = C.SQL_AUTOCOMMIT_OFF
        SQL_AUTOCOMMIT_ON      = C.SQL_AUTOCOMMIT_ON
        SQL_AUTOCOMMIT_DEFAULT = C.SQL_AUTOCOMMIT_DEFAULT

        SQL_IS_UINTEGER = C.SQL_IS_UINTEGER

        //Connection pooling
        SQL_ATTR_CONNECTION_POOLING = C.SQL_ATTR_CONNECTION_POOLING
        SQL_ATTR_CP_MATCH           = C.SQL_ATTR_CP_MATCH
        SQL_CP_OFF                  = uintptr(C.SQL_CP_OFF)
        SQL_CP_ONE_PER_DRIVER       = uintptr(C.SQL_CP_ONE_PER_DRIVER)
        SQL_CP_ONE_PER_HENV         = uintptr(C.SQL_CP_ONE_PER_HENV)
        SQL_CP_DEFAULT              = SQL_CP_OFF
        SQL_CP_STRICT_MATCH         = uintptr(C.SQL_CP_STRICT_MATCH)
        SQL_CP_RELAXED_MATCH        = uintptr(C.SQL_CP_RELAXED_MATCH)
)

type (
        SQLHANDLE C.SQLHANDLE
        SQLHENV   C.SQLHENV
        SQLHDBC   C.SQLHDBC
        SQLHSTMT  C.SQLHSTMT
        SQLHWND   uintptr

        SQLWCHAR     C.SQLWCHAR
        SQLSCHAR     C.SQLSCHAR
        SQLSMALLINT  C.SQLSMALLINT
        SQLUSMALLINT C.SQLUSMALLINT
        SQLINTEGER   C.SQLINTEGER
        SQLUINTEGER  C.SQLUINTEGER
        SQLPOINTER   C.SQLPOINTER
        SQLRETURN    C.SQLRETURN

        SQLLEN  C.SQLLEN
        SQLULEN C.SQLULEN
)

我不明白为什么它只找不到那个变量。

谢谢


更多关于Golang中无法识别C.SQL_C_WCHAR类型的名称的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

该文件存在于 <sqlcli1.h> 中,我已包含该文件。现在可以正常工作了。

谢谢。

更多关于Golang中无法识别C.SQL_C_WCHAR类型的名称的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


引用 akhilravuri: SQL_C_WCHAR

据我所知,WCHAR 是微软特有的东西,我不确定非 Windows 平台是否支持。

这个错误是因为在非Windows平台上,SQL_C_WCHAR可能没有在ODBC头文件中定义。在Unix-like系统(如Linux和Darwin)中,ODBC实现可能不包含宽字符类型的定义,或者定义方式与Windows不同。

检查你的sqlcli.h头文件,确认SQL_C_WCHAR是否存在。如果不存在,你需要手动定义它。根据ODBC规范,SQL_C_WCHAR的值通常是-8

以下是修复代码的示例:

// +build !windows
// +build cgo

package api

// #cgo darwin LDFLAGS: -ldb2
// #cgo linux LDFLAGS: -ldb2
//#include<sqlcli.h>
import "C"

const (
        // 其他常量定义...
        
        // 如果SQL_C_WCHAR在头文件中未定义,手动指定值
        SQL_C_WCHAR = -8
        
        // 其他常量定义...
)

如果头文件中确实缺少这个定义,你还可以在C代码部分添加定义:

// +build !windows
// +build cgo

package api

// #cgo darwin LDFLAGS: -ldb2
// #cgo linux LDFLAGS: -ldb2
/*
#include<sqlcli.h>
#ifndef SQL_C_WCHAR
#define SQL_C_WCHAR (-8)
#endif
*/
import "C"

const (
        SQL_C_WCHAR = C.SQL_C_WCHAR
        // 其他常量...
)

检查你的ODBC驱动文档,确认SQL_C_WCHAR的正确值,因为不同驱动可能有不同的实现。

回到顶部