F# 如何从f使用SQLDriverConnect

F# 如何从f使用SQLDriverConnect,f#,odbc,pinvoke,F#,Odbc,Pinvoke,我正在将一个VB.NET应用程序移植到F作为一个实验。VB程序使用SqlDriverConnection,因此我需要从F调用它。我无法使pinvoke/extern声明正常工作。对SQLDriver connect的调用始终返回-2,SQL\u无效\u句柄,而不是按预期提示连接 有人知道如何让它工作吗 open System open System.Runtime.InteropServices open System.Text [<DllImport("odbc32.dll")>

我正在将一个VB.NET应用程序移植到F作为一个实验。VB程序使用SqlDriverConnection,因此我需要从F调用它。我无法使pinvoke/extern声明正常工作。对SQLDriver connect的调用始终返回-2,SQL\u无效\u句柄,而不是按预期提示连接

有人知道如何让它工作吗

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

我不使用F,但在C中,您可以调用SQLAllocEnv或SQLAllocHandle来创建环境句柄,然后调用SQLSetEnvAttr来设置所需的ODBC版本,然后调用SQLAllocConnect或SQLAllocHandle来分配连接句柄,最后使用连接句柄调用SQLDriverConnection。您的代码似乎正在向SqlDriverConnection传递环境句柄,但SqlDriverConnection需要一个连接句柄,因此SQL\u无效\u句柄。

谢谢,这就解决了问题。一旦我有了连接字符串,我就可以使用.NET ODBC类了。那么你介意将我的答案标记为正确吗?请-更新:哦,你有-对不起。