Desktop Functions:

   Smart Device Functions:

Show Recent Changes
Subscribe (RSS)
Misc. Pages
Helpful Tools
Suggested Reading
Website TODO List
Download Visual Studio Add-In

SQLAllocHandle (odbc32)
SQLAllocHandle allocates an environment, connection, statement, or descriptor handle.

C# Signature:

extern static short SQLAllocHandle(ushort HandleType, int InputHandle, out IntPtr OutputHandle);

VB Signature:

Private Declare Auto Function SQLAllocHandle Lib "odbc32.dll" (ByVal HandleType As Short, ByVal InputHandle As IntPtr, ByRef OutputHandle As IntPtr) As Short

User-Defined Types:



HandleType can be one of four values:

public const ushort SQL_HANDLE_ENV = 1;
public const ushort SQL_HANDLE_DBC = 2;
public const ushort SQL_HANDLE_STMT = 3;
public const ushort SQL_HANDLE_DESC = 4;

Tips & Tricks:

Please add some!

Sample Code:

Please add some!

HERE is how to find SQL Server on the LAN. This code is taken from somebody else. I' just a bigginer in this field and I don't understand this the best way:

public class SqlLocator
    private static extern short SQLAllocHandle(short hType, IntPtr inputHandle, out IntPtr outputHandle);
    private static extern short SQLSetEnvAttr(IntPtr henv, int attribute, IntPtr valuePtr, int strLength);
    private static extern short SQLFreeHandle(short hType, IntPtr handle);
    [DllImport("odbc32.dll", CharSet = CharSet.Ansi)]
    private static extern short SQLBrowseConnect(IntPtr hconn, StringBuilder inString,
        short inStringLength, StringBuilder outString, short outStringLength,
        out short outLengthNeeded);

    private const short SQL_HANDLE_ENV = 1;
    private const short SQL_HANDLE_DBC = 2;
    private const int SQL_ATTR_ODBC_VERSION = 200;
    private const int SQL_OV_ODBC3 = 3;
    private const short SQL_SUCCESS = 0;

    private const short SQL_NEED_DATA = 99;
    private const short DEFAULT_RESULT_SIZE = 1024;
    private const string SQL_DRIVER_STR = "DRIVER=SQL SERVER";

    private SqlLocator() { }

    public static string[] GetServers()
        string[] retval = null;
        string txt = string.Empty;
        IntPtr henv = IntPtr.Zero;
        IntPtr hconn = IntPtr.Zero;
        StringBuilder inString = new StringBuilder(SQL_DRIVER_STR);
        StringBuilder outString = new StringBuilder(DEFAULT_RESULT_SIZE);
        short inStringLength = (short)inString.Length;
        short lenNeeded = 0;

        if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_ENV, henv, out henv))
            if (SQL_SUCCESS == SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (IntPtr)SQL_OV_ODBC3, 0))
            if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_DBC, henv, out hconn))
                if (SQL_NEED_DATA == SQLBrowseConnect(hconn, inString, inStringLength, outString,
                DEFAULT_RESULT_SIZE, out lenNeeded))
                if (DEFAULT_RESULT_SIZE < lenNeeded)
                    outString.Capacity = lenNeeded;
                    if (SQL_NEED_DATA != SQLBrowseConnect(hconn, inString, inStringLength, outString,
                    lenNeeded, out lenNeeded))
                    throw new ApplicationException("Unabled to aquire SQL Servers from ODBC driver.");
                txt = outString.ToString();
                int start = txt.IndexOf("{") + 1;
                int len = txt.IndexOf("}") - start;
                if ((start > 0) && (len > 0))
                    txt = txt.Substring(start, len);
                    txt = string.Empty;
        catch (Exception ex)
        //Throw away any error if we are not in debug mode

#if (DEBUG)

        MessageBox.Show(ex.Message, "Acquire SQL Servier List Error");


        txt = string.Empty;
        if (hconn != IntPtr.Zero)
            SQLFreeHandle(SQL_HANDLE_DBC, hconn);
        if (henv != IntPtr.Zero)
            SQLFreeHandle(SQL_HANDLE_ENV, henv);

        if (txt.Length > 0)
        retval = txt.Split(",".ToCharArray());

        return retval;

Alternative Managed API:

Do you know one? Please contribute it!


Please edit this page!

Do you have...

  • helpful tips or sample code to share for using this API in managed code?
  • corrections to the existing content?
  • variations of the signature you want to share?
  • additional languages you want to include?

Select "Edit This Page" on the right hand toolbar and edit it! Or add new pages containing supporting types needed for this API (structures, delegates, and more).

Access directly from VS:
Terms of Use
Edit This Page
Find References
Show Printable Version