鉴于以下 ODBC C API 信息和关联的类型定义,如何从 swift 调用 SQLSetEnvAttr 函数?
从 swift ,我的代码成功调用先决条件 SQLAllocHandle 函数,该函数提供后续使用的环境句柄( henv ) strong> SQLSetEnvAttr 函数调用。
我尝试了各种方法,包括 UnsafeMutablePointer ,试图遵循以下网站上引用的指令,但我无法弄清楚如何让编译器允许我从 Void转换* 到 SQLPOINTER (即使它被定义为相同的东西)。另外,我对如何使 UnsafeMutablePointer 指向我使用的 CUnsignedLong 变量( SQL_OV_ODBC3 typedef)的值感到困惑(设置为 3 )
ODBC API
typedef signed short int SQLSMALLINT;
typedef SQLSMALLINT SQLRETURN;
typedef void * SQLPOINTER;
#define SQL_ATTR_ODBC_VERSION 200
#define SQL_OV_ODBC3 3UL
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER) SQL_OV_ODBC3, 0);
使我能够处理环境的 swift 代码是:
var sqlHenvPtr : UnsafeMutablePointer<SQLHENV> = UnsafeMutablePointer<SQLHENV>.alloc(1)
var retcode : CShort = SQLAllocHandle(Int16(SQL_HANDLE_ENV), nil, sqlHenvPtr)
寻求有关如何定义和传递第三个参数的帮助:
let SQL_ATTR_ODBC_VERSION : Int32 = 200
retcode = SQLSetEnvAttr(sqlHenvPtr.memory, SQL_ATTR_ODBC_VERSION, ???, 0)
非常感谢任何帮助。
答案 0 :(得分:0)
根据Chris的反馈更新
let value = UnsafeMutablePointer<Void>(bitPattern: 3)
SQLSetEnvAttr(0, 0, value, 0)
SQLSetEnvAttr()的预期值为 0x3 (在您的情况下为 0x10025a478 )。我验证了我自己的接受 SQLPOINTER 的原型C函数在建议的方式准备第3个参数的情况下接收 0x3 。希望现在有所帮助。