我正在将一个VB.NET应用程序移植到F#作为实验。 VB程序使用SQLDriverConnect,所以我需要从F#调用它。我无法让pinvoke / extern声明正常工作。对SQLDriver连接的调用始终返回-2,SQL_INVALID_HANDLE,而不是按预期提示连接。
有人知道如何让它发挥作用吗?
open System
open System.Runtime.InteropServices
open System.Text
[<DllImport("odbc32.dll")>]
extern Int16 SQLAllocEnv(IntPtr& EnvironmentHandle);
[<DllImport("odbc32.dll")>]
extern Int16 SQLDriverConnect(IntPtr hdbc, IntPtr hwnd, string szConnStrIn,
Int16 cbConnStrIn, StringBuilder szConnStrOut,
Int16 cbConnStrOutMax, Int16& pcbConnStrOut,
UInt16 fDriverCompletion)
let getConnectionString () =
let SQL_DRIVER_PROMPT = 2us
let mutable henv = IntPtr(0)
let mutable csLen = 0s
let rc1 = SQLAllocEnv &henv
assert (rc1 = 0s)
let csOut = new StringBuilder(1024)
let rc2 = SQLDriverConnect(henv, IntPtr.Zero, "", 0s, csOut, 1024s, &csLen, SQL_DRIVER_PROMPT)
assert (rc2 = 0s)
csOut.ToString()
[<EntryPoint>]
let main argv =
printfn "Connection string: %s" (getConnectionString())
0 // return an integer exit code
答案 0 :(得分:0)
我不做F#但是在C中调用SQLAllocEnv(或SQLAllocHandle)来创建环境句柄,然后调用SQLSetEnvAttr来设置所需的ODBC版本,然后SQLAllocConnect(或SQLAllocHandle)来分配连接句柄和最后用连接句柄调用SQLDriverConnect。您的代码看起来要将环境句柄传递给SQLDriverConnect,但SQLDriverConnect需要一个连接句柄,因此SQL_INVALID_HANDLE。