如何从f#中使用SQLDriverConnect

时间:2014-09-15 18:10:23

标签: f# odbc pinvoke

我正在将一个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

1 个答案:

答案 0 :(得分:0)

我不做F#但是在C中调用SQLAllocEnv(或SQLAllocHandle)来创建环境句柄,然后调用SQLSetEnvAttr来设置所需的ODBC版本,然后SQLAllocConnect(或SQLAllocHandle)来分配连接句柄和最后用连接句柄调用SQLDriverConnect。您的代码看起来要将环境句柄传递给SQLDriverConnect,但SQLDriverConnect需要一个连接句柄,因此SQL_INVALID_HANDLE。