F# 如何从f使用SQLDriverConnect
我正在将一个VB.NET应用程序移植到F作为一个实验。VB程序使用SqlDriverConnection,因此我需要从F调用它。我无法使pinvoke/extern声明正常工作。对SQLDriver connect的调用始终返回-2,SQL\u无效\u句柄,而不是按预期提示连接 有人知道如何让它工作吗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")>
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类了。那么你介意将我的答案标记为正确吗?请-更新:哦,你有-对不起。